AI 摘要

喵呜~小凡君m的小猫娘来啦!你知道吗?地图投影就像是将地球“压扁”成二维平面的魔法!不同的投影方式有着不同的“魔法效果”哦,有的适合航海,有的适合展示全球,还有的能从太空视角看地球呢!(◕ᴗ◕✿) 来看看这些魔法是如何施展的吧,跟着小猫娘一起探索地图的奇妙世界!喵呜~ (ฅ´ω`ฅ)

不同投影方式的原理和适用情况

地图投影是将地球的三维表面投影到二维平面上的方法。由于地球是球体,而地图是平面,投影过程中不可避免地会产生变形。不同的投影方式适用于不同的应用场景,以下是几种常见投影方式的原理和适用情况:


1. 等距圆柱投影(Plate Carree)

  • 原理:将地球的经纬度直接映射到平面直角坐标系,经线和纬线都是等距的平行直线。
  • 特点
    • 简单直观,易于计算。
    • 高纬度地区变形严重,面积和形状失真。
  • 适用情况
    • 适用于小范围地图或需要简单投影的场景。
    • 常用于地理信息系统(GIS)和遥感影像的初始处理。

2. 罗宾逊投影(Robinson)

  • 原理:一种折衷投影,试图在面积、形状和距离之间取得平衡。
  • 特点
    • 全球地图的整体视觉效果较好。
    • 高纬度地区仍有变形,但比等距圆柱投影更合理。
  • 适用情况
    • 适用于世界地图的展示。
    • 常用于教育和出版领域。

3. 墨卡托投影(Mercator)

  • 原理:将地球投影到一个圆柱体上,然后展开圆柱体。
  • 特点
    • 保持方向和角度的准确性,适合航海导航。
    • 高纬度地区面积变形严重,极地地区无法显示。
  • 适用情况
    • 适用于航海和航空导航。
    • 常用于网络地图(如 Google Maps)。

4. 正射投影(Orthographic)

  • 原理:将地球投影到一个切平面上,类似于从太空看地球的效果。
  • 特点
    • 视觉效果逼真,适合展示半球或局部区域。
    • 仅能显示地球的一部分,边缘变形严重。
  • 适用情况
    • 适用于展示半球或局部区域。
    • 常用于科学可视化或艺术效果图。

示例代码分块说明

1. 导入库

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
  • 功能:导入所需的库。
    • cartopy.crs:用于定义地图投影。
    • cartopy.feature:用于添加地理特征(如海岸线、国界线等)。
    • matplotlib.pyplot:用于绘图。

2. 设置 matplotlib 的字体和符号显示

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
  • 功能:设置 matplotlib 的中文字体和解决负号显示问题。
    • SimHei 是一种常用的中文字体。
    • axes.unicode_minus=False 确保负号正常显示。

3. 定义投影方式和标题

projections = [
    ccrs.PlateCarree(),
    ccrs.Robinson(),
    ccrs.Mercator(),
    ccrs.Orthographic(central_longitude=0, central_latitude=90)
]

titles = ['等距圆柱投影', '罗宾逊投影', '墨卡托投影', '正射投影(北极视角)']
  • 功能:定义四种投影方式和对应的标题。

4. 创建子图布局

fig, axes = plt.subplots(2, 2, figsize=(14, 10),
                         subplot_kw={'projection': projections[0]})
  • 功能:创建一个 2x2 的子图布局,设置整体画布大小为 14x10,并初始化第一个子图的投影方式。

5. 遍历子图并设置投影方式

for i, ax in enumerate(axes.flat):
    ax.remove()  # 移除默认的子图
    ax = fig.add_subplot(2, 2, i+1, projection=projections[i])  # 重新添加子图,并设置投影方式
    
    ax.set_global()  # 设置地图范围为全球
    
    # 添加地理特征
    ax.add_feature(cfeature.COASTLINE, linewidth=0.5)  # 添加海岸线
    ax.add_feature(cfeature.BORDERS, linestyle=':', linewidth=0.5)  # 添加国界线
    ax.add_feature(cfeature.LAND, edgecolor='black', facecolor='lightgray')  # 添加陆地
    ax.add_feature(cfeature.OCEAN, facecolor='lightblue')  # 添加海洋
    
    # 添加网格线
    ax.gridlines(linestyle='--', color='gray', linewidth=0.5)
    
    # 设置子图标题
    ax.set_title(titles[i], fontsize=12, pad=10)
  • 功能:遍历每个子图,设置不同的投影方式,并添加地理特征和网格线。

6. 调整子图布局

plt.tight_layout()
  • 功能:自动调整子图之间的间距,避免重叠。

7. 显示绘图

plt.show()
  • 功能:显示绘图窗口。


我是谁?我在哪?我在干什么?
最后更新于 2025-03-02