马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
媒介
近来碰到一个需求,须要查询给定的经纬度坐标点,是否在指定的都会内。 分析需求,须要获取都会地域的边界,再判断目的坐标点是否在边界内。组内的大佬说mysql有这块空间函数的支持,可以相识一下。
以是有了这篇内容。
技能配景
1、MySQL空间数据范例
在MySQL中,空间数据范例是专门用于存储和管理空间数据(如地理位置、多少形状等)的数据范例。这些数据范例使得MySQL可以大概高效地处置惩罚和查询与空间干系的信息。以下是一些MySQL中常见的空间数据范例:
- GEOMETRY:
- 这是一个通用的空间数据范例,可以存储任何范例的空间数据,包罗点、线、多边形等。
- 它通常作为其他详细空间数据范例的基类或父类。
- POINT:
- 用于存储二维空间中的点,由一对坐标(X, Y)表现。
- 实用于表现详细的地理位置,如都会的位置、用户的坐标等。
- LINESTRING:
- 用于存储一系列点构成的线段或折线。
- 可以表现门路、河道、路径等线性空间要素。
- POLYGON:
- 用于存储由一系列点构成的多边形,这些点构成了一个闭合的环。
- 实用于表现地域、地块、湖泊等面状空间要素。
别的,MySQL还支持其他更复杂的空间数据范例,如MULTIPOINT(多个点的聚集)、MULTILINESTRING(多条线段的聚集)、MULTIPOLYGON(多个多边形的聚集)以及GEOMETRYCOLLECTION(多少对象的聚集)等。
2、MySQL空间函数
- MySQL空间函数是指用于处置惩罚和分析空间数据的函数聚集。在MySQL中,空间数据通常指的是具有地理位置信息的数据,如舆图数据、多少形状等。这些函数答应用户对空间数据举行各种利用,包罗盘算隔断、判断空间关系、举行多少盘算等。它们重要用于支持地理信息体系(GIS)应用、位置服务、物联网
(IoT)等范畴的数据处置惩罚和分析需求。
- 以下是一些常见的MySQL空间函数列表,这些函数重要用于处置惩罚和分析空间数据。这些函数通常用于地理信息体系(GIS)、位置服务、物联网
(IoT)等范畴。
隔断盘算函数
函数名称形貌ST_Distance盘算两个多少对象之间的最短隔断。ST_Distance_Sphere盘算球体上两点之间的最短球面隔断,思量了地球的曲率。空间关系函数
函数名称形貌ST_Within判断一个多少对象是否位于另一个多少对象内部。ST_Contains判断一个多少对象是否包罗另一个多少对象。ST_Intersects判断两个多少对象是否相交。ST_Touches判断两个多少对象是否相切。ST_Crosses判断两个多少对象是否交织。ST_Overlaps判断两个多少对象是否重叠。多少盘算函数
函数名称形貌ST_Area盘算多边形对象的面积。ST_Length盘算线对象的长度。ST_Centroid盘算多边形对象的质心。ST_Perimeter盘算多边形对象的周长。ST_ConvexHull盘算一组点的凸包。缓冲区分析函数
函数名称形貌ST_Buffer对多少对象举行缓冲区分析,天生一个以该对象为中心的缓冲区。空间数据范例转换函数
函数名称形貌ST_GeomFromText将WKT(Well-Known Text)格式的多少对象转换为MySQL中的多少对象。ST_AsText将MySQL中的多少对象转换为WKT格式的字符串。ST_GeomFromGeoJSON将GeoJSON格式的多少对象转换为MySQL中的多少对象。ST_AsGeoJSON将MySQL中的多少对象转换为GeoJSON格式的字符串。其他空间函数
函数名称形貌ST_StartPoint获取LineString的起始点。ST_EndPoint获取LineString的止境。ST_NumPoints获取LineString中的点数。ST_PointN获取LineString中的第N个点。ST_IsClosed判断LineString是否闭合。ST_IsValid判断多少对象是否有效。请注意,MySQL空间函数的完备列表和功能大概会因MySQL版本的差异而有所差异。为了获取最正确和最新的信息,发起参考MySQL的官方文档或干系权势巨子资源。
目的
学习相识mysql空间函数,相识实现需求须要用到什么空间函数,并创建数据表、造数据实践调用一下对应的空间函数。
实现
建表
- 创建目的坐标点数据表
- CREATE TABLE `target_coordinate_table` (
- `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
- `coordinate` geometry NOT NULL COMMENT '坐标点',
- PRIMARY KEY (`id`),
- SPATIAL KEY `coordinate` (`coordinate`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='坐标点表';
复制代码 - 创建都会地域多边形数据表
- CREATE TABLE `city_polygon_table` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
- `name` varchar(100) NOT NULL COMMENT '多边形名称-城市名',
- `polygon` geometry NOT NULL COMMENT '多边形数据',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_name` (`name`),
- SPATIAL KEY `polygon` (`polygon`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='城市区域多边形数据表';
复制代码 造数
ST_GeomFromText
ST_GeomFromText 是 MySQL 中用于将 Well-Known Text (WKT) 格式的多少数据转换为 MySQL 内部多少数据范例的函数。对于 MULTIPOLYGON 范例的数据,WKT 格式遵照肯定的规范来界说多边形聚集。
MULTIPOLYGON 的 WKT 格式通常如下所示:
- MULTIPOLYGON(((x1 y1, x2 y2, ..., xn yn, x1 y1)), ((x'1 y'1, x'2 y'2, ..., x'n y'n, x'1 y'1)), ...)
复制代码 这里是一个详细的例子,包罗两个多边形的 MULTIPOLYGON:
- MULTIPOLYGON(
- ((10 10, 40 40, 20 20, 10 10)), -- 第一个多边形
- ((15 15, 35 35, 30 15, 15 15)) -- 第二个多边形
- )
复制代码 要利用 ST_GeomFromText 将这个 MULTIPOLYGON 写入 MySQL 数据库,你可以实验雷同以下的 SQL 语句:
- INSERT INTO your_table_name (your_geometry_column)
- VALUES (ST_GeomFromText('MULTIPOLYGON(((10 10, 40 40, 20 20, 10 10)), ((15 15, 35 35, 30 15, 15 15)))'));
复制代码 在这个例子中,your_table_name 是包罗多少数据列的表的名称,your_geometry_column 是该表中用于存储多少数据的列的名称。这个列应该具有恰当的空间数据范例,比如 GEOMETRY、MULTIPOLYGON 或与之兼容的范例。
目的坐标点数据表insert 数据
- INSERT INTO target_coordinate_table (coordinate) VALUES
- (ST_GeomFromText('POINT (108.696992 30.933541)')),
- (ST_GeomFromText('POINT (108.711323 30.939757)')),
- (ST_GeomFromText('POINT (108.769703 31.005251)')),
- (ST_GeomFromText('POINT (108.729993 31.007736)')),
- (ST_GeomFromText('POINT (106.529617 29.454004)')),
- (ST_GeomFromText('POINT (106.53302 29.459989)')),
- (ST_GeomFromText('POINT (106.525336 29.453735)')),
- (ST_GeomFromText('POINT (106.437501 29.501508)')),
- (ST_GeomFromText('POINT (109.102051 30.574327)')),
- (ST_GeomFromText('POINT (109.099044 30.573383)'));
复制代码 都会地域多边形数据表insert数据
- INSERT INTO
- city_polygon_table (name, polygon)
- VALUES ("重庆郊县",
- ST_GeomFromText(
- 'MULTIPOLYGON (((109.098646 30.579115, 109.098655 30.578657, 109.099332 30.577264, 109.100392 30.575931, 109.102051 30.574327, 109.10437 30.572002, 109.10536 30.571059, 109.106124 30.570777,
- 109.103692 30.56583, 109.098819 30.57029, 109.09683 30.57217, 109.095353 30.574395, 109.093476 30.577624, 109.092868 30.578731,
- 109.098646 30.579115)))'
- ));
复制代码 测试
查询目的点是否在指定的都会地域内
实验SQL:
- select coordinate
- from target_coordinate_table tct
- where st_within(tct.coordinate, (select polygon from city_polygon_table cpt where id = 1)) = 1;
复制代码 查询结果:
查询两个目的点的隔断
实验SQL
- select coordinate, st_distance_sphere(corrdinate, point(106.529617,29.454004)) as distance
- from target_coordinate_table;
复制代码 查询结果:
查询目的点半径范围内的其他点
- SELECT *
- FROM (
- SELECT
- coordinate,
- st_distance_sphere(coordinate, point(106.529617,29.454004)) as distance
- FROM
- target_coordinate_table
- ) AS subquery
- WHERE subquery.distance < 20000;
复制代码
小结
本文记录了学习和实践MySQL中的空间数据范例和空间函数的过程,并乐成实现了查询目的坐标点是否在指定都会地域内的需求。总结如下:
- MySQL空间数据范例:常见的范例包罗GEOMETRY、POINT、LINESTRING、POLYGON等,以及它们各自的应用场景。这些数据范例为存储和管理空间数据提供了高效的方式,使得MySQL可以大概处置惩罚和查询与空间干系的信息。
- MySQL空间函数:包罗隔断盘算函数(如ST_Distance、ST_Distance_Sphere)、空间关系函数(如ST_Within、ST_Contains、ST_Intersects等)、多少盘算函数(如ST_Area、ST_Length等)以及其他干系函数,后续可按需利用。
- 实践应用:
- 我们创建了目的坐标点数据表和都会地域多边形数据表,并插入了相应的数据。
- 通过利用ST_Within函数,我们乐成查询了目的坐标点是否在指定的都会地域内。
- 我们还实践了查询两个目的点的隔断以及查询目的点半径范围内的其他点,验证了MySQL空间函数的有效性和实用性。
- 注意事项:
- 在利用MySQL空间函数时,须要注意函数的参数和返回值范例,确保它们与数据表中的空间数据范例相匹配。
- 对于复杂的空间查询,大概须要思量查询的性能和优化计谋,如利用空间索引、公道的数据布局等。
标题记录:
1、写入多边形地域数据报格式错误
报错信息 “Data truncation: Invalid GIS data provided to function st_geometryfromtext.” 指出你提供的 GIS 数据在剖析时碰到了标题。这通常是由于数据格式错误、数据点不符合规范、大概多边形没有准确闭合等缘故原由造成的。
须要注意提供的 MULTIPOLYGON 数据中,是否有以下标题:
- 多边形未闭合:每个多边形都应该是一个闭合的环,即第一个点和末了一个点应该是雷同的。每个多边形都要到达这个要求。
- 数据点序次标题:多边形的点应该按照顺时针或逆时针的序次分列,这通常是为了界说多边形的“内部”和“外部”。假如点的序次杂乱,大概会导致剖析错误。
- 坐标值超出范围或格式错误:确保全部的坐标值都在公道的范围内,而且格式准确(比方,经度应在 -180 到 180 之间,纬度应在 -90 到 90 之间)。
- 多余或缺失的括号:MULTIPOLYGON 的界说中括号的利用非常告急,确保每个多边形和整个多边形聚集的括号都准确匹配。
2、ST_Within查询点是否在多边形内,不包罗边界点
在地理空间数据查询中,ST_Within 函数用于判断一个多少对象是否完全位于另一个多少对象内部。
ST_Within函数的一个核心界说特性:多少体的边界不被视为多少体内部的一部门。
为了处置惩罚边界点的环境,可以思量利用其他空间查询函数或方法,比方:
- ST_Touches:用于判断两个多少对象是否相打仗,但不重叠。这可以捕捉到边界点打仗的环境。
- ST_Intersects:用于判断两个多少对象是否相交。这个函数会思量多少对象的内部和边界,因此假如边界点相交,它也会返回真(TRUE)。
|