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

更换Mercator投影后Cartopy无法绘制海岸线的问题咨询

问题描述

我尝试绘制地中海北部区域的海岸线,使用ccrs.PlateCarree投影的脚本可正常运行并生成带海岸线的图像:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from sys import exit as sys_exit


def main():
    plt.figure(dpi=600)
    ax = plt.axes(projection=ccrs.PlateCarree())

    lon1, lon2, lat1, lat2 = 12., 16., 43.3, 46.
    ax.set_extent([lon1, lon2, lat1, lat2], crs=ccrs.PlateCarree())
    ax.coastlines()

    plt.savefig('test.pdf')
    plt.close()

    return 0


if __name__ == '__main__':
    sys_exit(main())

但将投影替换为ccrs.Mercator后(如下脚本),生成的图像为空白,请问我哪里操作错误?

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from sys import exit as sys_exit


def main():
    plt.figure(dpi=600)
    ax = plt.axes(projection=ccrs.Mercator())

    lon1, lon2, lat1, lat2 = 12., 16., 43.3, 46.
    ax.set_extent([lon1, lon2, lat1, lat2], crs=ccrs.Mercator())
    ax.coastlines()

    plt.savefig('test.pdf')
    plt.close()

    return 0


if __name__ == '__main__':
    sys_exit(main())
问题解决

错误出在ax.set_extent的crs参数设置上。你传入的边界值(12.,16.,43.3,46.)是地理经纬度坐标,对应的投影是ccrs.PlateCarree(),而非ccrs.Mercator()。

set_extent方法的第二个crs参数,作用是声明输入的边界坐标所属的投影系统,不是当前轴使用的投影系统。当你错误地用Mercator作为这个参数时,Cartopy会把这些经纬度数值当作Mercator投影下的坐标值解析,导致视野定位到了完全无关的区域,所以图像显示空白。

修改后的正确代码如下:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from sys import exit as sys_exit


def main():
    plt.figure(dpi=600)
    ax = plt.axes(projection=ccrs.Mercator())

    lon1, lon2, lat1, lat2 = 12., 16., 43.3, 46.
    # 输入的是经纬度坐标,因此crs设为PlateCarree
    ax.set_extent([lon1, lon2, lat1, lat2], crs=ccrs.PlateCarree())
    ax.coastlines()

    plt.savefig('test.pdf')
    plt.close()

    return 0


if __name__ == '__main__':
    sys_exit(main())

内容的提问来源于stack exchange,提问作者SteP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:02:51