我有一个多边形
的空间表。我正在尝试有效地找到 MySQL 空间表中的 polygon
和 lat/lng point
。
我知道 ST_Within
可用于 MySQL 5.6
但是我的版本早于此所以我将我可以使用的两个函数组合成比要么单独。
这些是 native MBRWITHIN
函数和自定义 GISWithin from a MySQL forum post . MBRWITHIN 通常会为我提供大约 2 行的点,而应该只有 1 行但很快,GISWithin 会给出正确的行,但速度很慢。
所以我正在尝试编写一个查询:
Initially selects the few rows that could contain the point using the quick MBRWITHIN funciton.
Then refine this list to the single correct row using the slower GISWithin that is now operating on about 2 rows rather than 9000.
我试过各种子查询,比如
SET @x = -0.3578;
SET @y = 51.477;
SET @point = CONCAT('POINT(',@x,' ',@y,')');
SELECT * FROM
(SELECT `geometry` FROM world_borders WHERE MBRWITHIN( @point , `geometry` )) AS TT
WHERE GISWithin(GeomFromText(@point), `geometry`);
和
SELECT * FROM world_borders WHERE GISWithin(GeomFromText(@point), `geometry`) IN (SELECT ogr_fid FROM world_borders WHERE MBRWITHIN( @point , `geometry` ));
只是为了得到错误信息
#1416 - Cannot get geometry object from data you send to the GEOMETRY field
有谁知道我该如何编写这样的查询或函数?
我表中的多边形字段称为 geometry
并且属于 Geometry
类型 - 从 ogr2ogr 导入以供了解这一点的人使用。
最佳答案
错误来自于尝试在需要几何对象的地方使用点的 WKT(文本)表示,因为 @point 包含文本字符串并且您没有始终如一地使用 GeomFromText()
来转换它。
但是您根本不需要连接字符串并将其转换为几何图形,因为 MySQL 有一个内置的 POINT()
函数可以直接生成几何图形对象。
SET @x = -0.3578;
SET @y = 51.477;
SET @point = POINT(@x,@y);
现在 @point 包含一个合适的几何对象,查询应该可以通过简单地将两个测试组合在一个查询中并使用 AND
来实现。
由于两个条件都必须为真,优化器应该首先尝试做最简单的事情——意识到 MBRWithin()
可以使用空间索引来解决,它应该尝试找到匹配的行从索引中,然后仅在它找到的行上执行 GISWithin() 函数,这将进一步消除结果集中未使用存储函数评估为 true 的任何行。
SELECT *
FROM world_borders
WHERE MBRWithin(@point,`geometry`)
AND GISWithin(@point,`geometry`);
关于mysql - 在 MySQL 中对空间表执行子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292433/