You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:42:47