SAP HANA空间数据类型及基本操作(1)
随着基于地理位置的服务(LBS)以及地理信息系统(GIS)的兴起和热门,传统的关系型数据库也相应需要适应这种改变,除了基本的数值、文本、二进制等类型,现代数据库也支持存储几何数据类型信息(点、线、面等)并进行高效的距离运算、判断位置关系等操作。SAP HANA作为一个列存储的内存数据库,对于空间数据类型也提供了自己的支持和相应的实现。下面我们就来看一下SAP HANA中的空间数据类型以及可以执行的基本操作,希望对大家在利用SAP HANA从事基于地理位置信息的应用相关开发时有所帮助。需要注意的是,SAP HANA从SP7版本才开始提供对空间数据存储和操作的支持,因此如果你使用的SAP HANA版本低于7.0,需要升级才能测试本文中的内容。本文的测试案例所使用的SAP HANA版本为SAP HANA SPS7 Revision 70.00。
1. SAP HANA 支持的空间数据类型
SAP HANA支持如下几种基本数据类型
类型名称 |
SAP HANA中的名称 |
描述 |
Geometries |
ST_Geometry |
最基本的类型,是其它所有类型的抽象父类,不可以被实例化 |
Points |
ST_Point |
点类型,用于描述空间中的一个位置,点没有大小、长度、面积,可以是二维或者三维的;GIS中通常用于表示一个特定的位置 |
Multipoints |
ST_MultiPoint |
用于表示多个点构成的集合,可表示多个位置 |
Linestrings |
ST_LineString |
用于表示多条线段构成的折线;性质包括是否是简单的和封闭的,如果折线没有和自身交叉则是简单的,如果折线的首尾端点重合则是封闭的 |
Multilinestring |
ST_MultiLineString |
用于表示多条折线构成的集合 |
Polygons |
ST_Polygon |
由多个顶点定义拥有内部区域的多边形 |
Multipolygons |
ST_MultiPolygon |
用于表示多个多边形构成的集合 |
类似于面向对象编程,数据类型是分层组织的:处于顶层的是ST_Geometry,它成为其它所有类型的抽象父类且不能实例化,即列类型可定义为ST_Geometry,但只能存储子类型的对象,因为没有构造ST_Geometry对象的方法;另一方面,虽然不能实例化ST_Geometry类型,但可以调用它的方法,而且其它继承ST_Geometry的类型均继承了ST_Geometry的方法,并且其它类型也有自己独特的方法可供调用。下图示例了SAP HANA中空间数据类型的组织结构关系:
其中,黄色框表示不可实例化,蓝色框表示可以实例化。箭头表示其它类型均继承自ST_Geometry类型。
类似于面向对象编程,关于SAP HANA中的空间数据类型,也有以下几点需要注意的地方:
- (1) 子类型继承了父类型的所有方法,因此ST_Point的对象可以调用ST_Geometry的所有方法。
- (2) 需要时,子类型可以被自动转换为父类型。
- (3) 定义为父类型的列可以存储所有子类型的数据,比如定义为ST_Geometry的列可以存储ST_Point类型和所有其它类型的数据。
- (4) 父类型可以类型转换到子类型,如果存储的实际数据是某个子类型的,以方便调用子类型特有的方法。
2. SAP HANA支持的空间数据操作
支持的基本空间数据操作包括:计算距离、两个几何对象求交、判断两个几何对象的空间位置关系(是否一个包含另一个,是否相交等)等,我们将在下面介绍每种数据类型时详细介绍其具体支持的操作。
2.1 ST_Geometry
ST_Geometry是其它所有类型的父类型,它包含的方法可以被其它类型所调用,但它没有自己的构造函数,也就是说不可以构造ST_Geometry对象,其方法如下所示:
ST_AsBinary ST_AsEWKB ST_AsEWKT ST_AsGeoJSON ST_AsText ST_AsWKB ST_AsWKT ST_Buffer ST_Contains ST_ConvexHull ST_Crosses ST_Dimension ST_Distance ST_Envelope ST_Equals ST_GeomFromEWKB ST_GeomFromEWKT ST_GeomFromText ST_GeomFromWKB ST_GeomFromWKT ST_GeometryType ST_Intersection ST_Intersects ST_IntersectsRect ST_Is3D ST_IsEmpty ST_IsValid ST_OrderingEquals ST_SRID ST_SnapToGrid ST_WithinDistance ST_Within ST_XMax ST_XMin ST_YMax ST_YMin ST_ZMax ST_ZMin |
我们可以把这些方法做一些分类:
- (1) 转换到其它格式
ST_AsEWKT ST_AsGeoJSON ST_AsText ST_AsWKB ST_AsWKT |
ST_As*()返回对象的各种不同表示:普通文本、二进制、JSON等。比如,ST_AsBinary返回对象的二进制表示
ST_AsGeoJSON返回对象的GeoJSON表示,其中GeoJSON标准基于JSON定义了空间数据的JSON格式,请参考http://geojson.org/geojson-spec.html。
ST_AsText 返回对象的普通文本表示,这样可以便于提取数据进行一些文本处理。
其它函数请参考SAP_HANA_Spatial_Reference文档。
- (2) 从其它格式构建空间数据类型对象
ST_GeomFromEWKB ST_GeomFromEWKT ST_GeomFromText ST_GeomFromWKB ST_GeomFromWKT |
ST_GeomFromEWKB从一个二进制数值表示构建几何对象,而ST_GeomFromEWKT从普通文本表示构建几何对象,如
关于其它方法的具体使用请参考SAP_HANA_Spatial_Reference_en文档。
- (3) 空间位置判断
用于判断对象间的空间位置关系,如包含、相交等。
ST_Contains ST_Crosses ST_Equals ST_Intersection ST_Intersects ST_IntersectsRect ST_Is3D ST_IsEmpty ST_IsValid ST_OrderingEquals ST_WithinDistance ST_Within |
ST_Contains判断调用对象是否完全包含参数对象,注意:完全包含的含义是参数对象在调用对象的内部,即使在边界上也不可以,并且参数对象的至少一个内部点在调用对象内部。如果完全包含,则函数返回1,否则返回0。比如我们定义一个边长为2,四个点分别在(0, 0), (2, 0), (2, 2), (0, 2)的正方形,点(1, 1)显然在正方形内部,因此ST_Contains应返回1,点(0, 1)在正方形边界上,因此返回0。
ST_Covers和ST_Contains类似,唯一的不同在于前者不要求有相交的内部点,因此点在边界上也是可以的。
ST_Crosses 判断两个对象是否交叉。
ST_Equals判断两个对象是否空间上相等。
ST_Intersection判断两个对象的相交区域,可能是多边形、线段或者点。
ST_Intersects判断两个对象是否有交点,如果有返回1,否则返回0。
ST_IntersectsRect和ST_Intersects差不多,除了它主要用于判断和矩形是否有交点,可以算ST_Intersects的一种特殊情况。
ST_OrderingEquals判断两个对象是否按照点的顺序完全一致。比如两条线段,一条起点(0, 0),终点(1, 0),另一条起点(1, 0),终点(0, 0),虽然是同一条线段,但是点给出的顺序不同,所以不一致。
ST_WithinDistance判断两个对象是否相距在给定距离之内。依据的距离函数就是ST_Distance。
ST_Within判断一个对象是否从空间上包含于另一个对象之内,它和ST_Contains刚好是相反的。
- (4) 数值及属性计算函数
主要用于计算对象的一些相关属性和数值等。包括
ST_ConvexHull ST_Dimension ST_Distance ST_Envelope ST_GeometryType ST_Is3D ST_IsEmpty ST_IsValid |
ST_ConvexHull用于计算一个多边形的凸包,关于凸包的概念请参考计算几何的相关内容。ST_Dimension返回一个对象的维度信息。其中,点的维度是0,线的维度是1,多边形的维度是2,任何空对象的维度为-1。ST_Distance返回两个对象间的最小距离,基本上就是构成几何对象的点之间的最短距离。
ST_Envelope返回一个对象的包围盒,由一个矩形定义。其中包围盒的概念请查阅计算几何的相关内容。
ST_GeometryType用于返回一个对象的类型信息,其中返回值是除ST_GEOMETRY之外的其它类型名。如
ST_Is3D判断几何对象中的点是否有z坐标,即是否是3维空间对象。
ST_IsValid判断一个几何对象是否合法,比如共线的3个点无法构成多边形等。ST_IsValid可以判断数据的合法性。如多边形的边之间不能相交,因此不是合法的多边形。
其它方法的具体用法请查看文档说明。
在这一篇日志里,我们介绍了SAP HANA支持的几种空间数据类型以及相关操作,以及这几种类型的层次结构。接下来我们对最基础的ST_Geometry类型进行了详细介绍,主要讨论了它支持的各种方法。在下一篇日志里,我们会对其它几种数据类型及支持的方法进行详尽的讨论。
想获取更多SAP HANA学习资料或有任何疑问,请关注新浪微博@HANAGeek!我们欢迎你的加入!
转载本文章请注明作者和出处http://scn.sap.com/community/chinese/hana/blog/2014/04/02/sap-hana%E7%A9%BA%E9%97%B4%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%8F%8A%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C,请勿用于任何商业用途。