加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 使用Cartopy在地图上显示图像时的投影问题

发布时间:2020-12-16 21:50:36 所属栏目:Python 来源:网络整理
导读:我有一些我想用Cartopy显示的卫星图像数据.我已成功按照图像示例详细介绍了here.导致此代码: import numpy as npimport matplotlib.pyplot as pltimport cartopy.crs as ccrsfig = plt.figure(figsize=(12,12))img_extent = (-77,-59,9,26)ax = plt.axes(pr

我有一些我想用Cartopy显示的卫星图像数据.我已成功按照图像示例详细介绍了here.导致此代码:

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

fig = plt.figure(figsize=(12,12))
img_extent = (-77,-59,9,26)

ax = plt.axes(projection=ccrs.PlateCarree())
# image data coming from server,code not shown
ax.imshow(img,origin='upper',extent=img_extent)
ax.set_xmargin(0.05)
ax.set_ymargin(0.10)

# mark a known place to help us geo-locate ourselves
ax.plot(-117.1625,32.715,'bo',markersize=7)
ax.text(-117,33,'San Diego')

ax.coastlines()
ax.gridlines()

plt.show() 

此代码生成以下图像

我的问题是卫星图像数据不在PlateCarree投影中,而是墨卡托投影.

但是当我得到轴对象时

ax = plt.axes(projection=ccrs.Mercator())

我失去了海岸线.

我看到了here报告的问题.但是

ax.set_global()

得到这张图片的结果:

数据不存在,圣地亚哥位置错误.纬度/经度范围也发生了变化.我究竟做错了什么?

发布讨论更新

主要问题是我没有使用transform_points方法在目标投影中正确指定图像范围.我还必须具体说明菲尔建议的imshow方法中的坐标参考系统.这是正确的代码:

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

proj = ccrs.Mercator()
fig = plt.figure(figsize=(12,12))
extents = proj.transform_points(ccrs.Geodetic(),np.array([-77,-59]),np.array([9,26]))

img_extents = (extents[0][0],extents[1][0],extents[0][6],extents[1][7] ) 

ax = plt.axes(projection=proj)
# image data coming from server,extent=img_extents,transform=proj)

ax.set_xmargin(0.05)
ax.set_ymargin(0.10)

# mark a known place to help us geo-locate ourselves
ax.plot(-117.1625,markersize=7,transform=ccrs.Geodetic())
ax.text(-117,'San Diego',transform=ccrs.Geodetic())

ax.coastlines()
ax.gridlines()

plt.show() 

导致这个正确地理投影的卫星图像:

最佳答案
理想情况下,在使用cartopy绘图时(通过transform关键字),尝试始终具体说明数据所在的坐标参照系.这意味着您只需在脚本中切换投影,数据就会自动放在正确的位置.

所以在你的情况下,plt.imshow应该有一个transform = ccrs.Mercator()关键字参数(你可能需要一个更具体的参数化墨卡托实例).如果您的范围是大地测量(拉特和长子),则必须将边界框转换为墨卡托坐标,但除此之外,其他所有区域都应按预期工作.

注意:我将去更新example以包含变换参数;-)(PR:https://github.com/SciTools/cartopy/pull/343)

HTH

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读