按距离搜索地理编码信息

时间:2009-06-16 17:03:33

标签: algorithm search geocoding

我有一个地址数据库,都是地理编码的。

在给定纬度的某个半径范围内找到数据库中所有地址的最佳方法是什么?

换句话说,用户输入(lat,lng)某个位置,我们会返回数据库中所有位于给定位置10,20,50 ......等英里范围内的记录。

它不一定非常精确。

我正在使用MySQL DB作为后端。

6 个答案:

答案 0 :(得分:5)

MySQL 5有可用的Spatial扩展 - 文档的入口页面在这里:

http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

有很多关于如何完成所要求的细节,具体取决于数据库中空间数据的表示方式。

另一种选择是使用已经提到的Haversine公式制作计算距离的函数。背后的数学可以在这里找到:

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

希望这有帮助。

答案 1 :(得分:3)

您没有提及您的数据库,但在SQL Server 2008中,当您使用地理数据类型时,它就像这样简单

这将找到距离邮政编码10028

20英里内的所有邮政编码
SELECT h.*
FROM zipcodes g
JOIN zipcodes h ON g.zipcode <> h.zipcode
AND g.zipcode = '10028'
AND h.zipcode <> '10028'
WHERE g.GeogCol1.STDistance(h.GeogCol1)<=(20 * 1609.344)

另见SQL Server 2008 Proximity Search With The Geography Data Type

SQL Server 2000版本位于:S QL Server Zipcode Latitude/Longitude proximity distance search

答案 2 :(得分:2)

这是典型的空间搜索问题。

1&GT;您正在使用什么数据库,sql2008,oracle,ESRI地理数据库和postgis是一些具有此功能的空间数据库引擎。 2 - ;否则,如果你想实现这一点,你可能会寻找一些空间Algo库。你可以为自己编写代码,但我不会建议,因为计算几何是一个复杂的问题。

答案 3 :(得分:2)

如果您使用的是支持空间类型的数据库,则可以直接构建查询,数据库将对其进行处理。 PostgreSQL,Oracle和最新的MS SQL都支持这一点,其他一些也是如此。

如果没有,精度不是问题,你可以在一个方框而不是一个半径进行搜索,因为这将非常快。否则,事情变得复杂,因为lat-long的实际转换 - >距离需要在投影空间中发生(因为距离在行星的不同区域发生变化),生命变得更加肮脏。

答案 4 :(得分:1)

我不记得我头顶的等式,但是Haversine公式用于计算地球上两点之间的距离。您可以谷歌这个等式,看看是否给你任何想法。对不起,我知道这没什么用,但也许它会给你一个开始的地方。

答案 5 :(得分:0)

如果它不必非常准确,并且我假设你的表中有一个x和y列,那么只需选择一个大的边界矩形中的所有行,并使用pythagorus(或Haversine)来修剪导致角落。

例如。从(xpos-10英里和xpos + 10英里之间的x)和xpos -10miles和ypos + 10英里之间的位置选择*。

记住pythagorus是sqrt(x_dist ^ 2 + y_dist ^ 2)。

它快速简单,易于理解,不需要有趣的连接。