如何将Matplotlib点击事件数据转换为Cartopy地图经纬度坐标
解决Cartopy图表点击获取经纬度的问题
你遇到的核心问题是:点击事件返回的event.xdata/event.ydata是当前图表采用的**投影坐标系(这里是Sinusoidal)**下的坐标,并非地理经纬度。需要通过Cartopy的坐标转换工具,将其转换为通用的经纬度坐标系(ccrs.PlateCarree())。
修改后的完整代码
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): # 仅处理点击在当前图表坐标轴内的事件 if event.inaxes != ax: return # 将投影坐标系下的坐标转换为经纬度(PlateCarree) lon, lat = ccrs.PlateCarree().transform_point(event.xdata, event.ydata, ax.projection) # 在点击位置绘制标记(两种方式二选一即可) # 方式一:用投影坐标绘制(和原代码逻辑一致) ax.scatter(event.xdata, event.ydata, color='red', marker='o') # 方式二:用经纬度绘制,需指定crs参数 # ax.scatter(lon, lat, color='red', marker='o', crs=ccrs.PlateCarree()) fig.canvas.draw() # 打印经纬度信息 print(f"纬度(Latitude): {lat:.4f}, 经度(Longitude): {lon:.4f}") cid = fig.canvas.mpl_connect('button_press_event', onclick) plt.show()
关键说明
- 坐标转换逻辑:
ccrs.PlateCarree().transform_point(x, y, source_crs)方法会把source_crs(这里是图表的Sinusoidal投影)下的(x,y)坐标,转换为PlateCarree坐标系的经纬度(注意返回顺序是经度在前,纬度在后)。 - 无效点击过滤:加入
event.inaxes != ax的判断,避免点击图表空白区域时触发错误。 - 标记绘制:如果用经纬度绘制点,必须显式指定
crs=ccrs.PlateCarree(),否则Cartopy会默认用当前图表的投影坐标系解析传入的数值,导致位置错误。
内容的提问来源于stack exchange,提问作者jnb_426
相关产品推荐
相关产品推荐

