将事件数据转换为投影坐标 - Matplotlib Transformation

问题描述 投票:0回答:1

我有一个使用 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)

Example Plot Output

python matplotlib cartopy coordinate-transformation map-projections
1个回答
0
投票

要将值转换回纬度和经度浮点数,只需在

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
© www.soinside.com 2019 - 2024. All rights reserved.