我正在使用Python的Cartopy和Matplotlib库进行一个项目,以绘制方位等距投影上两点之间的大圆路径。
下面是我正在使用的Python代码:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np
def great_circle_points(lat1, lon1, lat2, lon2, num_points):
lat1, lon1, lat2, lon2 = np.radians([lat1, lon1, lat2, lon2])
dlat = lat2 - lat1
dlon = lon2 - lon1
fractions = np.linspace(0, 1, num_points)
a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2
delta_sigma = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
lat = np.arctan2(
np.sin(lat1) * np.cos(delta_sigma * fractions) + np.sin(lat2) * np.sin(delta_sigma * fractions),
np.sqrt((np.cos(lat1) + np.cos(lat2) * np.cos(delta_sigma * fractions))**2 + (np.cos(lat2) * np.sin(delta_sigma * fractions))**2)
)
lon = lon1 + np.arctan2(
np.sin(delta_sigma * fractions) * np.sin(lon2 - lon1),
np.cos(lat1) * np.cos(delta_sigma * fractions) - np.sin(lat1) * np.sin(delta_sigma * fractions) * np.cos(lon2 - lon1)
)
lat = np.degrees(lat)
lon = np.degrees(lon)
return lat, lon
lat1, lon1 = -33.9715, 18.6021 # Cape Town
lat2, lon2 = -42.8364, 147.5075 # Hobart
num_points = 1001
latitudes, longitudes = great_circle_points(lat1, lon1, lat2, lon2, num_points)
plt.figure(figsize=[10, 10])
#ccrs.Orthographic(), ccrs.Stereographic(), ccrs.LambertAzimuthalEqualArea(), or ccrs.Gnomonic().
ax = plt.axes(projection=ccrs.AzimuthalEquidistant(central_latitude=90, central_longitude=0))
ax.set_global()
ax.coastlines()
# Plotting the great circle points.
ax.plot(longitudes, latitudes, 'r', transform=ccrs.Geodetic())
plt.plot(lon1, lat1, 'bo', markersize=7, transform=ccrs.Geodetic())
plt.plot(lon2, lat2, 'ro', markersize=7, transform=ccrs.Geodetic())
plt.show()
此代码成功地生成了一个具有海岸线的方位等距投影,并正确地绘制了表示地球上特定位置的两个点(通过纬度和经度输入指定)。这些点相对于海岸线是正确的。
然而,生成的大圆路径并不像它应该的那样在这些位置点开始和结束。相反,它似乎偏离了正确的起点和终点。
这是我当前的输出:Azimuthal Projection with incorrect great circle
我试过调整坐标,但我相信它们是正确的,因为这些点出现在Map上的正确位置。
如何调整大圆路径,使其在指定位置正确开始和结束?
提前感谢您的帮助。
我试过改变两个地点和其他一些事情,但没有成功。我期望看到的是大圆路径从一个地方开始,在另一个地方结束。
1条答案
按热度按时间wfypjpf41#
我不认为这与Matplotlib或Cartopy有任何关系,你应该先调试你的算法。
用
Pyproj
做同样的事情:沿着大圆的采样点:
可视化结果: