Matplotlib 从几何坐标中获取投影坐标

Matplotlib 从几何坐标中获取投影坐标,matplotlib,cartopy,Matplotlib,Cartopy,我用Cartopy和Matplotlib渲染了一个地图图形。我有一个特定的几何坐标(lat/lon),我想知道最接近该几何坐标投影的像素坐标(如果可见),例如在地图上的坐标上绘制图形 (注意,我不想使用Matplotlib绘制;我将图形导出为位图图像,并在管道的不同部分绘制。) 可能是这样的: import cartopy,matplotlib.pyplot fig=matplotlib.pyplot.figure() ax=图添加轴([0,0,1,1],投影=cartopy.crs.Ortho

我用Cartopy和Matplotlib渲染了一个地图图形。我有一个特定的几何坐标(lat/lon),我想知道最接近该几何坐标投影的像素坐标(如果可见),例如在地图上的坐标上绘制图形

(注意,我不想使用Matplotlib绘制;我将图形导出为位图图像,并在管道的不同部分绘制。)

可能是这样的:

import cartopy,matplotlib.pyplot
fig=matplotlib.pyplot.figure()
ax=图添加轴([0,0,1,1],投影=cartopy.crs.Orthographic())
ax.add_特征(cartopy.feature.LAND,facecolor='black')
#在显示坐标中打印纽约市的位置
朗,拉特=-74.0060,40.7128
trans=cartopy.crs.Geodetic()。\u作为\u mpl\u变换(ax)
x、 y=横向变换((纵向,横向))
打印(x,y)
#还是这样
projx,projy=ax.projection.transform_point(lon,lat,cartopy.crs.Geodetic())
x、 y=ax.transData.transform((projx,projy))
打印(x,y)
有趣的是,如果我画这一点,图的中心在曼哈顿,然后输出显示坐标确实在图的中心(640480)


我刚刚发现,直到图形处于最终状态,变换才被正确设置。所以关键是要先画出这个图,

fig.canvas.draw()
或者至少正确地应用这个方面

ax.apply_aspect()
然后你会得到正确的像素坐标

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

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.PlateCarree())
ax.add_feature(cartopy.feature.LAND, facecolor='black')
ax.set_global()

# before being able to call any of the transforms, the figure needs to be drawn
fig.canvas.draw()
# or
# ax.apply_aspect()

# Print the location of New York City in display coordinates
lon, lat = -74.0060, 40.7128
trans = ccrs.PlateCarree()._as_mpl_transform(ax)
x, y = trans.transform_point((lon, lat))
print(x,y)

plt.show()
这张照片是:

188.43377777777778 312.3783111111111

请注意,这些坐标是指左下角的像素。

在我的示例代码中,我没有指定贴图的范围。如果我加上

ax.set_global()
然后,变换后的坐标是合理的


我介绍了两种计算变换坐标的方法,但是当纽约市不可见时,使用
\u as\u mpl\u transform()
的方法似乎会返回中心点。使用
ax.projection.transform\u point()
的方法在屏幕外返回NaN。

您似乎无法添加Cartopy投影和Matplotlib变换对象,尽管查看它可能类似于
trans=Cartopy.crs.Geodetic()。\u as\u mpl\u transform(ax)+ax.transData
,但值仍然错误。我将为这个问题添加一个例子。是的,需要进行
\u-as\u-mpl\u转换
。我更新了答案。
188.43377777777778 312.3783111111111