2

我有一个空间表polygons。我正在尝试有效地查找polygonMySQLlat/lng point空间表中的内容。

我知道ST_Within可以使用,MySQL 5.6但是我的版本早于这个版本,所以我将我可以使用的两个功能组合成比单独的更有效/更准确的东西。

这些是 MySQL 论坛帖子中的本机MBRWITHIN函数和自定义GISWithin。MBRWITHIN 通常给我大约 2 行,一个点应该只有一个但很快,GISWithin 给出正确的行,但是很慢。

所以我正在尝试编写一个查询:

最初使用快速 MBRWITHIN 功能选择可能包含该点的几行。

然后使用较慢的 GISWithin 将此列表细化为单个正确的行,该 GISWithin 现在在大约 2 行而不是 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 导入的类型,供那些知道这一点的人使用。

4

1 回答 1

1

该错误来自尝试在需要几何对象的位置使用点的 WKT(文本)表示,因为 @point 包含文本字符串并且您并未始终使用GeomFromText()它来转换它。

但是您根本不需要连接字符串并将其转换为几何,因为 MySQL 有一个内置POINT()函数可以直接生成几何对象。

SET @x = -0.3578;
SET @y = 51.477;
SET @point = POINT(@x,@y);

@point 现在包含一个适当的几何对象,查询应该可以通过简单地将两个测试与AND.

由于这两个条件都必须为真,优化器应该首先尝试做最简单的事情——意识到MBRWithin()可以使用空间索引来解决,它应该尝试从索引中找到匹配的行,然后只执行 GISWithin() 函数它找到的行,这将进一步消除结果集中任何不使用存储函数计算为真的行。

SELECT * 
  FROM world_borders 
 WHERE MBRWithin(@point,`geometry`)
   AND GISWithin(@point,`geometry`); 
于 2013-11-30T05:27:05.593 回答