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

MySQL中如何判断点是否在表内存储的多边形中?

如何判断点是否在数据库存储的多边形内?

我曾直接执行以下查询验证点是否在多边形内,返回结果为1,确认点57.05, -4.49确实在目标多边形中:

SELECT ST_Contains(
    PolygonFromText('
      POLYGON((
        60.930551 -0.775212, 
        60.332866 -0.417906, 
        59.935582 -0.887788, 
        59.837354 -1.156991, 
        58.919848 -2.577975, 
        58.378359 -2.935748, 
        57.934035 -3.75355, 
        57.761068 -3.563538, 
        57.859628 -1.643417, 
        57.538993 -1.423404, 
        56.382748 -2.522191, 
        55.846937 -1.945553, 
        55.618743 -2.262236, 
        55.463878 -2.131039, 
        55.42282 -2.162707, 
        54.968355 -3.03811, 
        54.960564 -3.232644, 
        54.929382 -3.449798, 
        54.540197 -4.141976, 
        54.467094 -5.149036, 
        55.657203 -6.713395, 
        56.947221 -7.700598, 
        57.681709 -7.656722, 
        58.298006 -7.239903, 
        60.930551 -0.775212))'),
 PointFromText('POINT(57.05 -4.49)'));

之后我将多边形存入数据库,执行的插入语句为:

INSERT INTO polygons (`ownerID`, `polygon`) 
VALUES ("test", PolygonFromText('POLYGON((60.930551 -0.775212, 60.332866 -0.417906, 59.935582 -0.887788, 59.837354 -1.156991, 58.919848 -2.577975, 58.378359 -2.935748, 57.934035 -3.75355, 57.761068 -3.563538, 57.859628 -1.643417, 57.538993 -1.423404, 56.382748 -2.522191, 55.846937 -1.945553, 55.618743 -2.262236, 55.463878 -2.131039, 55.42282 -2.162707, 54.968355 -3.03811, 54.960564 -3.232644, 54.929382 -3.449798, 54.540197 -4.141976, 54.467094 -5.149036, 55.657203 -6.713395, 56.947221 -7.700598, 57.681709 -7.656722, 58.298006 -7.239903, 60.930551 -0.775212))'));

但尝试从表中读取多边形并执行判断时,返回结果为null:

SELECT @Test := polygon FROM polygons where ownerID = 'test';
SELECT ST_CONTAINS(ST_GEOMFROMTEXT(@Test), PointFromText("POINT(57.05, -4.499)"));

正确解决方法

问题出在两个核心点:

  • 若polygon字段存储的是几何类型(如MySQL的POLYGON/GEOMETRY),无需用ST_GeomFromText转换,直接使用字段即可——因为变量@Test已经是几何对象,再套转换函数会导致无效输入。
  • PointFromText中的坐标必须用空格分隔,不能用逗号(错误格式:POINT(57.05, -4.499),正确格式:POINT(57.05 -4.499))。

直接执行以下查询即可得到正确结果:

SELECT ST_Contains(polygon, PointFromText('POINT(57.05 -4.499)')) 
FROM polygons 
WHERE ownerID = 'test';

如果你的polygon字段存储的是WKT字符串(不推荐,建议改为几何类型),则需要先转换再判断:

SELECT ST_Contains(ST_GeomFromText(polygon), PointFromText('POINT(57.05 -4.499)')) 
FROM polygons 
WHERE ownerID = 'test';

内容的提问来源于stack exchange,提问作者TangoMike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59