3

我有一个地址数据库,所有地址都经过地理编码。

在给定 lat、lng 的某个半径内查找我们数据库中所有地址的最佳方法是什么?

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

它不必非常精确。

我使用 MySQL DB 作为后端。

4

6 回答 6

5

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

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

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

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

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

希望这会有所帮助。

于 2009-06-16T17:43:48.317 回答
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 邮政编码纬度/经度接近距离搜索

于 2009-06-16T17:07:30.713 回答
2

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

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

于 2009-06-16T17:06:20.543 回答
2

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

如果不是,并且精度不是问题,您可以在框中进行搜索而不是按半径进行搜索,因为这会非常快。否则,事情会变得复杂,因为从经纬度 -> 距离的实际转换需要在投影空间中发生(因为距离在地球的不同区域发生变化),并且生活变得相当糟糕。

于 2009-06-16T17:07:22.400 回答
1

我不记得我脑海中浮现的方程式,但Haversine公式是用来计算地球上两点之间的距离的。你可以谷歌这个方程,看看它是否能给你任何想法。抱歉,我知道这没有多大帮助,但也许它会给你一个开始的地方。

于 2009-06-16T17:06:52.713 回答
0

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

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

记住毕达哥拉斯是 sqrt(x_dist^2 + y_dist^2)。

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

于 2009-06-16T18:07:11.960 回答