【问题标题】:Spatial query using my SQL使用 mySQL 进行空间查询
【发布时间】:2013-04-20 01:53:03
【问题描述】:

我正在使用以下语句从名为“纬度”和“经度”的两个 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)

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

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

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)

【问题讨论】:

标签: mysql polygon spatial-query


【解决方案1】:
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)

这应该可行。问题是多边形坐标应该用双括号括起来。它与内环有关 (polygons)。加上大卫注意到你需要关闭多边形。

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

【讨论】:

  • 经度为 X,纬度为 Y
  • X 是横轴上的坐标,所以从该点到 X 轴画一条垂直线来找到 X 坐标,反之则用 Y。
【解决方案2】:

当您处理坐标时,您的 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)

Google 地图不需要关闭多边形。

根据documentation MBRs 要求关闭多边形。

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

编辑 回答评论你有正确的字符集吗?

典型空间表

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;

【讨论】:

  • 嗨,大卫,感谢您的建议。我试图实现(在上面的编辑中展示),但我仍然没有得到任何结果。我想知道我是否没有正确写入我的坐标列。我可能应该提到,当我查看 phpMyAdmin 中的坐标列时,它看起来像一堆编码字符(例如������/=�[J@),即人类不可读。不知道这是否正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
相关资源
最近更新 更多