提问人:Sterling Butters 提问时间:2/26/2019 最后编辑:Sterling Butters 更新时间:7/22/2021 访问量:32971
Python:计算两个纬度/经度之间的方位角
Python: Calculate bearing between two lat/long
问:
我正在尝试计算两个纬度/经度之间的方位角。
我对函数/公式本身没有疑问,
提供:
def get_bearing(lat1, long1, lat2, long2):
dLon = (long2 - long1)
y = math.sin(dLon) * math.cos(lat2)
x = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dLon)
brng = math.atan2(y, x)
brng = np.rad2deg(brng)
return brng
问题是结果不是预期的。
该函数的预期用法返回(非常长)列表中两个纬度/经度对之间的方位角,即
lat1 = path[int(len(path) * location / 1000)][0]
lat2 = path[int(len(path) * location / 1000) + 1][0]
lng1 = path[int(len(path) * location / 1000)][1]
lng2 = path[int(len(path) * location / 1000) + 1][1]
然后,方位角结果会改变图的视图方向,其中方位角可以假定 [-180, 180] 范围内的值。理想情况下,结果应使得 lat1、lng1 和 lat2、lng2 之间形成的线在图中完全“垂直”(lat/lon 注释在图中切换),见下文
我希望有人能够从函数返回的轴承以及预期的轴承应该是什么来推断出问题。以下是几个实例:
Current Location: 30.07134 -97.23076
Next in path: 30.0709 -97.22907
Calculated Bearing: 88.39967863143139
Expected Bearing: ~-70.67
Current Location: 29.91581 -96.85068
Next in path: 29.91556 -96.85021
Calculated Bearing: 118.9170342272798
Expected Bearing: ~122.67
Current Location: 29.69419 -96.53487
Next in path: 29.69432 -96.53466
Calculated Bearing 141.0271357781952
Expected Bearing: ~56
Current Location: 29.77357 -96.07924
Next in path: 29.77349 -96.07876
Calculated Bearing 165.24612555483893
Expected Bearing: ~104
很乐意提供更多信息,提前感谢您的任何/所有帮助。
答:
46赞
J. Taylor
2/26/2019
#1
您是否考虑过使用 pyproj
进行计算而不是滚动自己的计算?
import pyproj
geodesic = pyproj.Geod(ellps='WGS84')
fwd_azimuth,back_azimuth,distance = geodesic.inv(long1, lat1, long2, lat2)
在这个例子中,是你所追求的轴承,是反向轴承(方向相反)。fwd_azimuth
back_azimuth
我在这里使用了 WGS84,因此您需要替换为正确的坐标系,并且需要重写确保纬度/经度是 geodesic.inv()
的正确坐标类型。但是,使用经过充分测试的现有地理空间库可能会为您省去很多麻烦。
评论
1赞
Sterling Butters
2/26/2019
我得到了一个回报,那就是 , ..., 等等 - 我肯定想使用地理空间库,但我不想处理特殊问题,对 ?nan
fwd_azimuth
float(lat)
float(lon)
nan
0赞
J. Taylor
2/26/2019
您使用什么坐标系来输入纬度/经度对?查看 pyproj 的 API 文档,了解它们如何表示纬度/经度。就像我上面说的,你必须修改你的代码,以这种格式传入纬度/经度。
0赞
Sterling Butters
2/26/2019
tbh, idk - 我正在使用 Plot.ly 的对象,但我在他们的引用中找不到任何内容:plot.ly/python/reference/#scattermapbox。我猜它与 GoogleMaps 相同,因为他们的 API 可以很好地与 .ScatterMapBox
ScatterMapBox
Google Maps and Microsoft Virtual Earth use a Mercator projection based on the World Geodetic System (WGS) 1984 geographic coordinate system (datum).
2赞
Sterling Butters
2/26/2019
我找到了一个我喜欢的库(geographiclib),并且有效!我会投票支持你的答案,因为你引导我朝着这个方向前进
3赞
Markus Kaukonen
7/9/2020
你有错误的纬度和长度,请参阅其中的 pyproj4.github.io/pyproj/stable/api/geod.html,例如: >>> from pyproj import Geod >>> g = Geod(ellps='clrk66') # 使用 Clarke 1866 椭圆体。>>> boston_lat = 42.+(15./60.);boston_lon = -71.-(7./60.) >>> portland_lat = 45.+(31./60.);portland_lon = -123.-(41./60.) >>> # 计算前后方位角,加上波士顿和波特兰之间的距离 >>> #。>>> az12,az21,dist = g.inv(boston_lon,boston_lat,portland_lon,portland_lat) >>> “%7.3f %6.3f %12.3f” % (az12,az21,dist) '-66.531 75.654 4164192.708'
10赞
Sterling Butters
2/26/2019
#2
最终更改了功能:
from geographiclib.geodesic import Geodesic
...
def get_bearing(lat1, lat2, long1, long2):
brng = Geodesic.WGS84.Inverse(lat1, long1, lat2, long2)['azi1']
return brng
评论
0赞
Levi Baguley
7/7/2021
此文档链接解释了从 geographiclib.sourceforge.io/1.52/python/interface.html 返回的字典Geodesic.WGS84.Inverse
2赞
Omkar Mestry
7/16/2020
#3
你可以试试这个名为Turfpy的新包,它是python中turf.js的移植。
from turfpy import measurement
from geojson import Point, Feature
start = Feature(geometry=Point((-75.343, 39.984)))
end = Feature(geometry=Point((-75.534, 39.123)))
measurement.bearing(start,end)
https://pypi.org/project/turfpy/
10赞
aliff danial
11/9/2020
#4
查找方位的代码很好。但是你只需要在找到 X 和 Y 时添加 math.radians。
import numpy
import math
def get_bearing(lat1, long1, lat2, long2):
dLon = (long2 - long1)
x = math.cos(math.radians(lat2)) * math.sin(math.radians(dLon))
y = math.cos(math.radians(lat1)) * math.sin(math.radians(lat2)) - math.sin(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.cos(math.radians(dLon))
brng = numpy.arctan2(x,y)
brng = numpy.degrees(brng)
return brng
评论
0赞
Wolkenarchitekt
7/13/2021
代码片段缺少导入 - 从哪里导入,应该是numpy吗?arctan2
degrees
0赞
aliff danial
7/16/2021
是的,它是从 numpy 导入的。对不起,我没有把它放在那里。@Wolkenarchitekt
下一个:python 中的矩阵镜像
评论