【问题标题】:Determining if a lat-long circle and a circle on a sphere overlap确定经纬度圆和球体上的圆是否重叠
【发布时间】:2010-10-11 06:18:57
【问题描述】:

我正在使用 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 做到这一点吗?

【问题讨论】:

  • 我只想说这是一段令人印象深刻的 SQL。
  • 我不认为更改为 PostGIS 而不是 MySQL 是一种选择?

标签: php mysql google-maps geocoding


【解决方案1】:

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

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

√((x0 - xn)² + (y 0 - yn)²) ≤ r0 + rn

【讨论】:

  • 这可能需要更改现有数据库架构。还有其他方法吗?
  • 老派几何学。我已经添加了公式。
  • 您好 Vartec,感谢您的及时回复。我已经编辑了我的问题,因此您可以在这种情况下为我提供更好的解决方案。提前致谢。
  • 好吧,基本上你已经有了左边,而在你的公式的右边你只有 r0。您想添加 rn ([column].range?)。换句话说,不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2014-03-30
  • 2021-10-05
  • 2019-06-12
  • 2020-01-25
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多