【问题标题】:Perform a subquery on a spatial table in MySQL在 MySQL 中对空间表执行子查询
【发布时间】:2013-11-29 19:42:43
【问题描述】:

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

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

这些是原生MBRWITHIN 函数和自定义GISWithin from a MySQL forum post。 MBRWITHIN 通常给我大约 2 行的点,应该只有一个但很快,GISWithin 给出正确的行,但是很慢。

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

最初使用 快速 MBRWITHIN 功能。

然后使用较慢的方法将此列表细化为单个正确的行 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 导入,供知道的人使用。

【问题讨论】:

  • 几何列中有 NULL 吗?
  • @Mihai 表格中没有空值
  • @Mihai 我关注了那个帖子并检查了空值,每一行都匹配。然后使用 UPDATE 位置更新 X 或 Y 为空 SET 坐标 = POINT(0,0) WHERE X(坐标)为 NULL 或 Y(坐标)为 NULL;查询成功,然后重新运行查询 SELECT id FROM locations WHERE X(coordinates) IS NULL OR Y(coordinates) IS NULL;重新检查,然后没有返回任何行。但是仍然存在相同的错误
  • @Mihai 根据该帖子更改这些空值也会停止实际的点查找功能工作

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


【解决方案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`); 

【讨论】:

  • 谢谢,我很快就意识到了我的错误,但只是重新访问了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2018-04-16
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多