gdal截取范围栅格图
时间: 2025-05-31 09:54:27 浏览: 28
### 使用 GDAL 裁剪或提取指定范围的栅格图像
#### 方法一:基于像素位置裁剪
通过指定起始点和结束点的像素坐标来实现裁剪功能。这种方法适用于已知目标区域在影像中的具体像素位置的情况。
以下是具体的 Python 实现代码:
```python
import gdal
def clip_by_pixel(input_path, output_path, x_off, y_off, x_size, y_size):
dataset = gdal.Open(input_path)
band = dataset.GetRasterBand(1)
data = dataset.ReadAsArray(x_off, y_off, x_size, y_size) # 提取子图数据
driver = gdal.GetDriverByName("GTiff")
out_ds = driver.Create(output_path, x_size, y_size, 1, band.DataType)
out_ds.SetGeoTransform(get_new_geo_transform(dataset, x_off, y_off)) # 设置新的地理转换参数
out_ds.SetProjection(dataset.GetProjection()) # 复制投影信息
out_band = out_ds.GetRasterBand(1)
out_band.WriteArray(data) # 将数据写入新文件
out_band.FlushCache()
del out_ds
# 计算新的地理变换矩阵
def get_new_geo_transform(ds, x_offset, y_offset):
old_gt = ds.GetGeoTransform()
new_gt = (old_gt[0] + x_offset * old_gt[1], old_gt[1],
old_gt[2], old_gt[3] + y_offset * old_gt[5],
old_gt[4], old_gt[5])
return new_gt
```
此方法的核心在于 `ReadAsArray` 函数,它允许按照给定的像素偏移量和尺寸读取部分影像数据[^1]。
---
#### 方法二:基于地理坐标裁剪
当知道目标区域的具体地理范围(经纬度或其他坐标系下的范围)时,可以使用该方法完成裁剪操作。
下面是相应的 Python 实现代码:
```python
from osgeo import gdal
def clip_by_geographic_coordinates(input_path, output_path, min_x, max_x, min_y, max_y):
options = gdal.WarpOptions(
outputBounds=[min_x, min_y, max_x, max_y], # 设定输出边界
cropToCutline=True,
dstNodata=-999.0 # 定义无数据值
)
gdal.Warp(output_path, input_path, options=options)
```
在此方法中,`gdal.Warp()` 是核心函数,能够灵活处理多种复杂的裁剪需求,包括但不限于基于矢量边界裁剪、重采样以及坐标系转换等场景[^3]。
---
#### 方法三:基于矢量边界裁剪
如果需要根据某个矢量文件(如 `.shp` 文件)定义的几何边界进行裁剪,则可采用如下方式:
```python
from osgeo import gdal
def clip_by_shapefile(input_raster, output_raster, shapefile_path):
warp_options = gdal.WarpOptions(
format="GTiff",
cutlineDSName=shapefile_path, # 指定用于裁剪的矢量文件
cropToCutline=True, # 是否裁剪至切割线范围内
srcNodata=-999.0, # 原始数据的 NoData 值
dstNodata=-999.0 # 输出数据的 NoData 值
)
gdal.Warp(output_raster, input_raster, options=warp_options)
```
这种方案特别适合于复杂不规则形状的目标区域裁剪任务,其中涉及的主要逻辑已在前述引用中有提及。
---
### 总结
以上三种方法分别对应不同的应用场景:
- **基于像素位置裁剪**:简单高效,适用条件为明确知晓感兴趣区间的像素索引;
- **基于地理坐标裁剪**:灵活性高,尤其适配具有精确空间定位需求的任务;
- **基于矢量边界裁剪**:适应性强,能很好地满足任意形态边界约束的要求。
每种策略均有其独特优势,在实际应用过程中可根据具体情况选择最合适的手段加以实施。
---
阅读全文
相关推荐

















