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)') );
我也试过 INTERSECTS
、OVERLAPS
-- 相同的空结果集。我在这里错过了什么?
我不是 mysql GIS 方面的专家,但在 postgis 中,点必须是纬度、经度。我相信 mysql 5.6 GIS 数据类型也是如此。
根据那个理论;在您的查询中,y 和 x 应该交换
我发现了问题。我的 SQL 查询有误。它不会导致语法错误,但显然它不能正常工作。更具体地说,我必须添加额外的括号。我不得不改变:
GeomFromText('POLYGON(40.800716 -73.958358, ...)')
至
GeomFromText('POLYGON((40.800716 -73.958358, ...))')
我在搜索示例时完全忽略了它。而且我没有遇到任何语法错误,也没有任何帮助。
我使用空间索引将地理坐标存储在 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)') );
我也试过 INTERSECTS
、OVERLAPS
-- 相同的空结果集。我在这里错过了什么?
我不是 mysql GIS 方面的专家,但在 postgis 中,点必须是纬度、经度。我相信 mysql 5.6 GIS 数据类型也是如此。
根据那个理论;在您的查询中,y 和 x 应该交换
我发现了问题。我的 SQL 查询有误。它不会导致语法错误,但显然它不能正常工作。更具体地说,我必须添加额外的括号。我不得不改变:
GeomFromText('POLYGON(40.800716 -73.958358, ...)')
至
GeomFromText('POLYGON((40.800716 -73.958358, ...))')
我在搜索示例时完全忽略了它。而且我没有遇到任何语法错误,也没有任何帮助。