我认为你可能想将数据读取到一个 numpy.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知道如何呈现它。
facecolor ='white'
或其他颜色?我发现cartopy特征绘制在顶部。 - user308827