编写一个根据EPSG号批量改栅格数据投影并通过矢量范围对栅格数据进行裁剪的代码
时间: 2024-12-11 15:17:00 浏览: 11
基于Google Earth Engine的MODIS产品获取以及完成重投影重采样和裁剪等预处理工作
在Python中,你可以使用GDAL库来处理栅格数据的投影转换和裁剪。以下是一个简单的例子,展示如何使用`osr`模块(Open SourceRasterio)进行投影转换,以及如何使用`rio clip`函数进行基于矢量范围的裁剪。请注意,你需要先安装GDAL和Rasterio库。
```python
from osgeo import gdal, osr
def convert_and_clip_raster(raster_path, epsg_code, vector_path):
# 读取原栅格数据
dataset = gdal.Open(raster_path)
# 获取原投影信息
original_proj = dataset.GetProjection()
# 创建新投影
new_srs = osr.SpatialReference()
new_srs.ImportFromEPSG(epsg_code)
# 如果需要转换投影
if original_proj != new_srs.ExportToWkt():
transform = osr.CoordinateTransformation(original_proj, new_srs)
geotransform = dataset.GetGeoTransform()
# 创建一个新的空白遥感文件,用于存储转换后的数据
output_driver = gdal.GetDriverByName('GTiff')
output_dataset = output_driver.Create(
"output.tif", dataset.RasterXSize, dataset.RasterYSize,
dataset.RasterCount, dataset.GetRasterBand(1).DataType
)
output_dataset.SetGeoTransform([geotransform[0], transform[0], 0, geotransform[3], 0, transform[1]])
output_dataset.SetProjection(new_srs.ExportToWkt())
# 转换并写入新的数据
for i in range(dataset.RasterCount):
band = dataset.GetRasterBand(i + 1)
output_band = output_dataset.GetRasterBand(i + 1)
transformed_data = band.ReadAsArray(transform=transform)
output_band.WriteArray(transformed_data)
# 使用矢量范围裁剪
from rasterio.warp import transform_bounds
bounds = transform_bounds(osr.SpatialReference(wkt=new_srs.ExportToWkt()), new_srs, *vector_path.bounds)
with rasterio.open("output.tif") as src, rasterio.open("clipped_output.tif", 'w', **src.meta) as dst:
dst.write(src.read(window=rasterio.windows.from_bounds(*bounds)))
# 示例用法
convert_and_clip_raster("input.tif", 4326, ("path_to_vector.shp", (xmin, ymin, xmax, ymax)))
阅读全文