mysql - 在 MySQL 中对空间表执行子查询

标签 mysql stored-procedures subquery spatial-index spatial-query

我有一个多边形的空间表。我正在尝试有效地找到 MySQL 空间表中的 polygonlat/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/

相关文章:

MYSQL子查询性能不一致

mysql - SQL:从子查询和连接返回不同的相似值时遇到问题

mysql - 查找没有相关键的任何元素

mysql - 查询有什么问题吗?错误语法错误?按无工作分组

c# - 没有字母参数的 Postgresql 的 Dapper 存储过程

MySQL 子查询简单的 SELECT 问题

MySQL 生成数据透视表

php - 如何正确使用MySQL事务

c# - 使用存储过程仅在实体中删除

mysql - 如何在 mysql5 存储过程中内爆查询结果?