脚本如何批量转换GIS数据格式

wen 实用脚本 2

本文目录导读:

脚本如何批量转换GIS数据格式

  1. 使用 GDAL/OGR(最通用、最强大)
  2. 使用 ogr2ogr 命令行(适合批量处理 + Shell脚本)
  3. 使用 Fiona + Shapely(Pythonic方式,适合需要几何操作的转换)
  4. 使用 ArcPy(Esri用户专用)
  5. 使用 QGIS Processing 脚本(GUI + 脚本化)
  6. 推荐选择
  7. 注意事项

批量转换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.gdbSDE连接


使用 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环境

注意事项

  1. CRS处理:如果源数据没有坐标系,转换时可能丢失投影,建议显式指定。
  2. 字段兼容性:不同格式支持的数据类型不同(如GeoJSON不支持BLOB、Date类型),转换前检查字段映射。
  3. 文件编码:Shapefile的.dbf默认使用ANSI/Latin-1,GeoJSON使用UTF-8,转换时注意中文乱码问题(GDAL设置ENCODING=UTF-8)。
  4. 性能建议:处理大量文件(>100)时,优先使用ogr2ogr命令行并利用xargsGNU Parallel并行化处理。

需要更具体的示例(比如处理特定格式、需要修改属性表、处理大型遥感影像等),告诉我你的具体数据情况,我可以提供定制化的脚本方案。

抱歉,评论功能暂时关闭!