返回

在地图正射投影中准确获取经纬度坐标:鼠标单击事件坐标转换指南

python

在地图正射投影中使用鼠标单击事件获取经纬度坐标

问题

作为地理数据分析师,在地图正射投影中获取特定点的经纬度坐标至关重要。Cartopy 库为正射投影提供了强大的功能,但是,直接使用鼠标单击事件得到的坐标往往不准确。本文将深入探讨如何解决这一问题,并提供一个全面的 Python 代码示例。

解决方案

要正确获取经纬度坐标,关键在于理解坐标系之间的转换。Cartopy 正射投影使用的是 Plate Carree 坐标系,而鼠标单击事件返回的是数据坐标。我们需要使用 transform_points 方法将数据坐标转换到地理坐标系。

修改后的 Python 代码如下:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from matplotlib.backend_bases import MouseButton

longitude = -90
latitude = 30

def on_click(event):
    if event.button is MouseButton.LEFT:
        # 转换点击事件的坐标到地理坐标系
        lon, lat = ax.transData.transform_point([event.xdata, event.ydata])
        print(f'Geographic coords: {lon}, {lat}')

img = 'map.png'

projection = ccrs.Orthographic(central_longitude=longitude, central_latitude=latitude)
fig, ax = plt.subplots(subplot_kw={'projection': projection})

a = ax.imshow(plt.imread(img), origin='upper', extent=[-180, 180, -90, 90], transform=ccrs.PlateCarree())

plt.connect('button_press_event', on_click)

plt.show()

代码解析

  • ax.transData.transform_point() 方法将点击事件中的数据坐标转换为地理坐标。
  • 转换后的经度和纬度坐标将被打印到控制台中。
  • 确保地图图像的原点设置为 "upper",以正确显示图像。

目标读者

本篇文章面向地理数据分析师、制图师和 GIS 开发人员。它假设读者对 Python、Cartopy 和正射投影有一定了解。

常见问题解答

  1. 为什么鼠标单击事件返回的坐标不正确?
    答:默认情况下,鼠标单击事件返回的是数据坐标,而不是地理坐标。我们需要使用 transform_points 方法进行转换。

  2. 如何选择正射投影的中心点?
    答:中心点通常选择为感兴趣区域的中心或特定地点。它会影响投影的视角和失真程度。

  3. 如何处理地图图像的边界?
    答:在使用 imshow 显示地图图像时,指定 extent 参数可以设置图像的边界。这对于防止超出地图范围的点击事件很有用。

  4. 我可以使用其他坐标系吗?
    答:是的,Cartopy 支持各种坐标系。你可以根据需要修改 projection 变量以使用不同的坐标系。

  5. 如何将鼠标单击事件中的坐标转换为不同的单位?
    答:transform_points 方法还允许你指定输出坐标的单位。你可以使用 units 参数将其转换为度、米或其他单位。