随着基于地理位置的服务(LBS)以及地理信息系统(GIS)的兴起和热门,传统的关系型数据库也相应需要适应这种改变,除了基本的数值、文本、二进制等类型,现代数据库也支持存储几何数据类型信息(点、线、面等)并进行高效的距离运算、判断位置关系等操作。SAP HANA作为一个列存储的内存数据库,对于空间数据类型也提供了自己的支持和相应的实现。下面我们就来看一下SAP HANA中的空间数据类型以及可以执行的基本操作,希望对大家在利用SAP HANA从事基于地理位置信息的应用相关开发时有所帮助。需要注意的是,SAP HANASP7版本才开始提供对空间数据存储和操作的支持,因此如果你使用的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中空间数据类型的组织结构关系:


/wp-content/uploads/2014/04/1_423599.png

其中,黄色框表示不可实例化,蓝色框表示可以实例化。箭头表示其它类型均继承自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返回对象的二进制表示


/wp-content/uploads/2014/04/2_423600.png


ST_AsGeoJSON返回对象的GeoJSON表示,其中GeoJSON标准基于JSON定义了空间数据的JSON格式,请参考http://geojson.org/geojson-spec.html


/wp-content/uploads/2014/04/3_423601.png


ST_AsText 返回对象的普通文本表示,这样可以便于提取数据进行一些文本处理。


/wp-content/uploads/2014/04/4_423608.png


其它函数请参考SAP_HANA_Spatial_Reference文档。


  • (2) 从其它格式构建空间数据类型对象

ST_GeomFromEWKB

ST_GeomFromEWKT

ST_GeomFromText

ST_GeomFromWKB

ST_GeomFromWKT

ST_GeomFromEWKB从一个二进制数值表示构建几何对象,而ST_GeomFromEWKT从普通文本表示构建几何对象,如

/wp-content/uploads/2014/04/5_423609.png

关于其它方法的具体使用请参考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


/wp-content/uploads/2014/04/6_423610.png


/wp-content/uploads/2014/04/7_423611.png


ST_CoversST_Contains类似,唯一的不同在于前者不要求有相交的内部点,因此点在边界上也是可以的。


/wp-content/uploads/2014/04/8_423612.png


ST_Crosses 判断两个对象是否交叉。

ST_Equals判断两个对象是否空间上相等。

ST_Intersection判断两个对象的相交区域,可能是多边形、线段或者点。

ST_Intersects判断两个对象是否有交点,如果有返回1,否则返回0

ST_IntersectsRectST_Intersects差不多,除了它主要用于判断和矩形是否有交点,可以算ST_Intersects的一种特殊情况。

ST_OrderingEquals判断两个对象是否按照点的顺序完全一致。比如两条线段,一条起点(0, 0),终点(1, 0),另一条起点(1, 0),终点(0, 0),虽然是同一条线段,但是点给出的顺序不同,所以不一致。


/wp-content/uploads/2014/04/9_423613.png



/wp-content/uploads/2014/04/10_423617.png

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,任何空对象的维度为-1ST_Distance返回两个对象间的最小距离,基本上就是构成几何对象的点之间的最短距离。

ST_Envelope返回一个对象的包围盒,由一个矩形定义。其中包围盒的概念请查阅计算几何的相关内容。


/wp-content/uploads/2014/04/11_423618.png


ST_GeometryType用于返回一个对象的类型信息,其中返回值是除ST_GEOMETRY之外的其它类型名。如


/wp-content/uploads/2014/04/12_423623.png


ST_Is3D判断几何对象中的点是否有z坐标,即是否是3维空间对象。

ST_IsValid判断一个几何对象是否合法,比如共线的3个点无法构成多边形等。ST_IsValid可以判断数据的合法性。如多边形的边之间不能相交,因此不是合法的多边形。


/wp-content/uploads/2014/04/13_423624.png


其它方法的具体用法请查看文档说明。




在这一篇日志里,我们介绍了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,请勿用于任何商业用途。

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply