关于 gemgis
gemgis 是用于为地质空间建模准备观测数据和 DEM 高程的技能,重点处理坐标系、单位、产状约定及缺失数据,并可验证输入后导出 CSV 和元数据。
主要功能
- 01提取接触线顶点及 DEM 高程
- 02验证 CRS 与高程约定
- 03将矢量重投影至 DEM CRS
- 04将声明为英尺的高程换算为米
- 05导出 CSV 和空间元数据
适用场景
- 01为建模准备接触线和产状数据
- 02检查 DEM 采样及 NoData 处理
- 03统一矢量 CRS 和声明的高程单位
- 04核验产状方位角约定
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill gemgis安装后在 Claude Code 中输入/gemgis确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/data_extraction.mdvector_raster.mdscripts/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。