本文目录导读:

- 使用 GDAL/OGR(最通用、最强大)
- 使用
ogr2ogr命令行(适合批量处理 + Shell脚本) - 使用
Fiona+Shapely(Pythonic方式,适合需要几何操作的转换) - 使用
ArcPy(Esri用户专用) - 使用
QGIS Processing脚本(GUI + 脚本化) - 推荐选择
- 注意事项
批量转换GIS数据格式有多种方法,具体取决于你的数据量、格式类型以及技术背景,以下是几种主流的脚本解决方案,按推荐程度排序:
使用 GDAL/OGR(最通用、最强大)
GDAL 是GIS领域最核心的开源库,支持数百种格式的读写。
适用场景:任何格式之间的转换(Shapefile, GeoJSON, GeoTIFF, KML, GPKG, GDB等)。
安装:
pip install gdal
Python脚本示例(批量转换文件夹下所有Shapefile为GeoJSON):
import os
import glob
from osgeo import ogr
input_folder = "./input_shp/"
output_folder = "./output_geojson/"
os.makedirs(output_folder, exist_ok=True)
# 遍历所有.shp文件
for shp_file in glob.glob(os.path.join(input_folder, "*.shp")):
# 生成输出文件名
base_name = os.path.basename(shp_file).replace(".shp", ".geojson")
output_file = os.path.join(output_folder, base_name)
# 打开输入数据源
src_ds = ogr.Open(shp_file)
if src_ds is None:
print(f"无法打开 {shp_file}")
continue
# 创建输出数据源(GeoJSON驱动)
driver = ogr.GetDriverByName("GeoJSON")
dst_ds = driver.CreateDataSource(output_file)
# 复制所有图层
for layer_idx in range(src_ds.GetLayerCount()):
src_layer = src_ds.GetLayerByIndex(layer_idx)
dst_ds.CopyLayer(src_layer, src_layer.GetName())
# 关闭数据源
src_ds = dst_ds = None
print(f"转换完成:{shp_file} -> {output_file}")
批量转换栅格格式(如TIFF转JPEG2000):
from osgeo import gdal
input_folder = "./input_tif/"
output_folder = "./output_jp2/"
os.makedirs(output_folder, exist_ok=True)
for tif_file in glob.glob(os.path.join(input_folder, "*.tif")):
output_file = os.path.join(output_folder,
os.path.basename(tif_file).replace(".tif", ".jp2"))
# 使用gdal.Translate(矢量用ogr2ogr,栅格用gdal_translate)
gdal.Translate(output_file, tif_file, format='JPEG2000')
使用 ogr2ogr 命令行(适合批量处理 + Shell脚本)
GDAL自带的ogr2ogr工具是最快的命令行方式,适合在Linux/Mac/WSL环境中配合for循环使用。
Shell脚本示例(将所有Shapefile转为GeoPackage):
#!/bin/bash
INPUT_DIR="./shapefiles"
OUTPUT_DIR="./geopackages"
mkdir -p "$OUTPUT_DIR"
for shp in "$INPUT_DIR"/*.shp; do
filename=$(basename "$shp" .shp)
echo "转换 $shp ..."
ogr2ogr -f GPKG "$OUTPUT_DIR/${filename}.gpkg" "$shp"
done
批量转换栅格:
for tif in ./input/*.tif; do
ogr2ogr -of GTiff -co "COMPRESS=LZW" "./output/$(basename $tif)" "$tif"
done
使用 Fiona + Shapely(Pythonic方式,适合需要几何操作的转换)
Fiona是对GDAL的更高层次封装,代码更简洁。
转换示例:
import os
import fiona
input_folder = "./shapes/"
output_folder = "./geojson/"
os.makedirs(output_folder, exist_ok=True)
# 读取所有输入文件
for file in os.listdir(input_folder):
if file.endswith(".shp"):
input_path = os.path.join(input_folder, file)
output_path = os.path.join(output_folder, file.replace(".shp", ".geojson"))
# 使用fiona的copy方法直接转换
with fiona.open(input_path) as src:
with fiona.open(output_path, 'w', driver='GeoJSON',
schema=src.schema, crs=src.crs) as dst:
for feature in src:
dst.write(feature)
print(f"完成:{input_path} -> {output_path}")
使用 ArcPy(Esri用户专用)
如果你有ArcGIS Pro/Desktop许可证,ArcPy适合处理文件地理数据库(GDB)、企业级数据库。
import arcpy
import os
arcpy.env.workspace = r"C:\input_data"
output_folder = r"C:\output_geojson"
arcpy.CreateFolder_management(r"C:\", "output_geojson")
# 列出所有要素类(包括Shapefile、GDB中的要素)
fc_list = arcpy.ListFeatureClasses()
for fc in fc_list:
out_name = os.path.splitext(fc)[0] + ".geojson"
out_path = os.path.join(output_folder, out_name)
# 转换(arcpy支持直接输出GeoJSON)
arcpy.conversion.ExportFeatures(fc, out_path)
注意:ArcPy较慢但原生支持Esri格式,如 .lyrx、.gdb、SDE连接。
使用 QGIS Processing 脚本(GUI + 脚本化)
QGIS内置批量处理工具箱,但也可以写Python脚本使用QGIS API。
from qgis.core import QgsApplication, QgsProject
from qgis import processing
# 初始化QGIS(如果不在GUI中)
QgsApplication.setPrefixPath("/usr", True)
qgs = QgsApplication([], False)
qgs.initQgis()
# 处理文件
for shp in glob.glob("*.shp"):
output = shp.replace(".shp", ".gpkg")
params = {'INPUT': shp, 'OUTPUT': output}
processing.run("native:exportlayers", params)
qgs.exitQgis()
推荐选择
| 方案 | 适合人群 | 最大优势 | 缺点 |
|---|---|---|---|
| GDAL/OGR | 专业GIS开发者 | 覆盖所有格式,性能最佳 | 学习曲线稍陡 |
| ogr2ogr命令行 | 运维/Linux用户 | 极速批量处理 | 需要Shell基础 |
| Fiona | Python爱好者 | 代码优雅,易于扩展 | 依赖GDAL |
| ArcPy | 重度Esri用户 | 完美兼容Esri生态 | 昂贵,依赖ArcGIS |
| QGIS处理脚本 | 地理信息分析师 | 可视化+脚本混合模式 | 需要QGIS环境 |
注意事项
- CRS处理:如果源数据没有坐标系,转换时可能丢失投影,建议显式指定。
- 字段兼容性:不同格式支持的数据类型不同(如GeoJSON不支持BLOB、Date类型),转换前检查字段映射。
- 文件编码:Shapefile的.dbf默认使用ANSI/Latin-1,GeoJSON使用UTF-8,转换时注意中文乱码问题(GDAL设置
ENCODING=UTF-8)。 - 性能建议:处理大量文件(>100)时,优先使用
ogr2ogr命令行并利用xargs或GNU Parallel并行化处理。
需要更具体的示例(比如处理特定格式、需要修改属性表、处理大型遥感影像等),告诉我你的具体数据情况,我可以提供定制化的脚本方案。