微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mysql Haversine过程半径使用中心点

如何解决Mysql Haversine过程半径使用中心点

| 我是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;
    

解决方法

        您可以采用与碰撞检测样式算法相同的方法进行处理。通过找到一个点的最小和最大纬度/经度(给定半径),检查坐标是否在边界框内,并确保搜索满足快速评估标准(例如
lat <= 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)))<= 0.1570;      大多数查询优化器足够聪明   快速执行索引扫描   找到满意的地方(Lat> = 1.2393 然后继续执行一些其他检查。在此主题下,有一些替代方法可用于同一主题。 这对您有帮助吗?看来您有技巧自己将其编写为一个过程,但是如果您愿意,我可以尝试为您编写一个过程。如果是这样,您可以粘贴/发布表或SQL批处理脚本。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。