使用纬度和经度计算40公里的半径

13

这是链接:https://dev59.com/BHVD5IYBdhLWcg3wTJrF - Sergey Benner
可能是多个纬度/经度点的半径的重复问题(以及其他约25个问题,请参见“相关”侧栏。这个看起来是一个完全相同的问题:https://dev59.com/_1nUa4cB1Zd3GeqPed39) - Piskvor left the building
1
尝试使用这个类,它可以很好地工作:http://opengeodb.giswiki.org/wiki/GeoClass - Abadon
1个回答

43

我使用这个查询来获取在以$lat/$lng为中心,$radius半径范围内的所有点:

SELECT
    *,
    ( 6371 * acos( cos( radians({$lat}) ) * cos( radians( `lat` ) ) * cos( radians( `lng` ) - radians({$lng}) ) + sin( radians({$lat}) ) * sin( radians( `lat` ) ) ) ) AS distance
FROM `positions`
HAVING distance <= {$radius}
ORDER BY distance ASC

6371是地球半径,单位为公里。我并没有发明它:http://code.google.com/intl/en/apis/maps/articles/phpsqlsearch.html https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql(编辑:URL已更改)


地球半径以英里为单位为 3959 - 只需将数字替换为该值,您的结果将以英里而不是公里为单位。 - DerVO
@AshifShereef 两个值都在-180到+180之间,例如对于哈德逊河中的任意点$lat = -74.016617; $lng = 40.747933; - DerVO
@DerVO 我问的是这个单位是度、弧度还是秒。 - Ashif Shereef
1
@AshifShereef 而且 - 至少我认为 - 我已经回答了你,它是十进制度数(https://en.wikipedia.org/wiki/Decimal_degrees) - DerVO
选择 s.,(((acos(sin(($latitudepi()/180)) * sin((s.latpi()/180))+cos(($latitudepi()/180)) * cos((s.lat*pi()/180)) * cos((($longitude - s.lang)*pi()/180))))180/pi())601.15151.609344) AS distance FROM (tbl_area as s) HAVING distance <= 40 ORDER BY s.id DESC我编写了这个查询来获取所有在40公里范围内的区域列表。它对我很有效。您可以根据需要更改表名。 - vaibhav kulkarni
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接