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

wen 实用脚本 25

脚本实现高效数据治理的完整指南

目录导读

  1. 为什么需要批量转换地质数据格式?
  2. 常见地质数据格式类型与转换难点
  3. 核心脚本工具与选型建议
  4. Python脚本实战:从SHP到GeoJSON的批量转换
  5. 自动化处理中的常见错误与解决方案
  6. 问答环节:地质数据格式转换的5个高频问题
  7. 总结与最佳实践建议

为什么需要批量转换地质数据格式?

在地质勘探、矿山建模、水文分析等工作中,数据来源往往多样:钻孔数据、地球物理测井数据、地质体模型、地形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脚本:结合pandasnumpy处理非标准格式

推荐选择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: 可以,使用OGRMakeValid()方法:geom = geom.MakeValid(),或在命令行中使用-nlt PROMOTE_TO_MULTI


总结与最佳实践建议

批量转换地质数据格式的核心在于:

  • 标准化驱动:始终使用GDAL/OGR作为基础工具
  • 错误留痕:在脚本中记录转换日志(成功/失败文件列表)
  • 坐标系优先:转换前强制检查所有源数据的投影信息
  • 渐进式处理:先测试10个文件,再全量运行
  • 版本控制:保留原始数据与转换脚本的Git仓库

下一步行动指南

  1. 检查你的原始数据源是否存在坐标系缺失问题
  2. 使用GDAL的ogrinfo命令获取元数据:ogrinfo -al -so example.shp
  3. 编写脚本来验证转换后文件在目标软件中的正常加载

通过以上方法,地质工作者可以将格式转换的效率提升10倍以上,同时确保数据在上下游工作流中的一致性,对于更复杂的格式(如GOCAD的VOXET、SKUA-GOCAD的WELL),建议参考各个软件官方SDK与GDAL驱动的结合使用。

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