我有一个使用 Cartopy 地图作为坐标系的绘图。我想单击绘图上的任意位置,对其进行标记,然后以纬度和经度形式返回单击点的位置。 我只是不确定如何将事件数据转换回地图坐标。
我已经阅读了Matplotlib Transformations Tutorial,但我仍然不清楚。绘图上的导航工具栏甚至显示纬度/经度坐标,但我不知道如何访问它。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
fig = plt.figure()
ax = plt.axes(projection=ccrs.Sinusoidal())
ax.set_extent([0,10,0,10], crs=ccrs.PlateCarree())
ax.gridlines(draw_labels=True,dms=True,x_inline=False,y_inline=False)
def onclick(event):
ax.scatter(event.xdata, event.ydata)
fig.canvas.draw()
# I want to print xdata and ydata in terms of Latitude and Longitude
print(event.xdata,event.ydata)
cid = fig.canvas.mpl_connect('button_press_event', onclick)
要将值转换回纬度和经度浮点数,只需在
transform_point
投影上使用 PlateCarree
方法即可。在这里,我使用网格线中的格式化程序对值进行格式化,但您显然可以按照自己喜欢的方式格式化。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.mpl.ticker import LatitudeFormatter, LongitudeFormatter
fig = plt.figure()
plot_proj = ccrs.Sinusoidal()
data_proj = ccrs.PlateCarree()
ax = plt.axes(projection=plot_proj)
ax.set_extent([0,10,0,10], crs=data_proj)
gl = ax.gridlines(draw_labels=True,dms=True,x_inline=False,y_inline=False)
def onclick(event):
ax.scatter(event.xdata, event.ydata)
fig.canvas.draw()
# Get hold of latitude and longitude as floats.
lon, lat = data_proj.transform_point(event.xdata, event.ydata, plot_proj)
# Format in degrees, minutes and seconds.
print(gl.yformatter.format_data(lat), gl.xformatter.format_data(lon))
cid = fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()
3°8′39.215″N 2°44′46.914″E
6°41′19.267″N 6°5′21.873″E
2°52′25.117″N 8°46′25.903″E