脚本实现高效数据治理的完整指南
目录导读
- 为什么需要批量转换地质数据格式?
- 常见地质数据格式类型与转换难点
- 核心脚本工具与选型建议
- Python脚本实战:从SHP到GeoJSON的批量转换
- 自动化处理中的常见错误与解决方案
- 问答环节:地质数据格式转换的5个高频问题
- 总结与最佳实践建议
为什么需要批量转换地质数据格式?
在地质勘探、矿山建模、水文分析等工作中,数据来源往往多样:钻孔数据、地球物理测井数据、地质体模型、地形DEM等,不同软件(如ArcGIS、MapGIS、Petrel、Surfer)使用各自专属格式(如.e00、.dxf、.las、.grd),手动逐个转换不仅耗时,且易出现坐标偏移、属性丢失等问题。

批量脚本转换的核心价值在于:
- 效率提升:一次编写脚本,可处理数千个文件
- 精度保障:通过参数固定坐标系转换规则
- 可重复性:同一流程可复用至其他项目
- 错误减少:避免人工操作中的格式不匹配、字段缺失
常见地质数据格式类型与转换难点
| 数据类型 | 常见格式 | 转换难点 |
|---|---|---|
| 矢量数据 | SHP, GeoJSON, DXF, DWG | 坐标系投影不统一(如北京54→WGS84) |
| 栅格数据 | TIFF, GRD, IMG, NetCDF | 分辨率、像元深度变化 |
| 井数据 | LAS, DLIS, CSV | 测井曲线参数单位不一致 |
| 地质模型 | VTK, OBJ, STL | 大型点云与三角形网格重采样 |
核心脚本工具与选型建议
目前主流的批量转换方案包括:
- GDAL/OGR:开源地理数据转换库,支持70+矢量格式和40+栅格格式
- PyQGIS:利用QGIS API实现复杂转换
- FME Workbench:可视化流程设计,适合非编程人员
- 自定义Python脚本:结合
pandas、numpy处理非标准格式
推荐选择GDAL/OGR,因为它:
- 跨平台(Windows/Linux/macOS)
- 命令行与Python API双模式
- 支持批量处理、坐标重投影、属性筛选
Python脚本实战:从SHP到GeoJSON的批量转换
以下脚本将文件夹内所有SHP文件批量转换为GeoJSON,并自动重投影至WGS84:
import os
import glob
from osgeo import ogr, osr
def batch_shp_to_geojson(input_folder, output_folder, target_epsg=4326):
# 创建输出目录
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 获取所有SHP文件
shp_files = glob.glob(os.path.join(input_folder, "*.shp"))
for shp_path in shp_files:
try:
# 打开SHP
source_ds = ogr.Open(shp_path)
source_layer = source_ds.GetLayer()
# 创建GeoJSON驱动
out_driver = ogr.GetDriverByName("GeoJSON")
base_name = os.path.splitext(os.path.basename(shp_path))[0]
out_path = os.path.join(output_folder, f"{base_name}.geojson")
# 如果已有文件则删除重写
if os.path.exists(out_path):
out_driver.DeleteDataSource(out_path)
# 创建目标数据源
out_ds = out_driver.CreateDataSource(out_path)
# 设置坐标系转换
source_srs = source_layer.GetSpatialRef()
target_srs = osr.SpatialReference()
target_srs.ImportFromEPSG(target_epsg)
# 创建坐标转换对象
coord_trans = osr.CoordinateTransformation(source_srs, target_srs)
# 创建输出图层(复制字段定义)
out_layer = out_ds.CreateLayer(
base_name,
geom_type=source_layer.GetGeomType(),
srs=target_srs
)
# 复制属性字段
source_layer_defn = source_layer.GetLayerDefn()
for i in range(source_layer_defn.GetFieldCount()):
field_defn = source_layer_defn.GetFieldDefn(i)
out_layer.CreateField(field_defn)
# 复制要素并转换几何
source_layer.ResetReading()
for feature in source_layer:
geom = feature.GetGeometryRef()
if geom is not None:
geom.Transform(coord_trans)
out_feature = ogr.Feature(out_layer.GetLayerDefn())
out_feature.SetGeometry(geom)
for i in range(source_layer_defn.GetFieldCount()):
out_feature.SetField(
source_layer_defn.GetFieldDefn(i).GetNameRef(),
feature.GetField(i)
)
out_layer.CreateFeature(out_feature)
# 清理
out_ds = None
source_ds = None
print(f"✓ 成功转换: {base_name}")
except Exception as e:
print(f"✗ 转换失败: {shp_path} - {str(e)}")
# 使用示例
batch_shp_to_geojson(r"C:\geology\shp_folder", r"C:\geology\geojson_output", 4326)
关键参数调整:
- 支持
ogr2ogr命令行并行处理:ogr2ogr -f "GeoJSON" -t_srs EPSG:4326 -overwrite - 批量栅格转换:
gdal_translate -of "GTiff" -co "COMPRESS=LZW"
自动化处理中的常见错误与解决方案
| 错误现象 | 原因 | 解决方案 |
|---|---|---|
| 转换后坐标偏差极大 | 未正确设置源坐标系 | 使用SetFromUserInput("EPSG:XXXX")明确指定 |
| 属性字段丢失 | SHP属性字段名含特殊字符 | 转换前清理字段名(替换为空或下划线) |
| 大型文件内存溢出 | 一次性加载所有数据 | 使用ogr2ogr流式处理,或增加内存限制--config GDAL_CACHEMAX 1024 |
| 中文路径编码错误 | Windows系统默认编码问题 | 设置os.environ['GDAL_FILENAME_IS_UTF8']='YES' |
| 格式不支持 | GDAL未编译对应驱动 | 安装完整版GDAL(使用conda安装conda install -c conda-forge gdal) |
问答环节:地质数据格式转换的5个高频问题
Q1: 如何批量转换DTM(数字地形模型)文件格式?
A: 使用gdalwarp命令行工具,例如将多个.asc文件合并并转换为.tif:
for %f in (*.asc) do (gdal_translate -of GTiff %f %~nf.tif),或结合gdal_merge.py批量拼接。
Q2: 转换LAS点云数据到CSV时如何保留分类信息?
A: 使用las2txt或PDAL库,PDAL脚本示例:
pdal translate input.las output.csv --writers.csv.data_format="x,y,z,Classification,Intensity"
Q3: 如何将多个CSV钻孔数据转换为统一的LAS格式?
A: 先使用Python将CSV重组为标准LAS列模板(DEPTH, DENSITY, RESISTIVITY等),再调用lasio库写入:
import lasio
las = lasio.LASFile()
las.set_data({'DEPT': depths, 'DENS': density})
las.write('output.las')
Q4: 批量转换时如何保留属性表的编码(如UTF-8)?
A: 在ogr2ogr命令后添加-lco ENCODING=UTF-8,Python中设置out_ds.SetMetadataItem("ENCODING", "UTF-8")。
Q5: 能否在转换过程中自动修复无效几何(如自相交)?
A: 可以,使用OGR的MakeValid()方法:geom = geom.MakeValid(),或在命令行中使用-nlt PROMOTE_TO_MULTI。
总结与最佳实践建议
批量转换地质数据格式的核心在于:
- 标准化驱动:始终使用GDAL/OGR作为基础工具
- 错误留痕:在脚本中记录转换日志(成功/失败文件列表)
- 坐标系优先:转换前强制检查所有源数据的投影信息
- 渐进式处理:先测试10个文件,再全量运行
- 版本控制:保留原始数据与转换脚本的Git仓库
下一步行动指南:
- 检查你的原始数据源是否存在坐标系缺失问题
- 使用GDAL的
ogrinfo命令获取元数据:ogrinfo -al -so example.shp - 编写脚本来验证转换后文件在目标软件中的正常加载
通过以上方法,地质工作者可以将格式转换的效率提升10倍以上,同时确保数据在上下游工作流中的一致性,对于更复杂的格式(如GOCAD的VOXET、SKUA-GOCAD的WELL),建议参考各个软件官方SDK与GDAL驱动的结合使用。