You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断点是否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:55:23