2022新版Cartopy如何将img_tiles瓦片转换为灰度显示
新版Cartopy img_tiles灰度底图实现方案
问题根源
Cartopy 0.20及以上版本重构了ax.add_image()的参数校验逻辑,旧版本直接在add_image()中传入cmap参数的写法已被废弃。传入未被识别的参数会触发运行时异常,直接阻塞savefig()等后续流程,该问题和瓦片数据源无关。
所有瓦片渲染相关的样式参数(包括cmap、norm、透明度alpha等),新版需要直接绑定到瓦片实例的属性上,不能通过add_image()传参。
方案1:原生支持灰度输出的瓦片(以Stamen地形背景为例)
Stamen地形背景瓦片原生提供单通道灰度数据,初始化瓦片实例时指定拉取单通道格式,再给实例绑定灰度色带即可,无需向add_image()传额外参数:
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.io.img_tiles as cimgt fig = plt.figure(figsize=(10,7.5)) ax = plt.axes(projection=ccrs.PlateCarree()) [lon0,lat0,lon1,lat1] = [102., 11., 107., 15.] ax.set_extent([lon0, lon1, lat0, lat1]) # 初始化时指定拉取单通道灰度瓦片,给实例绑定灰度色带 stamen_terrain = cimgt.Stamen(desired_tile_form="L", style="terrain-background") stamen_terrain.cmap = "gray" ax.add_image(stamen_terrain, 8) # 后续叠加洪涝观测数据、保存图片逻辑可正常运行 # plt.savefig("stamen_gray_terrain.png", dpi=300, bbox_inches="tight") plt.show()
方案2:仅提供彩色资源的瓦片(以ESRI晕渲地形为例)
对于仅提供彩色瓦片的数据源,需要重写瓦片类的图像加载方法,在瓦片拉取完成后自动转换为单通道灰度格式,再绑定灰度色带:
from cartopy.io.img_tiles import GoogleTiles import matplotlib.pyplot as plt import cartopy.crs as ccrs class ShadedReliefESRI(GoogleTiles): # 重写图像加载方法,拉取后自动转灰度 def get_image(self, tile): img = super().get_image(tile) return img.convert("L") # ESRI晕渲地形瓦片地址 def _image_url(self, tile): x, y, z = tile url = ('https://server.arcgisonline.com/ArcGIS/rest/services/' \ 'World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}.jpg').format( z=z, y=y, x=x) return url fig = plt.figure(figsize=(10,7.5)) ax = plt.axes(projection=ccrs.PlateCarree()) ax.set_extent([102., 107., 11., 15.]) # 初始化瓦片实例,绑定灰度色带 esri_terrain = ShadedReliefESRI(desired_tile_form="L") esri_terrain.cmap = "gray" ax.add_image(esri_terrain, 8) # 后续叠加洪涝数据、保存图片无异常 # plt.savefig("esri_gray_terrain.png", dpi=300, bbox_inches="tight") plt.show()
提示:如果需要调整灰度底图的明暗对比度,可以在
convert("L")后增加灰度拉伸逻辑,适配上层洪涝数据的显示效果。
内容的提问来源于stack exchange,提问作者JumperSnatcher
相关产品推荐
相关产品推荐

