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
相关产品推荐
相关产品推荐

