【发布时间】:2013-11-29 19:42:43
【问题描述】:
我有一个polygons 的空间表。我正在尝试有效地在 MySQL 空间表中找到 polygon 和 lat/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