我认为您可能希望将数据读取到 anumpy.ndarray
并使用 绘制它,您的ax.imshow
位置在哪里(因为您已经拥有它)。我在下面提供了一个例子来说明我的意思。ax
cartopy.GeoAxes
我为这个例子剪下了一小块 Landsat 表面温度和一些农田。在此驱动器链接上获取它们。
注意字段在 WGS 84 (epsg 4326) 中,Landsat 图像在 UTM Zone 12 (epsg 32612),我想要我的地图在 Lambert Conformal Conic。Cartopy 让这一切变得简单。
import numpy as np
import cartopy.crs as ccrs
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
import rasterio
import matplotlib.pyplot as plt
def cartopy_example(raster, shapefile):
with rasterio.open(raster, 'r') as src:
raster_crs = src.crs
left, bottom, right, top = src.bounds
landsat = src.read()[0, :, :]
landsat = np.ma.masked_where(landsat <= 0,
landsat,
copy=True)
landsat = (landsat - np.min(landsat)) / (np.max(landsat) - np.min(landsat))
proj = ccrs.LambertConformal(central_latitude=40,
central_longitude=-110)
fig = plt.figure(figsize=(20, 16))
ax = plt.axes(projection=proj)
ax.set_extent([-110.8, -110.4, 45.3, 45.6], crs=ccrs.PlateCarree())
shape_feature = ShapelyFeature(Reader(shapefile).geometries(),
ccrs.PlateCarree(), edgecolor='blue')
ax.add_feature(shape_feature, facecolor='none')
ax.imshow(landsat, transform=ccrs.UTM(raster_crs['zone']),
cmap='inferno',
extent=(left, right, bottom, top))
plt.savefig('surface_temp.png')
feature_source = 'fields.shp'
raster_source = 'surface_temperature_32612.tif'
cartopy_example(raster_source, feature_source)
Cartopy 的诀窍是记住projection
为您的轴对象使用关键字,因为这会将地图呈现在您选择的良好投影中(在我的情况下为 LCC)。使用transform
关键字来指示您的数据所在的投影系统,以便 Cartopy 知道如何渲染它。