【问题标题】:How to sort locations based on distance using google maps如何使用谷歌地图根据距离对位置进行排序
【发布时间】:2017-10-29 20:03:10
【问题描述】:

我在以下架构中有一个数据库:

- id INT (PRIMARY)
- address (TEXT)
- zipcode (VARCHAR)
- latitude
- longitude

我想要的是:在 PHP 中有一个函数,在传递邮政编码作为参数时,可以根据最近距离对上表中的所有条目进行排序。

我的尝试:我知道 Haversine formula 可以通过以下方式从 SQL 中获取(如 this google documentation 中所述):

SELECT *, 
( 3959 * acos( cos( radians('$lat') ) * 
cos( radians( latitude ) ) * 
cos( radians( longitude ) - 
radians('$lon') ) + 
sin( radians('$lat') ) * 
sin( radians( latitude ) ) ) ) 
AS distance FROM my_table HAVING distance < '$miles' ORDER BY distance ASC

$lat$lon$miles 可以分别替换为实际的纬度、经度和英里以进行搜索

结果:使用上面的公式输出我的结果,这似乎与我从谷歌地图得到的结果有些不同。例如,对于邮政编码 0060100631,此查询提供的距离为 5.432822479090713 英里,而使用 google map api 时,距离为10.00408 英里

http://maps.googleapis.com/maps/api/distancematrix/json?origins=00601&destinations=00631&mode=DRIVING&sensor=false

虽然我可以理解地球不是一个完美的球体,而且我得到的距离仅在几何意义上是正确的,而 google 考虑了地形、路线等,但这不适合我的用例,其中有很多位置就在附近(半径 2 英里内)。我知道a similar site 哪个实现了这个更好的方法,我只是想知道他们可能使用了哪些可能的解决方案?

编辑-我选择谷歌地图来排序位置的原因基本上是因为它在小距离的位置之间进行精确的距离计算

【问题讨论】:

  • 通过googleapis是驾驶模式,但通过Haversine公式是不遵循驾驶模式的最短路线
  • 请看我的解决方案,这就是你要找的

标签: php mysql google-maps google-maps-api-3


【解决方案1】:

我有一个使用Haversine Formula 以公里为单位计算距离的解决方案,我通过乘以 0.621 将其转换为英里。

SELECT *, ( 6371 * 2 * atan2(SQRT(POW(sin((radians(geo_lat1)-radians(geo_lat2))/2), 2) + cos(radians(geo_lat2)) * cos(radians(geo_lat1)) * POW(sin((radians(geo_lng1)-radians(geo_lng2))/2),2))
                        ,SQRT(1 - POW(sin((radians(geo_lat1)-radians(geo_lat2))/2), 2) + cos(radians(geo_lat2)) * cos(radians(geo_lat1)) * POW(sin((radians(geo_lng1)-radians(geo_lng1))/2),2)))*0.621)
                        as distance FROM my_table HAVING distance < '$miles' ORDER BY distance ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2021-03-29
    • 2017-03-28
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多