使用多边形或圆形作为搜索来查找纬度/经度

时间:2011-07-12 19:14:10

标签: php mysql geocoding geospatial

我不在这里,所以如果我没有正确/清楚地问这个问题,请原谅我。

我有一个用户表,每个用户都有lat / long。

我从联邦机构那里得到一个查询,提供这样的多边形或圆形:

<polygon>38.47,-120.14 38.34,-119.95 38.52,-119.74 38.62,-119.89 38.47,-120.14</polygon>
<circle>32.9525,-115.5527 0</circle>

给定这两个输入中的任何一个,我需要返回多边形或圆形内的所有用户。

我看了一遍,阅读了所有的mysql空间文档等等,我要么错过了一步,要么就是没有查询查询方法。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

对于圆圈,您需要计算从圆心到人员列表中每个纬度/经度的距离。如果距离小于圆的半径,则该人在圆内。计算沿着“大圆”的2纬度/经度之间的距离的典型公式称为半正式公式。下面的网站在javascript中显示了这个公式。

http://www.movable-type.co.uk/scripts/latlong.html

对于一般多边形,这要​​困难得多。 对于多边形中的一般点,Point Inclusion Test似乎可以假设一个平凡的Equirectanglular投影(x = lon,y = lat)。

答案 2 :(得分:0)

这是我想出的答案,似乎正在起作用:

首先,我通过添加一个字段来保存从用户lat / lon创建的空间点来更改表格:

ALTER TABLE users ADD location POINT NOT NULL;
UPDATE users set location = PointFromText(CONCAT('POINT(',lat,' ',lon,')'))
CREATE SPATIAL INDEX location ON users(location);

从那里开始,我用它来查询多边形内的用户:

SET @bbox = 'POLYGON((38.47,-120.14 38.34,-119.95 38.52,-119.74 38.62,-119.89 38.47,-120.14))';
SELECT * , AsText( location ) 
FROM users
WHERE Intersects( location, GeomFromText( @bbox ) ) ;

对于新用户,我创建了一个触发器,用于从lat / lon更新location(用户无法在没有lat \ lon的情况下添加):

DROP TRIGGER IF EXISTS `users_insert_defaults`;
DELIMITER //
CREATE TRIGGER `users_insert_defaults` BEFORE INSERT ON `users`
 FOR EACH ROW SET NEW.location = PointFromText(CONCAT('POINT(',NEW.lat,' ',NEW.lon,')'))
//
DELIMITER ;