1

我正在使用 PHP 作为服务器脚本语言和 MySQL 作为数据库创建一个具有地理邻近搜索功能的应用程序。

考虑一种情况:

我们有特定的一组对象,这些对象具有与各个对象相关联的纬度和经度位置。在指定位置详细信息(如国家和/或城市)以及 KM 中的范围/半径时,我们使用 MySQL 查询获取位于该半径/范围内的对象,例如:

SELECT [columns] 
FROM [column] 
WHERE 1=1 
AND 3963.191 * 
    ACOS(
    (SIN(PI() * [latitude] / 180) * SIN(PI() * [column].latitude / 180)) + 
    (COS(PI() * [latitude] /180) * cos(PI() * [column].latitude / 180) * COS(PI() * [column].longitude / 180 - PI() * [longitude] / 180)) ) 
    <= 10

以上计算将给出距离地球上国家/城市中心点 10 公里范围内的对象。

现在假设我有一个对象(带有纬度和经度)不在这 10 公里的区域内,但例如距离地球上的国家/城市中心点 15 公里。该对象的服务范围为 10 KM(提供服务范围为 10 KM 区域)。

现在的问题是,如果我正在寻找距国家/城市中心点 10 公里范围内的对象,那么服务范围为 10 公里的对象(距国家/城市中心点 15 公里)也应包括在搜索中。

我怎样才能使它成为可能?我有国家/城市中心纬度、长坐标、范围/半径(我们必须在其中找出对象)和具有交付半径的对象(例如 10 公里)及其相应的坐标。

你能指导我如何使用 PHP、MySQL 做到这一点吗?

4

1 回答 1

3

使用 MySQL 空间扩展 http://dev.mysql.com/doc/refman/5.1/en/spatial-extensions.html

另一方面,如果您只想识别与给定圆相交的其他圆,它们将是所有这些圆,因为圆心之间的距离小于半径之和。换句话说,假设您的原始点和范围由三元组 ( x 0 , y 0 , r 0 ) 给出,您需要所有 ( x n , y n , r n )

√(( x 0 - x n )² + ( y 0 - y n )²) ≤ r 0 + r n

于 2009-03-04T13:20:56.740 回答