如何判断点是否在MySQL存储的POLYGON多边形范围内?
判断点是否在MySQL多边形空间数据内
我创建了如下geo表:
CREATE TABLE `geo` ( `id` int DEFAULT NULL, `geometry` text, `spatialdata` geometry DEFAULT NULL ) ENGINE=InnoDB;
并通过以下语句插入数据:
INSERT INTO `geo` (`id`, `geometry`, `spatialdata`) VALUES('2','POLYGON ((-118.282067 34.067679, -118.281555 34.067458, -118.281467 34.067419, -118.280624 34.067055, -118.279672 34.066689, -118.279376 34.066558, -118.279233 34.066489, -118.279098 34.066409, -118.278879 34.066251, -118.278047 34.065631, -118.276573 34.067943, -118.276505 34.06805, -118.275848 34.069081, -118.275294 34.069984, -118.274929 34.070554, -118.273876 34.072198, -118.27485 34.072519, -118.2753 34.072711, -118.275707 34.072889, -118.276615 34.073286, -118.27752 34.073681, -118.277735 34.073343, -118.277791 34.073256, -118.278056 34.072844, -118.278522 34.072117, -118.278988 34.071389, -118.279463 34.070648, -118.280081 34.070915, -118.280249 34.070772, -118.281158 34.06934, -118.282183 34.06773, -118.282067 34.067679))',NULL);
现在需要判断点-118.282194 34.06773是否在该多边形内,试了相关方案未解决,以下是可行方法:
问题根源
插入数据时spatialdata字段为NULL,没有将文本格式的多边形转换为MySQL可识别的空间几何类型,导致无法直接使用空间函数判断。
解决步骤
1. 先将文本多边形转换为空间类型(可选,方便后续复用)
执行更新语句,把geometry字段的文本数据转成空间类型存入spatialdata:
UPDATE geo SET spatialdata = ST_GeomFromText(geometry) WHERE id = 2;
2. 使用空间函数判断点是否在多边形内
使用ST_Contains函数,第一个参数为多边形空间数据,第二个参数为待判断的点(需转换为空间类型),返回1表示点在多边形内,0表示不在:
SELECT ST_Contains( spatialdata, ST_GeomFromText('POINT(-118.282194 34.06773)') ) AS is_inside FROM geo WHERE id = 2;
如果不想预先更新表,也可以直接在查询时转换文本多边形:
SELECT ST_Contains( ST_GeomFromText(geometry), ST_GeomFromText('POINT(-118.282194 34.06773)') ) AS is_inside FROM geo WHERE id = 2;
注意事项
- 确保坐标顺序一致:MySQL空间函数中,
POINT格式为POINT(经度 纬度),与你插入的多边形坐标格式匹配,无需调整。 - 多边形需为闭合状态:你的数据首尾点一致,符合要求。
内容的提问来源于stack exchange,提问作者sameeksha Jain
相关产品推荐
相关产品推荐

