gpt4 book ai didi

matplotlib - 创建与地球上特定区域相对应的简单 basemap

转载 作者:行者123 更新时间:2023-12-02 03:54:15 26 4
gpt4 key购买 nike

我正在尝试熟悉 matplotlib 和 Basemap。首先,我尝试生成一个与我有数据的特定网格相匹配的格陵兰图像。

下面令人毛骨悚然的细节描述了我的问题:我无法创建大小与所需投影/区域相匹配的图像。

我想要匹配的投影和网格:投影为 Proj4 字符串:"+proj=stere +lat_0=90 +lon_0=-45 +lat_ts=70 +ellps=WGS84 +datum=WGS84 +units=m"

网格定义的区域是一个 800x1400 2000 米分辨率的网格,其中:左下角的外边缘(米):-700,000., -3,400,000.右上角外缘(米):900,000., -600,000. => (-700,000 + 2000 * 800, -3,400,000 + 2000 * 1400)

basemap 不允许我为立体投影指定以米-xy 为单位的角点,因此我必须将这些角点转换为纬度/经度。

> gdaltransform -s_srs "+proj=stere +lat_0=90 +lon_0=-45 +lat_ts=70 +ellps=WGS84 +datum=WGS84 +units=m" -t_srs "+proj=latlong"`
-700000 -3400000
-56.6336339989404 58.7244253840871 0
900000 -600000
11.3099324740202 80.0389929796586 0

现在我应该拥有创建 800x1400 图像的所有信息。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

def create_map():
fig = plt.figure(1, figsize=(8, 14), frameon=False, dpi=100)
fig.add_axes([0, 0, 1, 1])

m = Basemap(resolution="i",
projection='stere', lat_ts=70, lat_0=90., lon_0=-45.,
llcrnrlon=-56.6336339989404, llcrnrlat=58.7244253840871,
urcrnrlon=11.3099324740202, urcrnrlat=80.0389929796586,
rsphere=(6378137.0, 6356752.3142))

m.drawcoastlines()
m.fillcontinents(color='#c1c1c1')
m.drawmapboundary(fill_color='#6587ad', linewidth=0.0)
plt.savefig('greenland.png', pad_inches=0.0, bbox_inches='tight')

if __name__ == '__main__':
create_map()

我面临的问题是,当我这样做时,我得到了一张 800x1399 的图像。如果我不在 plt.savefig 命令中包含 bbox_inches='tight',我会得到一个 800x1400 的图像,沿着(编辑) 底部边缘(编辑)。

谁能帮助我确定我是否正确设置了 basemap ?我觉得我可能只是错过了一个简单的技巧,但没有得到我期望大小的图像很奇怪。

一如既往,提前致谢。

最佳答案

看来这可能是 matplotlib 中的错误造成的。 Jeff Whitaker 看了看并说它看起来不错,我尝试在不使用 Basemap 的情况下重现此行为,我能够做到。

似乎数据值的方面可能导致输出图像的大小错误。

下面是一些显示问题的代码。抱歉误报。

# rectangle.py   --
import matplotlib.pyplot as plt


def create_image():
fig = plt.figure(1, figsize=(8, 14), frameon=False, dpi=100)
fig.add_axes([0, 0, 1, 1])
ax = plt.gca()

# This isn't necessary to create the issue unless you want to see the
# transparent pixels at bottom.

# for spine in ax.spines.values():
# spine.set_linewidth(0.0)

limb = ax.axesPatch
limb.set_facecolor('#6587ad')

x1 = 0.0
y1 = 0.0
x2 = 16.

# Use this line and get what I was expecting:
# y2 = 27.999999999999994671 # produces 800 x 1400 image

# Use this line and get the wrong size
y2 = 27.999999999999994670 # produces (wrong?) 800 x 1399 image

corners = ((x1, y1), (x2, y2))
ax.update_datalim(corners)
ax.set_xlim((x1, x2))
ax.set_ylim((y1, y2))

ax.set_aspect('equal', anchor='C')
ax.set_xticks([])
ax.set_yticks([])

plt.savefig('rectangle.png', pad_inches=0.0, bbox_inches='tight')

# If you use this below, the file size is correct, but there is a single
# line transparent pixels along the bottom of the image if you set the
# linewidth to zero...

# plt.savefig('rectangle.png', pad_inches=0.0)


if __name__ == '__main__':
create_image()

关于matplotlib - 创建与地球上特定区域相对应的简单 basemap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13351157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com