mcpField
G
gemgis

gemgis

github.com/steadfastasart数据与数据库7363 次安装6 周前更新
代码仓库

关于 gemgis

gemgis 是用于为地质空间建模准备观测数据和 DEM 高程的技能,重点处理坐标系、单位、产状约定及缺失数据,并可验证输入后导出 CSV 和元数据。

主要功能

  1. 01提取接触线顶点及 DEM 高程
  2. 02验证 CRS 与高程约定
  3. 03将矢量重投影至 DEM CRS
  4. 04将声明为英尺的高程换算为米
  5. 05导出 CSV 和空间元数据

适用场景

  1. 01为建模准备接触线和产状数据
  2. 02检查 DEM 采样及 NoData 处理
  3. 03统一矢量 CRS 和声明的高程单位
  4. 04核验产状方位角约定

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/steadfastasart/geoscience-skills --skill gemgis

安装后在 Claude Code 中输入/gemgis确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
data_extraction.md
vector_raster.md
scripts/
prepare_gempy_data.py

详细介绍

GIS 接触点与 DEM 高程

使用 GemGIS 从空间数据中提取地质观测数据。采样前,请确定水平坐标参考系(CRS)、垂直单位/基准面、几何类型和缺失数据处理策略。模型坐标必须使用以米为单位的投影 CRS;转换水平坐标不会转换高程或其基准面。

提取接触线顶点

以下函数接受一个已处于以米为单位的投影 CRS、且高程单位为米的单波段 DEM。dem 是已打开的 Rasterio 数据集,而不是路径。GemGIS 会在线段拆分为多个点时重复属性:不要使用原始要素索引覆盖这些属性。

import gemgis as gg
from rasterio.transform import rowcol
import numpy as np
from pyproj import CRS

def contacts_at_dem(contacts, dem):
    crs = CRS.from_user_input(dem.crs)
    if (contacts.crs is None or not crs.is_projected or dem.count != 1
            or any(not np.isclose(a.unit_conversion_factor, 1.) for a in crs.axis_info[:2])):
        raise ValueError('Require a known vector CRS and a single-band metric DEM')
    if contacts.empty or not contacts.is_valid.all() or contacts.geometry.has_z.any():
        raise ValueError('Require valid nonempty 2D contact geometry')
    if 'formation' not in contacts or contacts['formation'].isna().any():
        raise ValueError('Formation labels are required')
    points = gg.vector.extract_xy(contacts.to_crs(dem.crs))
    xy = points[['X', 'Y']].to_numpy()
    rows, cols = np.asarray(rowcol(dem.transform, xy[:, 0], xy[:, 1]))
    if np.any((rows < 0) | (rows >= dem.height) | (cols < 0) | (cols >= dem.width)):
        raise ValueError('Vertices outside DEM')
    samples = np.ma.vstack(list(dem.sample(xy, indexes=1, masked=True)))[:, 0]
    if np.ma.getmaskarray(samples).any() or not np.isfinite(samples.data).all():
        raise ValueError('Missing DEM elevations')
    return gg.vector.extract_xyz(gdf=points, dem=dem)[['X', 'Y', 'Z', 'formation']]

使用 with rasterio.open(dem_path) as dem: 打开数据集,并在数据集保持打开时调用此函数。像元采样使用包含该点的单元;它不是双线性插值。请勿将 NoData 或范围外样本填充为零。

方位与辅助工具

倾角以度为单位,范围为 0–90。输出方位角为从 DEM 网格北方向顺时针测量的倾向角,并限制在 [0, 360) 范围内。仅当源数据明确遵循右手定则时,才使用 (strike + 90) % 360 转换走向。保留提供的极性(+1/−1);仅当列不存在时,辅助工具才使用 +1。切勿将无效倾角限制在有效范围内。对于已相对于 DEM 网格测量的方位角,声明 --azimuth-reference dem-grid;对于地理方位角,声明 true-north。后者仅在局部保角投影中应用局部子午线收敛角;其他投影会被拒绝。磁方位角必须先进行有记录的磁偏角校正。

准备辅助工具会验证这些规则、将矢量重投影到 DEM CRS、将声明为英尺的高程转换为米,并在全新的输出目录中写入 CSV 文件和 spatial_metadata.json。其 --target-crs 是一项断言,必须与 DEM 匹配;如有需要,请单独重采样/重投影栅格。

python scripts/prepare_gempy_data.py --contacts contacts.gpkg \
  --orientations orientations.gpkg --azimuth-reference true-north --dem dem.tif --dem-z-unit m \
  --vertical-datum "documented source datum" --output-dir prepared

请根据已安装的技能目录解析此命令。输出架构使用 X/Y/Z 和 formation,此外还包括产状的 dip/azimuth/polarity;请将这些数据传递给当前建模库的输入 API,而不要假设所有 GemPy 版本都接受相同的关键字参数。

条件操作

请阅读剖面与数据提取,了解采样剖面和产状约定。请阅读CRS、裁剪与栅格处理,了解边界顺序、掩膜、重投影和溯源信息。使用此辅助工具前,现有 3D 几何需要明确选择采用实测 Z 值还是 DEM Z 值。

验证范围

已使用真实 GeoTIFF/GeoPackage 测试数据检查 GemGIS 1.1.9、GeoPandas 1.1.4 和 Rasterio 1.4.4,涵盖顶点数不等且索引不连续、CRS 转换、英尺高程、NoData、范围外点、产状以及 CLI CSV 回读。合成高程测试的是数据处理,而非野外 DEM 的准确性或垂直基准转换。

GemGIS 官方源代码, Rasterio 采样 API, 核验日期:2026-09-14。

评论

支持 Markdown