共计 2266 个字符,预计需要花费 6 分钟才能阅读完成。
痛点分析
在处理大尺寸遥感影像时,尤其是为深度学习准备训练样本时,我们经常需要将大图分割成统一尺寸的小块。传统的手动分割方式不仅耗时耗力,而且容易出现尺寸不统一的问题,严重影响后续处理的效率和质量。

- 耗时问题:手动分割一张 GB 级别的大图可能需要数小时,而且容易出错。
- 尺寸不统一:手动操作难以保证每个小块都是严格的 1000*1000 像素。
- 重复性工作:面对大量数据时,手动分割几乎不可行。
技术方案
GDAL vs arcpy
- GDAL:开源工具,功能强大,但学习曲线较陡,且在某些 GIS 特定功能上支持不足。
- arcpy:ArcGIS Pro 的 Python API,与 ArcGIS 生态无缝集成,特别适合需要保持空间参考一致性的场景。
arcpy.SplitRaster_management 关键参数
- Tile_Size:设置为 1000,确保每个小块都是 1000*1000 像素。
- Overlap:根据需求设置重叠区域,常见于深度学习样本准备。
- Cellsize:保持与原图一致,避免分辨率变化。
- Split_Method:通常选择 ”SIZE” 模式,按尺寸分割。
代码实现
import arcpy
import os
from tqdm import tqdm
def split_raster(input_raster, output_folder, tile_size=1000, overlap=0):
"""
分割大图为指定尺寸的小块
:param input_raster: 输入栅格路径
:param output_folder: 输出文件夹
:param tile_size: 分割尺寸
:param overlap: 重叠像素数
"""
# 确保输出文件夹存在
os.makedirs(output_folder, exist_ok=True)
# 获取栅格信息
desc = arcpy.Describe(input_raster)
band_count = desc.bandCount
spatial_ref = desc.spatialReference
# 设置输出基础名称
base_name = os.path.basename(input_raster).split('.')[0]
# 使用 tqdm 显示进度
with tqdm(total=100, desc="Processing") as pbar:
# 调用 SplitRaster 工具
arcpy.SplitRaster_management(
in_raster=input_raster,
out_folder=output_folder,
out_base_name=base_name,
split_method="SIZE",
tile_size=f"{tile_size} {tile_size}",
overlap=overlap,
cellsize="#",
resampling_type="NEAREST",
out_format="TIFF"
)
pbar.update(100)
if __name__ == "__main__":
# 示例用法
split_raster(
input_raster="C:/data/large_image.tif",
output_folder="C:/data/tiles",
tile_size=1000,
overlap=50
)
代码说明
- 多波段支持:代码自动识别输入栅格的波段数,保持输出一致。
- 坐标系保持:通过 Describe 对象获取原始空间参考,确保输出保持一致。
- 进度显示:集成 tqdm 库,提供友好的进度反馈。
性能优化
内存管理
- 使用
in_memory工作空间存放中间结果,减少 IO 开销。 - 处理完成后及时清理临时数据。
多核并行
import multiprocessing
def parallel_split(raster_list):
"""并行处理多个栅格"""
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
results = []
for raster in raster_list:
result = pool.apply_async(split_raster, args=(raster, "output_folder"))
results.append(result)
pool.close()
pool.join()
避坑指南
常见错误
- 无效的 NoData 值:确保设置的 NoData 值确实存在于数据中。
- 文件名冲突:在输出文件名中加入行列号等唯一标识。
文件名冲突预防
# 在输出基础名称中加入行列信息
out_base_name = f"{base_name}_row{{0}}_col{{1}}"
验证环节
QGIS 检查方法
- 在 QGIS 中新建项目
- 使用
Layer > Add Layer > Add Raster Layer加载切分结果 - 检查拼接处是否有重叠或缝隙
- 使用
Identify Features工具验证像素值是否正确
输出日志示例
[2023-08-20 10:00:00] INFO: 开始处理 large_image.tif
[2023-08-20 10:00:05] INFO: 原始尺寸: 10000x8000
[2023-08-20 10:02:30] INFO: 生成 100 个 1000x1000 的瓦片
[2023-08-20 10:02:30] INFO: 处理完成
思考题
在分割非整数倍尺寸的边界块时,常见的处理方式有三种:
- 丢弃不足尺寸的部分
- 填充边缘(如镜像、重复或指定值)
- 调整边界块尺寸(可能导致尺寸不一致)
你会选择哪种方式?为什么?在实际项目中,这个决策可能需要考虑哪些因素?
正文完
发表至: 地理信息系统
近一天内
