【问题标题】:Mysql Haversine Procedure (radius)using a center pointMysql Haversine Procedure(半径)使用中心点
【发布时间】:2011-06-15 01:40:42
【问题描述】:

我对 MySql 还很陌生,我想要创建一个程序,我可以在其中插入任何邮政编码和一段距离,然后取回该距离内的所有邮政编码。我确实找到了一个公式并试图根据我的需要重塑它,但我无法做到。我所拥有的如下。该示例来自此处http://code.google.com/apis/maps/articles/phpsqlsearch.html。但是,我不想使用 37、-122 坐标,我想使用我推送到该过程中的任何邮政编码。如果可以的话,我会开始赏金,但我必须等待。这个问题困扰了我一整天,因此感谢您的帮助。这个让我很难过,因为我相信它使用两组纬度/经度,我只想要一个中心纬度/经度的半径

SELECT state,city,zipcode,
   (3959
    * acos(
           cos(radians(37))
         * cos(radians(x(location)))
         * cos(radians(y(location)) - radians(-122))
         + sin(radians(37)) * sin(radians(x(location)))))
      AS distance
  FROM zipcodes
HAVING distance < 25
 ORDER BY distance
 LIMIT 0, 20;

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    您可以像处理碰撞检测样式算法一样处理此问题。通过从一个点找到最小和最大纬度/经度(给定半径)来检查坐标是否在边界框内,并确保搜索满足一些快速评估标准(例如lat &lt;= 1.5),然后再运行更多资源密集型检查。

    这里有一个使用 SQL 和 Java 代码的工作示例:

    http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates

    总而言之,它说:

    只需将条件与 和:

    SELECT * FROM Places WHERE
        (Lat => 1.2393 AND Lat <= 1.5532) AND (Lon >= -1.8184 AND Lon <= 0.4221)
    AND
        acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon -
    

    (-0.6981)))

    大多数查询优化器都足够聪明 快速执行索引扫描 找到满意的地方 (Lat >= 1.2393

    然后它会继续执行一些额外的检查。在此之下有一些与同一主题相同的替代方法。

    这对您有帮助吗?看起来你有能力自己把它写成一个程序,但如果你愿意,我可以试着为你写一个。如果是这样,您可以粘贴/发布您的表格或 SQL 批处理脚本。

    【讨论】:

    • 我可能也错过了你的问题的重点。您是否只是尝试使用仅使用邮政编码的现有程序搜索?如果是这种情况,请参阅我上面关于发布您的表格的评论。
    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多