首页 > 编程问答 >墨卡托投影的奇怪结果

墨卡托投影的奇怪结果

时间:2024-07-24 15:57:09浏览次数:8  
标签:python cartopy mercator

我想在普里兹湾画一个SIC分布,但我发现墨卡托投影的结果很奇怪。

我画了 ccrs.SouthPolarStereo ccrs.Mercator ,想要前一个结果,但我需要在墨卡托投影中画投影,那么我该如何修改呢?

fig = plt.figure(figsize=[10, 5])
ax1 = fig.add_subplot(1, 2, 1, projection=ccrs.SouthPolarStereo())
fig.subplots_adjust(bottom=0.05, top=0.95,
                    left=0.04, right=0.95, wspace=0.02)

# Limit the map to -60 degrees latitude and below.
ax1.set_extent([-180, 180, -90, -50], ccrs.PlateCarree())

ax1.add_feature(cfeature.LAND)
cf = ax1.contourf(lon, lat, SIC[0] ,levels=np.linspace(0,1,51),cmap=cmaps.WhiteBlueGreenYellowRed,
                    transform=ccrs.PlateCarree(),extend='neither',transform_first=True)
ax1.gridlines()

ax2 = fig.add_subplot(1, 2, 2, projection=ccrs.Mercator())
fig.subplots_adjust(bottom=0.05, top=0.95,
                    left=0.04, right=0.95, wspace=0.02)
# Limit the map to -60 degrees latitude and below.


cf = ax2.contourf(lon, lat, SIC[0] ,levels=np.linspace(0,1,51),cmap=cmaps.WhiteBlueGreenYellowRed,
                    transform=ccrs.PlateCarree(),extend='neither',transform_first=True)
ax2.add_feature(cfeature.LAND)
ax2.gridlines()

plt.show()

plots


在墨卡托投影上绘制普里兹湾的海冰密集度 (SIC) 数据时遇到的奇怪结果是由于墨卡托投影固有的失真造成的。墨卡托投影旨在保持角度和形状,但代价是在远离赤道的地方拉伸了区域。因此,像普里兹湾这样靠近极地的区域在墨卡托投影中显得被严重扭曲和夸大了。

可以通过以下几种方法在仍然使用墨卡托投影的同时改善普里兹湾 SIC 数据的可视化效果:

1. 裁剪或掩盖墨卡托投影中的高纬度区域:

  • 可以设置纬度范围,排除极地地区,从而避免极端的失真。这将使能够专注于 SIC 数据在较低纬度的显示,而不会被失真所掩盖。
  • 或者,可以使用掩膜来隐藏墨卡托投影中的特定区域(例如高于 -60 度的纬度)。这将允许保留墨卡托投影,同时仅显示数据中相关的非失真部分。

2. 使用插值将数据重新投影到墨卡托投影:

  • 可以使用 cartopy.crs.Mercator() 函数的 transform 参数,将数据从其原始投影(可能是极地立体投影)重新投影到墨卡托投影。这将涉及将数据插值到新的网格上,这可能会引入一些平滑,但它会产生墨卡托投影中视觉上更准确的表示。

以下是说明这些方法的代码示例:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import numpy as np

# 示例 SIC 数据
lon = np.linspace(-180, 180, 360)
lat = np.linspace(-90, 90, 180)
lon, lat = np.meshgrid(lon, lat)
SIC = np.random.rand(180, 360)

# 选项 1:裁剪高纬度
fig = plt.figure(figsize=[10, 5])
ax2 = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator())
ax2.set_extent([-180, 180, -60, 90], ccrs.PlateCarree())  # 设置纬度范围

cf = ax2.contourf(lon, lat, SIC, levels=np.linspace(0, 1, 51), cmap='WhiteBlueGreenYellowRed',
                    transform=ccrs.PlateCarree(), extend='neither')
ax2.add_feature(cfeature.LAND)
ax2.gridlines()
plt.title('墨卡托投影(裁剪)')
plt.show()

# 选项 2:使用掩膜
fig = plt.figure(figsize=[10, 5])
ax2 = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator())

# 创建一个掩膜,用于屏蔽高于 -60 度的纬度
mask = lat > -60
SIC_masked = np.ma.masked_where(mask, SIC)

cf = ax2.contourf(lon, lat, SIC_masked, levels=np.linspace(0, 1, 51), cmap='WhiteBlueGreenYellowRed',
                    transform=ccrs.PlateCarree(), extend='neither')
ax2.add_feature(cfeature.LAND)
ax2.gridlines()
plt.title('墨卡托投影(掩膜)')
plt.show()

# 选项 3:重新投影数据
fig = plt.figure(figsize=[10, 5])
ax2 = fig.add_subplot(1, 1, 1, projection=ccrs.Mercator())

cf = ax2.contourf(lon, lat, SIC, levels=np.linspace(0, 1, 51), cmap='WhiteBlueGreenYellowRed',
                    transform=ccrs.PlateCarree(), extend='neither')
ax2.add_feature(cfeature.LAND)
ax2.gridlines()
plt.title('墨卡托投影(重新投影)')
plt.show()

请记住,没有一种完美的方法可以在墨卡托投影上表示极地地区,因为这种投影固有地会扭曲这些区域。选择最适合的特定需求和要传达的信息的方法非常重要。

标签:python,cartopy,mercator
From: 78778656

相关文章

  • 比较Python中的字符串统一特殊字符
    也许我可以使用更好的英语,但我想要的是忽略单词中的重音(和类似的),所以:renè、rené、rene'和rene应该是相同的,所以应该mañana和manana或even-distribuited和evendistribuited,可能还有sho......
  • 如何使用 Python 脚本从客户账单电子邮件中获取订单 ID - WooCommerce API
    我想创建一个python脚本,返回只知道客户的账单电子邮件的订单。我尝试这样做,但返回所有最近的订单:fromwoocommerceimportAPIwcapi=API(url="https://siteexample.com",consumer_key="ck_xxx",consumer_secret="cs_xxx",version="wc/v3")......
  • python基础理论小总结
    1.python语言的特性Python是一门解释型语言,简单清晰,开源免费,跨平台,有大量第三方库辅助开发,支持面向对象与自动垃圾回收,方便与其他编程语言相互调用。Python在数据采集、人工智能、WEB后台开发、自动化运维、测试等方向应用广泛。2.解释型语言和编译型语言的区别执行方式不......
  • python编码规范
    本篇讲的是代码格式化的问题,解决格式化的方法在最下方,不想看内容的,滑到最下方就好了。一、变量的命名规则1.组成:字母、数字、下划线2.不可以以数字开头3.不建议使用下划线开头4.命名需见名知意5.不要与关键字重名。如何查找所有关键字?importkeywordprint(keyword.k......
  • Python爬虫开发中的常用库与框架安装指南
    在Python爬虫开发中,选择合适的库和框架可以大大提高开发效率和爬虫的性能。本文将介绍一些常用的解析库、请求库、储存库、Web库、App爬取库以及爬虫框架,并展示如何使用pip命令进行安装。一、解析库1.BeautifulSoupBeautifulSoup是一个用于从HTML或XML文件中提取数据的Pyth......
  • 如何在Python中的指定项目之后添加新项目到嵌套列表?
    给定的列表是这样的。list1=[10,20,[300,400,[5000,6000],500],30,40]预期输出是这样的。我知道这是一个非常基本的问题,但我很困惑。输出:[10,20,[300,400,[5000,6000,7000],500],30,40]我希望有人能帮助我解决这个问题。并解释了嵌套列表的插入功......
  • python带界面实现word文档比对功能
    python实现word文档比对的功能较简单,笔者这里将其界面话,可以指定输入比对的文档,相似度,最小相似参数等。输出的结果以word的形式保存,重复部分会标出,基本实现了商业软件的功能。先看界面这里不废话了,直接给出全部源码,觉得好的点个赞。程序打包的话,自己百度。fromtkinterimp......
  • 具有固定字典键的 Python 函数返回类型提示
    我有一个函数返回一个始终具有相同键的字典(通过网络发送并使用json进行“字符串化”)。基本上我的函数看起来像这样:defgetTemps(self)->dict:"""getroomandcputemperaturein°Caswellashumidityin%"""#sendtemperaturerequesttoserve......
  • 在类型提示中使用 Type[class_name] 而不是仅使用 class_name 时,python 未解析的属性
    我想输入提示继承结构,但我不知道如何正确执行。这个想法是函数c可以采用A的任何子类。一些子类具有其他子类没有的属性,并且这些属性不是在父类中定义,而是在子类中定义。函数c检查子类,如果它是正确的,则使用该类的特定属性。在此设置中,PyCharm抱怨该参数不在父类中。from......
  • python的包管理
    获取现有项目有那些依赖安装pipreqspipinstallpipreqs在项目根目录执行pipreqs.--encoding=utf8--force--pypi-server=http://mirrors.aliyun.com/pypi/simple/根据生成文件安装依赖pipinstall-rrequriements.txtpipreqs命令选项Options:--use-local......