使用Sentinel等遥感数据,生成的时序植被指数数据的波段数通常较大。gdal和rasterio都可以读取栅格数据,但是,两者进行读取的过程有区别。
图像进行分割后,生成大量的多边形,保存在shp文件中。然后需要计算每个多边形覆盖范围内的图像的纹理特征。gdal和rasterio都能读取shp文件,并访问指定多边形后生成掩膜后,再计算纹理特征。但是两者生成掩膜的过程和结果差别比较大,经过比较和分析,发现使用rasterio能够更快地生成合格的掩膜,相关代码如下:
import gdal
from shapely.Geometry import Polygon
from affine import Affine
raster = gdal.Open('p.tif')
shp = gdal.Open('p.shp')
lyr = shp.GetLayer()
feat = lyr.GetNextFeature()
# TODO: 使用rasterio和shapely处理多边形掩膜,速度快
# 将ogr.Geometry转换为shapely.Geometry.Polygon
geom = [feat.GetGeometryRef()]
geom_dict =eval(geom[0].ExportToJson())
geom = [Polygon(geom_dict['coordinates'][0]).__geo_interface__]
# TODO: rasterio不支持gdal形式的transform,转换为Affine
transform = raster.GetGeoTransform()
pixelWidth = transform[1]
pixelHeight = transform[5]
transform = Affine.from_gdal(xmin, pixelWidth, 0, ymax, 0, pixelHeight)
datamask = np.logical_not(features.geometry_mask(geom, [xcount, ycount], transform))
datamask就是多边形生成的掩膜,用它就可以计算多边形覆盖范围内的图像的各种特征,比如均值,方差,各种纹理特征,等等
网友评论