MySQL 空间查询始终为空

MySQL spatial query always empty

我使用空间索引将地理坐标存储在 MySQL table 中。问题是我想知道 tuple/location 是否在边界框内的查询(由 5 个坐标描述的闭合多边形;第一个和最后一个坐标相同)return 一个空结果。这是一个对我不起作用的最小示例:

CREATE TABLE osTest(
 loc Point NOT NULL
) ENGINE=MyISAM;

CREATE SPATIAL INDEX locIndex ON osTest(loc);

-- New York Central Park, The Great Lawn
INSERT INTO osTest (loc) VALUES (POINT(40.781343, -73.966598));

如果我执行以下 table 扫描查询:

SELECT AsText(loc), X(loc), Y(loc) FROM osTest;

一切似乎都运行良好——结果如下所示:

+-----------------------------+-----------+------------+
| AsText(loc)                 | X(loc)    | Y(loc)     |
+-----------------------------+-----------+------------+
| POINT(40.781343 -73.966598) | 40.781343 | -73.966598 |
+-----------------------------+-----------+------------+

但是,当我尝试执行使用空间索引的查询时,结果始终为空。以下多边形中的多边形描述了整个中央公园:

SELECT AsText(loc), X(loc), Y(loc) FROM osTest WHERE WITHIN(loc, GeomFromText('POLYGON(40.800716 -73.958358, 40.796858 -73.949120, 40.764216 -73.973153, 40.768108 -73.981929, 40.800716 -73.958358)') );

我也试过 INTERSECTSOVERLAPS -- 相同的空结果集。我在这里错过了什么?

我不是 mysql GIS 方面的专家,但在 postgis 中,点必须是纬度、经度。我相信 mysql 5.6 GIS 数据类型也是如此。

根据那个理论;在您的查询中,y 和 x 应该交换

我发现了问题。我的 SQL 查询有误。它不会导致语法错误,但显然它不能正常工作。更具体地说,我必须添加额外的括号。我不得不改变:

GeomFromText('POLYGON(40.800716 -73.958358, ...)')

GeomFromText('POLYGON((40.800716 -73.958358, ...))')

我在搜索示例时完全忽略了它。而且我没有遇到任何语法错误,也没有任何帮助。