7

我正在使用以下语句从名为“纬度”和“经度”的两个 varChar 格式列写入名为“坐标”的点格式列。

"UPDATE table_name SET coordinate = PointFromText(CONCAT('POINT(',table_name.longitude,' ',table_name.lattitude,')'))"

我尝试使用以下语句对坐标列进行空间查询。

SELECT id , coordinate FROM table_name WHERE MBRContains(GeomFromText('Polygon(-126.728566 49.226434, -123.652395 23.586457,-56.679738 23.908252,-53.076223 55.243002)'), coordinate)

根据这个工具,我查询中的多边形覆盖了整个美国,我知道我的表中有一些点落在美国,但我仍然没有得到任何结果(注意我得到的是空结果而不是错误)。关于我做错了什么的任何想法?

更新。以下是根据以下建议执行我的查询的更新尝试。

SET @g1 = GeomFromText('Polygon((23.586457 -123.652395,23.908252 -56.679738,55.243002 -53.076223,55.243002 -53.076223,23.586457 -123.652395))');

SELECT id , coordinate FROM table_name WHERE MBRContains(@g1, coordinate)
4

2 回答 2

4

当您处理坐标时,您的 lat lng 坐标已交叉。

我使用下面的坐标创建了一个谷歌地图(颠倒问题中坐标的顺序。

new google.maps.LatLng(49.226434,-126.728566),
new google.maps.LatLng(23.586457,-123.652395),
new google.maps.LatLng(23.908252,-56.679738),
new google.maps.LatLng(55.243002,-53.076223)

多边形

谷歌地图不需要关闭多边形。

根据 文档, MBR 要求关闭多边形。

mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');

编辑 回答评论你有正确的 CHARSET 吗?

典型空间表

CREATE TABLE IF NOT EXISTS `table_name` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `coordinate` geometry NOT NULL,
   PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

确保CHARSET=utf8;

于 2013-04-23T11:51:40.260 回答
4
SELECT id , coordinate FROM table_name WHERE MBRContains(GeomFromText('Polygon((-126.728566 49.226434, -123.652395 23.586457,-56.679738 23.908252,-53.076223 55.243002, -126.728566 49.226434))'), coordinate)

这应该有效。问题是多边形坐标应该在双括号中。它与内环(多边形)有关。加上大卫注意到你需要关闭多边形。

PS:我注意到你使用经度作为 X 和纬度作为 Y,而这应该是相反的。X是水平的,Y是垂直的。

于 2013-04-23T21:59:02.370 回答