返回

地图绘制中的投影和坐标系:解决 GeoPandas 和 Altair 中的翻转问题

python

绘制地图的投影和坐标系:解决 GeoPandas 和 Altair 中的翻转问题

问题:为什么我的地图翻转了?

绘制地图时,如果投影不正确,可能会导致地图翻转。投影将地球的球形表面转换为二维地图,不同的投影使用不同的数学方法来执行此转换,产生具有特定失真和特性的地图。坐标系定义了地图上点的位置,最常见的是经纬度(纬度和经度)或通用横轴墨卡托(UTM)。

当数据和绘图框架使用不同的投影或坐标系时,就会出现问题。例如,数据可能以 WGS84 地理坐标系存储,而绘图框架可能使用阿尔伯斯美国等距投影。这会导致地图翻转,因为两个投影对地球表面具有不同的视图。

解决方法

要解决翻转绘图问题,请确保:

  • 数据和绘图框架使用相同的投影。
  • 在数据中设置正确的坐标系。
  • 在绘图框架中设置正确的投影。

如何在 GeoPandas 中设置投影

GeoPandas 是一个用于处理空间数据的 Python 库。它提供了对地理数据进行投影和转换的能力。可以通过设置 crs 属性来指定数据框的坐标系,如下所示:

london_wards_gpd.crs = {'init': 'epsg:4326'}  # WGS84 地理坐标系

如何在 Altair 中设置投影

Altair 是一个用于创建交互式可视化的 Python 库。它提供了对投影的支持,可以通过 project() 方法指定投影类型,如下所示:

chart.project('albersUsa')  # 阿尔伯斯美国等距投影

示例:使用 GeoPandas 和 Altair 绘制伦敦地图

以下示例演示了如何使用 GeoPandas 和 Altair 绘制伦敦地图,并解决投影问题:

import geopandas as gpd
import altair as alt

# 加载伦敦行政区数据
london_wards_shp = gpd.read_file('london_wards.shp')

# 设置数据框的坐标系
london_wards_gpd = london_wards_shp.set_crs(epsg=4326)

# 创建 Altair 地图
london_wards_map = alt.Chart(london_wards_gpd).mark_geoshape(
    fill=None,  # 无填充
    stroke='darkgray',  # 深灰色描边
    strokeWidth=1  # 描边宽度
).encode(
    tooltip='NAME:N'  # 名称提示
).properties(
    width=800,
    height=600
).project(
    type='identity'  # 保持原始投影
)

# 显示地图
london_wards_map

常见问题解答

1. 我如何确定使用哪个投影?

最佳投影取决于您的特定应用程序。对于全球地图,通常使用麦卡托或罗宾逊投影。对于局部地图,可以使用等距投影,如阿尔伯斯美国等距投影或横轴墨卡托投影。

2. 为什么我的地图上有些区域丢失?

这可能是由于您的数据未完全投影到您的目标投影引起的。确保您的数据包含所有必需的坐标,并且您的目标投影与您的数据兼容。

3. 我如何转换数据的坐标系?

可以使用 GeoPandas 的 to_crs() 方法转换数据的坐标系。例如:

london_wards_gpd = london_wards_gpd.to_crs(epsg=3857)  # 转换为 Web 墨卡托投影

4. 我如何在 Altair 中添加图例?

可以使用 Altair 的 legend 方法添加图例。例如:

london_wards_map.add_legend(
    orient='bottom',  # 图例位置
    title='London Wards'  # 图例标题
)

5. 我如何导出地图?

可以使用 Altair 的 save() 方法导出地图为图像或 SVG 文件。例如:

london_wards_map.save('london_wards_map.png')  # 导出为 PNG 图像

结论

通过了解投影和坐标系,并使用 GeoPandas 和 Altair 的适当功能,可以避免在绘制地图时出现翻转绘图和投影问题。这将确保您的地图准确且易于解释。