Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

       

        随着基于地理位置的服务(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中空间数据类型的组织结构关系:


其中,黄色框表示不可实例化,蓝色框表示可以实例化。箭头表示其它类型均继承自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_CoversST_Contains类似,唯一的不同在于前者不要求有相交的内部点,因此点在边界上也是可以的。



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),虽然是同一条线段,但是点给出的顺序不同,所以不一致。




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返回一个对象的包围盒,由一个矩形定义。其中包围盒的概念请查阅计算几何的相关内容。



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%...,请勿用于任何商业用途。

Labels in this area