如何在Python中找到距离给定经纬度500米以内的用户位置

4

我希望在Python中查找距离给定的纬度和经度500米以内的用户位置。

给定的纬度和经度为19.114315,72.911174

我想要检查新的纬度和经度是否在距离给定的纬度和经度500米范围内。

新的纬度和经度为19.112398,72.912743

我正在使用以下公式:

math.acos(math.sin(19.114315) * math.sin(19.112398) + math.cos(19.114315) * math.cos(19.112398) * math.cos(72.912743 - (72.911174))) * 6371 <= 0.500 

但它没有给我预期的结果.. 我有什么遗漏吗? 请帮忙。。

嗯,math.sin()math.cos()需要弧度而不是角度 - Dmitry Bychenko
我可以在Python中将其转换为弧度吗? - Neil
1
是的,你可以在Python中进行乘法运算。 如果你将一个角度数与约0.0174532925相乘,就可以得到它的弧度值。(2*PI / 360) - Henrik
@user2927983 请参考这个问题的被接受的答案。基本上,使用math.radians(degrees)即可。 - Peter Wood
1
不算真正的答案,但我发现使用Python的haversine模块非常容易且足够准确:from haversine import haversine; distance_km = haversine((lat_a, lng_a), (lat_b, lng_b)) .. 像往常一样 pip install haversine ;) - smassey
3个回答

1
你可以使用Haversine公式来计算两点之间的大圆距离(沿着球体)。对于处理地球作为一个球体的距离问题存在一些问题,但对于500米,你可能没问题(假设你不是试图将医疗包裹投放到船上或其他情况)。
from math import radians, sin, cos, asin, sqrt

def haversine(lat1, long1, lat2, long2, EARTH_RADIUS_KM=6372.8):

    # get distance between the points
    phi_Lat = radians(lat2 - lat1)
    phi_Long = radians(long2 - long1)

    lat1 = radians(lat1)
    lat2 = radians(lat2)

    a = sin(phi_Lat/2)**2 + \
        cos(lat1) * cos(lat2) * \
        sin(phi_Long/2)**2

    c = 2 * asin(sqrt(a))
    return EARTH_RADIUS_KM * c

如果两点之间的距离小于您的阈值,则在范围内。
points_1 = (19.114315,72.911174)
points_2 = (19.112398,72.912743)
threshold_km = 0.5


distance_km = haversine(points_1[0], points_1[1], points_2[0], points_2[1])
if distance_km < threshold_km:
    print('within range')
else:
    print('outside range')

0
提示:编写可重用的代码,并清理您的数学计算。 看起来你有一个错误,就在那个公式的末尾附近。 math.cos(longRad - (longRad)) == math.cos(0) == 1
我不擅长地理方面的知识,所以我不会纠正它。
import math

def inRangeRad(latRad, longRad):
    sinLatSqrd = math.sin(latRad) * math.sin(latRad)
    cosLatSqrd = math.cos(latRad) * math.cos(latRad)
    inner = sinLatSqrd +  cosLatSqrd * math.cos(longRad - (longRad))
    return math.acos( inner ) * 6371 <= 0.500

def inRangeDeg(latDeg, longDeg):
    latRad = 0.0174532925 * latDeg
    longRad = 0.0174532925 * longDeg
    return inRangeRad(latRad, longRad)

print "test"
print "19.114315, 72.911174"
print inRangeDeg(19.114315, 72.911174)

0
非常小心!您不能仅使用cossin来计算GPS坐标的距离,因为这样得出的距离是不正确的!

https://en.wikipedia.org/wiki/Geodesy#Geodetic_problems

在平面几何(适用于地球表面的小区域)的情况下,这两个问题的解决方案都可以简化为简单的三角学。在球体上,解决方案要复杂得多,例如,在反问题中,连接大圆弧即测地线的两个端点之间的方位角将不同。请查看GeoPy进行这些计算,您真的不想自己实现它。

1
在500米内,他/她会没问题的。 - user559633
@mirosval 我不需要精确的范围,带有一定误差的近似范围对我来说也可以。 - Neil
1
也许吧,但这种有缺陷的逻辑会在后面引起问题。明天我需要计算更大的距离,然后我就会重复使用这个解决方案,忘记了这一点... - mirosval
@mirosval 那么这个问题的正确解决方法是什么? - Neil
使用已经解决了这个问题并且经过充分测试的库。我在答案中提供的 GeoPy 库在 PyPI 上标记为 Production/Stable。它能够避免你重新发明轮子并自己编写代码时出现的任何数字错误,另外还实现了一种更准确的方法来计算地球上的距离。 - mirosval

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