matplotlib 用Cartopy法解决方位等距投影中大圆路径与指定坐标的错位问题

rbpvctlc  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(158)

我正在使用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上的正确位置。
如何调整大圆路径,使其在指定位置正确开始和结束?
提前感谢您的帮助。
我试过改变两个地点和其他一些事情,但没有成功。我期望看到的是大圆路径从一个地方开始,在另一个地方结束。

wfypjpf4

wfypjpf41#

我不认为这与Matplotlib或Cartopy有任何关系,你应该先调试你的算法。
Pyproj做同样的事情:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import pyproj

lat1, lon1 = -33.9715, 18.6021   # Cape Town
lat2, lon2 = -42.8364, 147.5075  # Hobart
num_points = 1001

沿着大圆的采样点:

geod = pyproj.Geod(ellps="WGS84")

coords = geod.npts(lon1, lat1, lon2, lat2, num_points, initial_idx=0, terminus_idx=0)
lons, lats = zip(*coords)

可视化结果:

map_proj = ccrs.AzimuthalEquidistant(central_latitude=90, central_longitude=0)

fig, ax = plt.subplots(figsize=(6,6), subplot_kw=dict(projection=map_proj))

ax.set_global()
ax.coastlines(alpha=.4)

ax.plot(lons, lats, 'r-', transform=ccrs.Geodetic())

ax.plot(lon1, lat1, 'ro', ms=7, mec="k", transform=ccrs.Geodetic())
ax.plot(lon2, lat2, 'ro', ms=7, mec="k", transform=ccrs.Geodetic())

相关问题