
探索和学习MySQL中GIS相关功能和特性
这里记录了学习和了解MySQL中GIS特性相关内容的过程。
MySQL官方论坛中GIS的举例
测试数据已经导入成功,下面开始对GIS相关函数和GEOHASH进行了解和体验;
mysql中geometry类型的简单使用
MySQL空间数据类型
经纬度信息存储在geometry格式的字段中,该字段必须非空。
MySQL8.0前按照longitude-latitude的顺序存储位置
MySQL8.0前按照longitude-latitude的顺序存储位置
MySQL8.0前按照longitude-latitude的顺序存储位置
插入数据时候可使用如下语句:
MySQL存储geometry信息的方式采用了25bytes,相比WKB的21bytes,多了4bytes的坐标系表示,组成部分如下:
WTF字符串格式说明
select ST_GeomFromText(WTF格式字符串)
WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。通过WTF字符串生成geometry的方法:
点: POINT(x y)
线: LINESTRING(x1 y1, x2 y2, x3 y3...)
多边形: POLYGON((0 0, 10 0, 10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))
多点集: MULTIPOINT(0 0, 20 20, 60 60) 或 MULTIPOINT((0 0),(5 5),(5 0))
多线集: MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
多多边形集: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
例如两点一线组成的几何集: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
A geometry is syntactically well-formed if it satisfies conditions such as those in this (nonexhaustive) list:
Collections are not empty (except GeometryCollection)
更多内容参见
ST_PointFromText('POINT(X Y)')
ST_LineStringFromText('LINESTRING(0 0,1 1,2 2)')
ST_PolygonFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7,5 5))')
ST_GeomCollFromText()
更多内容参见
参见
Point(x,y)
LineString((x1,y1),(x2,y2)...)
Polygon(LineString(),LineString()....)
参见
ST_AsText()
ST_AsBinary()
ST_AsWKT()
参见
ST_Dimension(geom) :返回geom的维度(-1,0,1,2)
ST_Envelope(geom) :返回geom的最小外接矩形(MBR)
ST_GeometryType(geom) :返回geom的类型
ST_IsEmpty(geom) :该函数并不能真实的判空,当geom为任何有效的几何值时返回0,无效的几何值返回1;
ST_IsSimple(geom) :当geom无任何异常几何点返回1(如自相交和自切线等),否则返回0
ST_SRID(geom) :返回geom的坐标系ID
参见
ST_X(Point) :获取Point的X值
ST_Y(Point) :获取Point的Y值
参见
ST_StartPoint(linestrng) : 线的起点
ST_EndPoint(linestring) :返回线的最后一个点
ST_IsClosed(linestring或multilinestring) :线是否闭合(若为线,则判断起点与终点是否一致;若为线组,则判断组内每个元素是否符合闭合线)
ST_Length(linestring) :返回线的长度,若入参为线集,则返回集合内所有长度的和
ST_NumPoiints(linestring) :返回点的数量;
ST_PointN(linestring,N) :返回第N个点(从1开始)
参见
具体不在一一列举,主要有计算多边形面积、中心点、最小外接圆,最大内接圆等函数,列举几个可能会用到的:
ST_Area(Poly|mPoly) :返回双精度的面积或面积的和
'ST_Centroid(Poly|mPoly)':返回数学上的中心点
ST_ExteriorRing(Poly) :返回外接圆
参见
ST_Buffer说明
不再列举,主要有:ST_Buffer(不懂干啥用),ST_ConvexHull(geom)凸包,ST_Dfference(g1,g2)比较差异,ST_Intersecton(g1,g2)交叉点,ST_SymDifference(g1,g2)对称差分,ST_Union(g1,g2)连接、合并等。
检查geometry Objects之间的空间关系的方法。
参见
计算两个Object之间的空间关系的函数,有两个间距离、相交、不相交,包含、相等、相切、重叠、接触、在内等等空间关系。下面列举几个可能会常用的方法:
ST_Contains(g1,g2) :g1是否完全包含g2
ST_Within(g1,g2) :g1是否包含于g2中
ST_Distance(g1,g2) :返回g1和g2之间的距离,已坐标单位计算的
ST_Equals(g1,g2) :返回g1和g2是否相等
参见
MBRContains(g1,g2) :g1的mbr是否包含g2的mbr
MBRWithin(g1,g2) :g1的mbr是否在g2的mbr内
MBRCoveredBy(g1,g2) :g1的mbr是否被g2的mbr覆盖
MBRCovers(g1,g2) :g1的mbr是否覆盖g2的mbr
MBRDisjoint(g1,g2) :g1的mbr,g2的mbr是否不相交
MBRIntersects(g1,g2) :g1mbr,g2mbr是否相交
MBREqual(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBREquals(g1,g2) :g1的mbr,g2的mbr的外接是否相等
MBROverlaps(g1,g2) :g1mbr、g2mbr
其他函数请参看原文
GeoHash介绍
GeoHash Wiki百科
MySQL中自带函数 st_geohash(longtude,latitude,max_length) 或 st_geohash(point, max_length) 即可生成某一点的geohash值。
返回一个geohash字符串中的latitude或longitude
返回一个geohash解析出的point数据
官方文档
通过geometry生成一个GeoJSON Object, select st_asgeojson(geometry,max_length,options)
通过GeoJSON生成GeoMetry对象。
ST_GeomFromGeoJSON(jsonstring, [options [, srid]])
具体使用方法参见官方文档
官方文档
MySQL中提供的方便空间运算的函数们
select ST_Distance_Spher(geomPoint1,geomPoint2 [, radius])
此方法用于计算两点或多个点之间的地球上的距离(是地球球面距离而不是直线距离),返回单位为米,
select ST_IsValid(ST_GeomFromText('LINESTRING(0 0,1 1)'))
判断入参是否是符合地理位置描述的格式。返回1(符合)或者0(不符);
例如:
返回0:
select st_isvalid(st_geomfromtext('linestring(0 0, -0.00 0, 0.0 0)')
返回1:
select st_isvalid(st_geomfromtext('linestring(0 0,1 1)')
select st_astext(st_makeenvelope(pt1, pt2))
返回两点构成的包络。(此计算是基于笛卡尔坐标系而非球面)
例如:
SELECT ST_AsText ( st_makeenvelope ( st_geomfromtext ( 'point(0 0)' ), st_geomfromtext ( 'point(1 1)' ) ) )
返回结果:
POLYGON((0 0,1 0,1 1,0 1,0 0))
效果说明
JS抽稀算法
select st_simplify(geometry, max_distance)
用道格拉斯-普克算法(抽稀函数)简化geometry,并返回与原格式相同格式的结果。
例如,以下点集拟合为直线,步长0.5:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 0.5 )
返回结果:
LINESTRING(0 0, 0 1, 1 1, 2 3, 3 3)
再如,步长1.0:
SELECT st_simplify ( st_geomfromtext ( 'LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3)' ), 1.0 )
返回结果:
LINESTRING(0 0, 3 3)
SELECT ST_Validate(geometry)
验证geometry是符合正确的地理位置信息格式。例如 Point(0 0) 是合格的; Linestring(0 0) 是非法的; Linestring(0 0, 1 1) 是合格的
了解了上述MySQL中关于集合对象的功能,下面来实践一下
由上面geohash长度-精度对应表可知,前6位表示±610米左右的误差,这里先查询前六位范围之后再用上述方法精确筛选一次即可:
可将上述查询方法封装为MySQL函数方便和简化程序调用.
该方法是运用了内置的几何关系运算函数 ST_Contains 和 ST_MakeEnvelop 来实现的,0.5对应大概500米左右的范围,具体如下;
链接: https://pan.baidu.com/s/1cW-kv6DIgtYMw5I3bNFzKA
提取码: jagn建议你使用postgresql,orcale,sqlserver。以上几种数据库对空间数据支持是比较好的。将地图数据以shp格式导入到空间数据库中,导入后,就能进行调用了。你用的是PHP还是JSP.NET等等的开发语言,都可以调取数据库中的信息,关于如何程序如何连接数据库,如何查询输出想要的数据,你百度一下:你所用的程序语言+问题。如:PHP如何连接数据库;或JSP如何查询输出数据等等。网上有很多数据:是通过数字化并记录下来可以被识别的符号,用以定性或定量地描述事物的特征和状况。数据库:是长期存储在计算机内的,有组织、可共享的数据集合。
空间数据:也就是地理数据。它以点、线、面等方式采用编码技术对空间物体进行特征描述及在物体间建立相互联系的数据集。(其最根本的特点就是:每一个地理实体都按统一的地理坐标进行记录)
空间数据库:也就是地理信息系统数据库,或地理数据库。是某一区域内关于一定地理要素特征的数据集合,为GIS提供空间数据的存储和管理方法。
数据库管理系统(DBMS):用于管理综合的和共享的数据库的一套计算机程序,能完成数据输入、查找、检索、 *** 作、和输出等任务。
(百度百科:是一种 *** 纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称dbms。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。)
关系数据库:是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。(关系模型:是基于谓词逻辑和集合论的一种数据模型)
关系数据库管理系统:就是管理关系数据库的数据库管理系统。(将数据组织为相关的行和列的系统。比如:SQL
Server
是一个关系数据库管理系统)
空间数据库管理系统:是指能够对介质上存储的地理空间数据进行语义和逻辑上的定义,提供必需的空间数据查询和存取功能,以及能够对空间数据进行有效的维护和更新的一套软件系统。(实际上就是在常规的数据库管理系统之上,提供特定的针对空间数据的管理功能)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)