MySQL空间查询

MySQL空间查询

1. 空间数据支持

MySQL 具有对应于 OpenGIS 类的空间数据类型。一些空间数据类型包含单个几何值:

  • GEOMETRY
  • POINT
  • LINESTRING
  • POLYGON

GEOMETRY可以存储任何类型的几何值。其他单值类型(POINTLINESTRINGPOLYGON)将它们的值限制为特定的几何类型。

其他空间数据类型包含值的集合:

  • MULTIPOINT
  • MULTILINESTRING
  • MULTIPOLYGON
  • GEOMETRYCOLLECTION

GEOMETRYCOLLECTION可以存储任何类型的对象的集合。其他集合类型(MULTIPOINTMULTILINESTRINGMULTIPOLYGON)将集合成员限制为具有特定几何类型的成员。

示例:要创建一个名为 的表,该表geom具有一个名为g可以存储任何几何类型的值的列,请使用以下语句:

CREATE TABLE geom (g GEOMETRY);

2. 空间函数支持

下表列出了每个空间函数并提供了每个函数的简短描述。

表 1空间函数

姓名描述介绍
GeomCollection()从几何构造几何集合
GeometryCollection()从几何构造几何集合
LineString()从点值构造 LineString
MBRContains()一个几何体的 MBR 是否包含另一个几何体的 MBR
MBRCoveredBy()一个 MBR 是否被另一个 MBR 覆盖
MBRCovers()一个 MBR 是否覆盖另一个
MBRDisjoint()两个几何形状的 MBR 是否不相交
MBREquals()两个几何结构的MBR是否相等
MBRIntersects()两个几何图形的 MBR 是否相交
MBROverlaps()两个几何形状的MBR是否重叠
MBRTouches()两个几何形状的 MBR 是否接触
MBRWithin()一个几何体的 MBR 是否在另一个几何体的 MBR 内
MultiLineString()从 LineString 值构造 MultiLineString
MultiPoint()从点值构造多点
MultiPolygon()从 Polygon 值构造 MultiPolygon
Point()从坐标构造点
Polygon()从 LineString 参数构造多边形
ST_Area()返回多边形或多边形区域
ST_AsBinary(),ST_AsWKB()从内部几何格式转换为 WKB
ST_AsGeoJSON()从几何生成 GeoJSON 对象
ST_AsText(),ST_AsWKT()从内部几何格式转换为 WKT
ST_Buffer()返回距几何体给定距离内的点的几何体
ST_Buffer_Strategy()为 ST_Buffer() 生成策略选项
ST_Centroid()将质心作为一个点返回
ST_Collect()将空间值聚合到集合中8.0.24
ST_Contains()一个几何体是否包含另一个
ST_ConvexHull()返回几何的凸包
ST_Crosses()一个几何图形是否与另一个几何图形相交
ST_Difference()两个几何的返回点集差
ST_Dimension()几何尺寸
ST_Disjoint()一个几何图形是否与另一个几何图形不相交
ST_Distance()一个几何体与另一个几何体的距离
ST_Distance_Sphere()地球上两个几何之间的最小距离
ST_EndPoint()线串终点
ST_Envelope()返回几何的 MBR
ST_Equals()一个几何体是否等于另一个
ST_ExteriorRing()返回多边形的外环
ST_FrechetDistance()一个几何体与另一个几何体的离散 Fréchet 距离8.0.23
ST_GeoHash()产生一个 geohash 值
ST_GeomCollFromText(), ST_GeometryCollectionFromText(),ST_GeomCollFromTxt()从 WKT 返回几何集合
ST_GeomCollFromWKB(),ST_GeometryCollectionFromWKB()从 WKB 返回几何集合
ST_GeometryN()从几何集合中返回第 N 个几何
ST_GeometryType()返回几何类型的名称
ST_GeomFromGeoJSON()从 GeoJSON 对象生成几何图形
ST_GeomFromText(),ST_GeometryFromText()从 WKT 返回几何
ST_GeomFromWKB(),ST_GeometryFromWKB()从 WKB 返回几何
ST_HausdorffDistance()一个几何体与另一个几何体的离散 Hausdorff 距离8.0.23
ST_InteriorRingN()返回多边形的第 N 个内环
ST_Intersection()返回点集两个几何的交集
ST_Intersects()一个几何图形是否与另一个几何图形相交
ST_IsClosed()几何是否封闭且简单
ST_IsEmpty()几何是否为空
ST_IsSimple()几何是否简单
ST_IsValid()几何是否有效
ST_LatFromGeoHash()从 geohash 值返回纬度
ST_Latitude()点返回纬度8.0.12
ST_Length()返回 LineString 的长度
ST_LineFromText(),ST_LineStringFromText()从 WKT 构建 LineString
ST_LineFromWKB(),ST_LineStringFromWKB()从 WKB 构造 LineString
ST_LineInterpolatePoint()沿 LineString 给定百分比的点8.0.24
ST_LineInterpolatePoints()沿 LineString 给定百分比的点8.0.24
ST_LongFromGeoHash()从 geohash 值返回经度
ST_Longitude()返回点的经度8.0.12
ST_MakeEnvelope()围绕两点的矩形
ST_MLineFromText(),ST_MultiLineStringFromText()从 WKT 构建 MultiLineString
ST_MLineFromWKB(),ST_MultiLineStringFromWKB()从 WKB 构建 MultiLineString
ST_MPointFromText(),ST_MultiPointFromText()从 WKT 构造多点
ST_MPointFromWKB(),ST_MultiPointFromWKB()从 WKB 构造多点
ST_MPolyFromText(),ST_MultiPolygonFromText()从 WKT 构建多边形
ST_MPolyFromWKB(),ST_MultiPolygonFromWKB()从 WKB 构建多边形
ST_NumGeometries()返回几何集合中的几何数
ST_NumInteriorRing(),ST_NumInteriorRings()返回多边形中的内环数
ST_NumPoints()返回 LineString 中的点数
ST_Overlaps()一个几何图形是否与另一个几何图形重叠
ST_PointAtDistance()沿 LineString 给定距离的点8.0.24
ST_PointFromGeoHash()将 geohash 值转换为 POINT 值
ST_PointFromText()从 WKT 构造点
ST_PointFromWKB()从 WKB 构造点
ST_PointN()从 LineString 返回第 N 个点
ST_PolyFromText(),ST_PolygonFromText()从 WKT 构造多边形
ST_PolyFromWKB(),ST_PolygonFromWKB()从 WKB 构建多边形
ST_Simplify()返回简化几何
ST_SRID()返回几何的空间参考系统 ID
ST_StartPoint()线串起点
ST_SwapXY()交换 X/Y 坐标的返回参数
ST_SymDifference()两个几何的返回点集对称差
ST_Touches()一个几何体是否接触另一个
ST_Transform()变换几何坐标8.0.13
ST_Union()两个几何图形的返回点集并集
ST_Validate()返回验证几何
ST_Within()一个几何体是否在另一个几何体中
ST_X()返回 Point 的 X 坐标
ST_Y()返回 Point 的 Y 坐标

3. 操作示例

效果如下:

在这里插入图片描述

3.1 创建表结构

DROP TABLE IF EXISTS target_polygon;
CREATE TABLE `target_polygon` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `out_line` geometry NOT NULL SRID 4326, -- 指定4326(WGS-84)坐标系
  PRIMARY KEY (`id`),
  SPATIAL INDEX (`out_line`) -- 空间索引,提高空间查询速度
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在这里插入图片描述

3.2 插入数据

# 插入源格式为GeoJSON的数据
INSERT INTO target_polygon VALUES (1,ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[117.205262,31.870465],[117.254387,31.872216],[117.242555,31.847807],[117.216171,31.845654],[117.205262,31.870465]]]}')); -- 注意首尾点闭合,否则插入报错
INSERT INTO target_polygon VALUES (2,ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[117.307531,31.841532],[117.354107,31.833384],[117.339544,31.799192],[117.306117,31.815102],[117.307531,31.841532]]]}'));
INSERT INTO target_polygon VALUES (3,ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[117.353999,31.737498],[117.40432,31.745964],[117.395446,31.723819],[117.357326,31.721851],[117.353999,31.737498]]]}'));

在这里插入图片描述

3.3 查询空间相交数据

# 定义查询多边形
SET @queryPolygon = CONCAT('{"type":"Polygon","coordinates":[[[117.293996,31.884109],[117.493224,31.883049],[117.441397,31.694935],[117.295797,31.702517],[117.293996,31.884109]]]}');
# 使用变量,查询相交部分
select *,ST_AsGeoJSON(out_line) geojson from target_polygon where ST_INTERSECTS( out_line, ST_GeomFromGeoJSON(@queryPolygon) ); -- 将查询结果转为GeoJSON格式

在这里插入图片描述

4. 参考链接

[1]. MySQL 8.0 Manual-空间数据类型

[2]. MySQL 8.0 Manual-空间函数参考

[3]. MySQL 8.0 Manual-创建空间索引

[4]. MySQL 8.0 Manual-空间 GeoJSON 函数

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值