本文目录导读:

- 使用 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并行化处理。
需要更具体的示例(比如处理特定格式、需要修改属性表、处理大型遥感影像等),告诉我你的具体数据情况,我可以提供定制化的脚本方案。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播