1. pyresample 比 cartopy 快得多(取决于输出图像的大小高达 10 倍)
cartopy 重投影功能没有以任何方式进行优化,尽管它在底层使用了 scipy ckdtree 功能,但算法本身是用 Python 编写的。我似乎记得一个快速的胜利是使用https://pypi.python.org/pypi/kdtree,它从内存中提供了相当合理的加速,几乎不需要做任何工作,cartopy.img_transform
这将是需要更改的地方。
Cartopy 的重新投影功能可能也付出了非常通用的代价——您可以在任何投影中提供图像,它会将其放入任何其他投影中,从而毫无问题地处理不连续性和撕裂。不过,在某些情况下,使用 pyresample 的功能(以及 GDAL 的功能)让用户有机会加快重投影速度,这真的很酷。
2.输出图像不同:使用pyresample的结果显示出更强的对比度。
看起来您正在创建一个 matplotlib 图来重新采样图像并使用 mpl 的 savefig 功能。此过程可能导致对比度丢失。我建议只使用 cartopy 的重投影功能,而不向图形添加图像并保存图形(最后的示例)。
3.如果使用multiprocessing库进行并行投影,cartopy版本会崩溃,报错如下:
这真的让我感到惊讶,因为 cartopy 中没有 C 代码正在重新投影。因此,您要么发现了 scipy 的错误,要么更可能遇到了 numpy/matplotlib 的问题(谷歌提供了一些结果与您的异常和 matplotlib 和/或 numpy,例如https://github.com/numpy /numpy/issues/1270)。
好的,这就是我将如何在不使用 matplotlib 的情况下进行重新投影:
import cartopy.crs as ccrs
from cartopy.img_transform import warp_array
import numpy as np
import PIL.Image
# I've downloaded the file from https://github.com/jmozmoz/cloudmap/blob/78923d15ad906eaa6d1dcab168a6364643d3fc94/debug/2014_8_7_1800_GOES15_4_S1.jpeg
# and clipped the image.
fname = '2014_8_7_1800_GOES15_4_S1.jpeg'
img = PIL.Image.open(fname)
result_array, extent = warp_array(np.array(img),
source_proj=ccrs.Geostationary(),
target_proj=ccrs.PlateCarree(),
target_res=(4000, 2000))
result = PIL.Image.fromarray(result_array)
result.save('reprojected.jpeg')
生成的图像(最终)看起来像:
使用此功能进行某些优化有一些真正的可能性 - 首先创建 kdtree 完成了大量工作(可能会被缓存),另一大块工作是从原始图像计算索引(再次,缓存非常好)这将基本上减少和重复对 numpy 索引问题的重新投影。
如果您想研究性能可能性或对比问题(我不确定我的解决方案是否修复),请随时在 github repo 上提出问题,我们可以讨论一些选项。
谢谢你的提问,还有HTH!