我想在距离给定的lat和500长度的Python内找到一个用户位置。
鉴于lat& long = 19.114315,72.911174
我想检查新的纬度和长度是否在距给定纬度和长度500米的范围内。
new lat and long = 19.112398,72.912743
我在python中使用这个公式..
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
但它没有给我预期的结果..我错过了什么吗? 请帮忙..
答案 0 :(得分: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')
答案 1 :(得分: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)
答案 2 :(得分:0)
要非常小心!您不能仅使用cos
和sin
来使用GPS坐标,因为距离不正确!
https://en.wikipedia.org/wiki/Geodesy#Geodetic_problems
在平面几何的情况下(适用于地球上的小区域) 表面)这两个问题的解决方案简化为简单的三角学。 在球体上,解决方案明显更复杂,例如,在 方位角在两端之间会有所不同的反问题 连接大圆的点,弧,即测地线。
查看GeoPy这些计算,你真的不想自己实现它。