空间数据库MySpatial VS PostGIS

297 阅读7分钟

安装使用

  MY SPATIAL无需安装,默认的MySQL配置就能使用空间数据类型;
  POSTGIS使用需要基于PostgreSQL安装拓展包。

空间数据类型

1、  POSTGIS有丰富的几何类型,支持多种OpenGIS Geometry Model,并且POSTGIS还基于地理坐标系提供了Geography数据类型。
postgis.jpg   Geometry是一种基本的空间数据类型,基于二维笛卡尔坐标系-Cartesian Coordinate System(平面坐标系,投影坐标系)的;
  Geography数据类型基于大地坐标系对经纬度坐标(也称为地理坐标)数据提供支持,地理坐标是用角度单位表示的球面坐标。
2、  MY SPATIAL只支持了OpenGIS Geometry Model的一个子集,目前支持的空间数据类型有4种,分别是POINT(点)、LINESTRING(线)、POLYGON(多边形)、GEOMETRY(几何图形集合)。
3、  MY SPATIALPOSTGIS均支持WKTWKB标准的数据插入。WKT(well-known text)和WKB(well-known binary)是OGC(放地理空间信息联盟, Open Geospatial Consortium)制定的空间数据的组织规范,WKT是以文本形式描述,WKB是以二进制形式描述。

对于空间坐标点(1,1)的表示方式 
WKT Point(1 1) 
WKB 0101000000000000000000F03F000000000000F03F 
WKB二进制字段说明: 
    Byte order : 01 
    WKB type : 01000000 
    X : 000000000000F03F 
    Y : 000000000000F03F 
    byte order要么为0,要么为10为使用little-endian编码(NDR),1为使用big-endian编码(XDR) 
    WKB type 是几何类型,在wkbGeometryType中定义. 值为1-7,分别对应 Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, and GeometryCollection. 
    x,y为点的坐标值,为double类型。 

函数支持比对

1、POSTGIS支持OGC标准函数相对完善,MY SPATIAL目前止支持部分函数;
2、插入查询WKTWKB格式数据函数方法相似

MySQL 
mysql> CREATE TABLE test (geom GEOMETRY); 
# WKT格式 INSERT INTO test VALUES (ST_GeomFromText('POINT(1 1)')) SELECT ST_AsText(geom) FROM test; 
# WKB格式 INSERT INTO test VALUES (ST_GeomFromWKB(X'0101000000000000000000F03F000000000000F03F')); SELECT ST_AsBinary(geom) FROM test; 
PostGIS 
CREATE TABLE test (geom GEOMETRY(Geomtery)); 
# WKT格式 INSERT INTO test VALUES (ST_GeomFromText('POINT(1 1)',4326)); SELECT ST_AsText(geom) FROM test; 
# WKB格式 INSERT INTO test VALUES (ST_GeomFromWKB(X'0101000000000000000000F03F000000000000F03F',4326)); select ST_AsEWKB(geom) FROM test 

3、MySQL5.7版本后,引入GeoHash与GeoJson,支持函数明细参考官方空间函数支持; 4、计算几何图形间距离, MySQL仅支持点与点之间的距离运算,POSTGIS也支持点线之间的距离运算; MySQL5.7版本之前只支持基于二维笛卡尔坐标系进行运算:

mysql> SET @g1 = Point(1,1); 
mysql> SET @g2 = Point(2,2); 
mysql> SELECT ST_Distance(@g1, @g2); 
+-----------------------+ 
| ST_Distance(@g1, @g2) | 
+-----------------------+ 
| 1.4142135623730951 | 
+-----------------------+ 

    MySQL8.0版本后支持将坐标解析成经纬度点,距离计算单位为米;srid设置为4326, 将地球将映射到 WGS84 空间引用系统,表示为一个椭球体(一个具有略微缩短的南北轴的球体):

mysql> SET @g1 = ST_GeomFromText('POINT(1 1)', 4326); 
mysql> SET @g2 = ST_GeomFromText('POINT(2 2)', 4326); 
mysql> SELECT ST_Distance(@g1, @g2); 
+-----------------------+ 
| ST_Distance(@g1, @g2) | 
+-----------------------+ 
| 156874.3859490455 | 
+-----------------------+ 

    POSTGIS通过设置数据类型为Gepgraphy进行距离运算:

SELECT ST_Distance( 
    ST_GeographyFromText('LINESTRING(-118.4079 33.9434, 2.5559 49.0083)'), -- LAX-CDG 
    ST_GeographyFromText('POINT(-22.6056 63.9850)') -- Iceland (KEF) 
); 

6、计算几何图形包含关系,My SPATALPOSTGIS均支持ST_Contains()与ST_Within()函数。(eg:ST_Contains( g1 , g2 ),判断个g1图形是否包含g2图形,包含则返回True, 反则返回false。ST_Within()包含含义与之相反);

空间索引

  空间索引相比标准数据库索引基于某个列的值创建层次结构树来说略有不同:它们不能索引几何要素本身,而是索引几何要素的边界框。
  R-Tree空间索引,将数据分解为矩形(rectangle)、子矩形(sub-rectangle)和子-子矩形(sub-sub rectangle)等。它是一种可自动处理可变数据的密度和对象大小的自调优(self-tuning)索引结构。R-Tree其存储的记录类型是该空间数据所能表示的最小边界的矩形,简称MBR(Minimum bounding rectangle)。
R-Tree构建
  每一个叶子结点中的单元(I, tuple-identifier),I为包含所有子结点的最小包含矩形(MBR),tuple-identifier是指向存储记录的指针。
  每一个非叶子结点单元(I, child -pointer)I是包含子结点的最小矩形MBR,child-pointer是指向子结点的指针。通过该指针逐层递归,可以访问到叶子结点。
R_tree.jpg 查询流程简述
  假设T为一颗R树的根节点,查找所有搜索矩形S覆盖的记录 1、查找子树:如果T是非叶子节点,且T对应的矩形与S有重合,那么检查所有T中存储的记录,在T的子树中继续执行搜索操作 2、查找叶子节点:如果T是叶子节点,且T所对应的矩形与S有重合,那么直接检查T所指向的所有记录,返回符合条件的记录。
查找示例如下
  阴影部分是搜索矩形区域,他与根节点对应的最大矩形有重叠,因此搜索操作会作用在其两个子树上,两个子树对应的矩形分别为R1与R2,搜索R1,发现与R1中的R4有重叠,继续搜索R4,最终在R4所包含的R11与R12两个矩形中查找是否有符合条件的记录。搜索R2的过程类似。
MY SPATIAL
  MySQL采用的即是R-Tree空间索引结构,5.7版本前只有MyISAM引擎支持空间索引,5.7版本开始新增InnoDB支持。但只支持定义一个空间数据类型的列,且作为空间索引的键值的列必须显式定义为NOT NULL。

CREATE SPATIAL INDEX geom_idx ON test (geom); 

POSTGIS
  PostgreSQL中的R-Tree实现有缺陷,在GiST框架内实现了R-tree索引,相当于R-tree变种。

CREATE INDEX geom_idx ON geom USING GIST (geom); 

功能对比

功能MY SPATIALPOSTGIS
空间数据二维数据二维、三维数据
空间索引R-tree(仅MyIASM、InnoDB支持)GIST
空间操作函数部分OGC标准定义的操作函数基本实现OGC标准定义的操作函数
事务操作InnoDB上支持完整的事务特性提供了一系列的长事务支持

PS

1、目前MySQL中支持的空间坐标系统没有GCJ-02BD09等国内坐标系,默认使用WGS84地球坐标系,所以在创建几何对象时输入的坐标值尽量使用WGS84坐标,以避免误差。
  WGS84:World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统;
  GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统,由WGS84坐标系经经纬度数据的加密算法中加入随机的偏差生成,又名火星坐标系;
  BD09坐标系:即百度坐标系,在GCJ-02坐标系上再次加密后的坐标系。
2、MySQL中的计算距离,长度,面积等绝对数值的空间计算函数(area(), st_distance())存在一定的误差,尽量不要使用。
3、如果只做一些简单的GIS或者LBS(Location Based Services,基于位置的服务)的应用,MY SPATIAL基本能够满足。但如果需要的功能更复杂一些,MY SPATIAL提供的功能可能就不够用了,这时POSTGIS可能将更加合适。