python - Matplotlib 底图:离线地图
问题描述
您好,当我使用具有最大分辨率(分辨率='f')的底图时,绘制它需要很长时间。
对于我的项目,我必须使用此分辨率,但由于该程序必须由用户使用,我希望它尽可能快。
是否因为它从某个在线存储库下载地图而发生?
有没有办法下载我需要的地图并离线绘制?
这是一个 MWE:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
lon_min = -10.5
lon_max = 2.0
lat_min = 50.0
lat_max = 59.7
coastlinesMap = Basemap(suppress_ticks=False, projection='cyl',
llcrnrlat=lat_min, urcrnrlat=lat_max,
llcrnrlon=lon_min, urcrnrlon=lon_max,
resolution='f')
n = 100
x = np.linspace(lon_min, lon_max, n)
y = np.linspace(lat_min, lat_max, n)
lon, lat = np.meshgrid(x, y)
z = np.zeros((n, n))
for i in range(n):
for j in range(n):
z[i, j] = x[i] + y[j]
fig = plt.figure("test")
ax = fig.add_subplot(111)
cf = ax.contourf(lon, lat, z, cmap="jet")
ax.set_xlabel("lon")
ax.set_ylabel("lat")
ax.add_collection(coastlinesMap.drawcoastlines(linewidth=0.25))
coastlinesMap.fillcontinents(color="green")
fig.colorbar(cf)
plt.show()
编辑
我只是想澄清一下,当显示情节时,我可以缩放或平移等,并且变化很快,coastlineMap
生成速度很慢。
解决方案
按照@ImportanceOfBeingErnest 的链接并环顾四周,我使用cPickle 解决了我的问题。
我报告下面的解决方案
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import time
from six.moves import cPickle
lon_min = -10.5
lon_max = 2.0
lat_min = 50.0
lat_max = 59.7
t1 = time.clock()
coastlinesMap = Basemap(suppress_ticks=False, projection='cyl',
llcrnrlat=lat_min, urcrnrlat=lat_max,
llcrnrlon=lon_min, urcrnrlon=lon_max,
resolution='f')
print(time.clock()-t1,' secs to create original Basemap instance')
cPickle.dump(coastlinesMap, open('UKmap.pickle', 'wb'), -1)
n = 100
x = np.linspace(lon_min, lon_max, n)
y = np.linspace(lat_min, lat_max, n)
lon, lat = np.meshgrid(x, y)
z = np.zeros((n, n))
for i in range(n):
for j in range(n):
z[i, j] = x[i] + y[j]
fig = plt.figure("test")
ax = fig.add_subplot(111)
cf = ax.contourf(lon, lat, z, cmap="jet")
ax.set_xlabel("lon")
ax.set_ylabel("lat")
ax.add_collection(coastlinesMap.drawcoastlines(linewidth=0.25))
coastlinesMap.fillcontinents(color="green")
fig.colorbar(cf)
t1 = time.clock()
m2 = cPickle.load(open('UKmap.pickle','rb'))
fig = plt.figure("test")
ax = fig.add_subplot(111)
ax.set_xlabel("lon")
ax.set_ylabel("lat")
ax.add_collection(m2.drawcoastlines(linewidth=0.25))
m2.drawcountries()
print(time.clock()-t1,' secs to plot using using a pickled Basemap instance')
plt.show()
推荐阅读
- html - 如果未指定 maxlength,则 textarea 字符限制是多少?
- jquery - 如何在 jQuery 中将突变事件侦听器转换为 MutationObserver?
- docker - 在调试模式而不是默认模式下运行 docker sonarqube
- excel - 从 E1 列的单元格中删除具有 Null 值的行
- permissions - 无法使用 Terraform 资源 google_cloud_identity_group 创建 google 组
- c# - C# 中的 SqlBulkCopy 类正在更改数值
- jquery - Bootstrap 4 表单验证在使用无效反馈时不起作用,即使输入“有效”也是如此
- angular - Angular:Mat Sort 不适用于类似扩展的表格
- c# - 如果不会导致使用 EF6 生成表,您将如何将流畅的 API 应用于 DTO?
- python - 如何从 google colab 保存完整的 tensorflow 模型