资讯详情

中国喀斯特岩溶SHP矢量数据集:GIS叠加分析与面积统计实战指南

📅 2026/10/7 3:06:24 | 华诺云谱 👁 阅读
中国喀斯特岩溶SHP矢量数据集:GIS叠加分析与面积统计实战指南
简介这份中国喀斯特岩溶空间分布矢量数据集面向GIS、地理学与地质科研人员及学生用于岩溶地貌区域划分、溶蚀作用模拟与地质灾害监测等空间分析场景。资源包共8个文件约1.2MB以SHP格式为核心配套shx与sbn/sbx索引、dbf属性表、prj坐标系统定义、cpg存储参数及shp.xml元数据构成可直接在GIS软件中读取的完整数据集。数据以面状Polygon记录岩溶地块边界属性含rock_type岩性分类连续与不连续碳酸盐岩、Shape_Area与Shape_Len面积周长、RTypeLabel岩性文本标签便于快速筛选与统计。已有263人学习下载适合需要一手空间数据开展南方喀斯特研究、制图与建模的读者可直接用于区域划分、生态评价与土地资源管理等分析。1. 喀斯特岩溶空间分布矢量数据集一份能直接进 GIS 跑分析的 SHP 底图做西南地区水文、地质灾害或生态评估的同行大概率都遇到过同一个尴尬手头有降雨栅格、有 DEM、有土壤类型唯独缺一层靠谱的岩溶分布边界模型跑到一半发现碳酸盐岩区被当成普通碎屑岩处理结果全歪。这份中国喀斯特岩溶空间分布矢量数据集就是来补这个缺口的——它以 SHP 格式提供全国尺度的岩溶空间分布范围属性表里带类型划分字段能直接拖进 ArcGIS、QGIS 或 PostGIS 做叠加、裁剪、统计。适合做区域地质背景分析、岩溶塌陷易发性评价、地下水资源区划的人也适合需要一份全国尺度底图来出图的学生。它不是遥感影像是已经矢量化好的面要素省掉了你自己从地质图描边的几天工作量。2. 先搞懂这份 SHP 里装的是什么字段、坐标系与几何类型拿到一个 SHP 别急着往地图里拖先花十分钟把它的骨架摸清楚后面能省掉一堆“为什么叠加不上”“为什么面积算出来是负的”之类的破事。这个数据集的核心价值不在“有面”而在“面被分了类”分类字段决定了你能拿它做什么分析。2.1 属性表字段与岩溶类型编码SHP 的属性表.dbf是它的灵魂。常见做法是这类岩溶分布数据会带一个类型字段把碳酸盐岩按出露条件或岩性组合分成几类比如裸露型、覆盖型、埋藏型或者按可溶岩性分成石灰岩、白云岩、石膏等。字段名可能是KARST_TYPE、TYPE、LITHO这类值可能是中文也可能是数字编码。你拿到手第一件事是打开属性表看一眼。在 QGIS 里右键图层 → 打开属性表在 ArcGIS 里右键 → Open Attribute Table。重点看三列类型字段、面积字段如果有、名称字段。如果类型字段是数字编码通常还会配一个.lyr或.qml样式文件或者编码含义写在附带的说明里。没有说明的话按编码值去重后对照地质图判读别硬猜。提示如果属性表里出现乱码多半是 .cpg 文件缺失或编码不对。SHP 的 dbf 默认用 GBK 或 UTF-8QGIS 里可以在图层属性 → 源 → 数据编码里手动切。2.2 坐标系判断地理坐标还是投影坐标这是最容易翻车的地方。全国尺度的 SHP 常见两种坐标系一种是地理坐标系 WGS84EPSG:4326或 CGCS2000EPSG:4490单位是度另一种是投影坐标系比如 Albers 等积投影常见于全国性数据或高斯克吕格分带投影单位是米。怎么判断在 QGIS 里看图层属性 → 信息 → CRS或者用ogrinfo命令行直接读。如果单位是度你做面积统计前必须重投影否则算出来的“面积”是平方度毫无意义。全国尺度做面积统计我一般会转到 Albers 等积投影国内常用参数是中央经线 105°E双标准纬线 25°N 和 47°N。# 用 GDAL 查看 SHP 的坐标系和字段信息 ogrinfo -so -al china_karst.shp # 输出里重点看 Geometry、Feature Count、Extent 和 Coordinate System # 如果 Coordinate System 显示为 Geographic单位就是度这段命令的-so是 summary only-al是列出所有图层。输出里Extent告诉你数据覆盖范围Feature Count告诉你有多少个面。如果 Extent 的经纬度范围大致是 73–135°E、18–54°N那基本确认是全国地理坐标。2.3 几何类型与拓扑检查岩溶分布数据通常是面要素Polygon但也可能是多面体MultiPolygon。多面体在裁剪和叠加时问题不大但在某些老版本软件里做联合Union会报错。拿到数据后跑一次几何有效性检查QGIS 里用“检查有效性”ArcGIS 里用“修复几何”。常见问题是自相交、悬挂节点、重复面。# 用 geopandas 快速检查几何有效性和坐标系 import geopandas as gpd gdf gpd.read_file(china_karst.shp) print(CRS:, gdf.crs) print(几何类型:, gdf.geom_type.unique()) print(要素数:, len(gdf)) print(无效几何数:, (~gdf.is_valid).sum()) # 如果有无效几何修复后再导出 gdf_fixed gdf.copy() gdf_fixed[geometry] gdf_fixed.buffer(0) gdf_fixed.to_file(china_karst_fixed.shp, encodingutf-8)buffer(0)是修复自相交几何的常用技巧代价是会轻微改变边界但对全国尺度分析影响可忽略。encodingutf-8保证中文属性不乱码。检查完这两步你才算真正“认识”了这份数据。3. 把 SHP 用起来叠加分析、面积统计与格式转换数据摸清楚了接下来是干活。这一章覆盖三个最高频的操作和行政区划叠加统计各省岩溶面积、按类型提取子集、以及转成其他格式喂给别的工具。每个操作我都给出可复现的代码或步骤参数怎么改也说清楚。3.1 与行政区划叠加分区统计岩溶面积最常见的需求是“每个省/每个县有多少岩溶”。思路是把岩溶面按行政区划边界做相交Intersection然后按行政区字段分组求和面积。前提是两者坐标系一致不一致先统一。import geopandas as gpd # 读取岩溶数据和行政区划 karst gpd.read_file(china_karst.shp) admin gpd.read_file(county_boundary.shp) # 统一到 Albers 等积投影单位米 albers projaea lat_125 lat_247 lat_00 lon_0105 x_00 y_00 datumWGS84 unitsm no_defs karst_proj karst.to_crs(albers) admin_proj admin.to_crs(albers) # 相交 inter gpd.overlay(karst_proj, admin_proj, howintersection) # 新增面积字段平方公里 inter[area_km2] inter.geometry.area / 1e6 # 按行政区名称和岩溶类型分组统计 result inter.groupby([省, KARST_TYPE])[area_km2].sum().reset_index() result.to_csv(karst_area_by_province.csv, indexFalse, encodingutf-8-sig)gpd.overlay的howintersection保留两者重叠部分。area / 1e6是把平方米转平方公里。分组字段[省, KARST_TYPE]要换成你数据里实际的字段名。encodingutf-8-sig让 Excel 打开 CSV 不乱码。这一步跑完你就有了各省分类型的岩溶面积表直接能进报告。注意如果行政区划边界和岩溶数据边界有缝隙或重叠相交结果会出现面积偏小或重复。跑之前对两者都做一次“修复几何”。3.2 按类型提取子集与批量导出有时候你只关心裸露型岩溶或者要把每种类型单独出图。用属性筛选加循环导出即可。import geopandas as gpd gdf gpd.read_file(china_karst.shp) # 查看类型字段的所有取值 print(gdf[KARST_TYPE].unique()) # 按类型循环导出 for ktype in gdf[KARST_TYPE].unique(): subset gdf[gdf[KARST_TYPE] ktype] # 文件名里的特殊字符替换掉 safe_name str(ktype).replace(/, _).replace( , ) subset.to_file(fkarst_{safe_name}.shp, encodingutf-8) print(f{ktype}: {len(subset)} 个要素)unique()先看有哪些类型避免筛选条件写错。文件名替换是防止类型名里带斜杠导致路径错误。导出后每个子集都是独立 SHP方便单独符号化。3.3 格式转换SHP 转 GeoJSON、WKT 与 3D Tiles 的边界SHP 是老格式字段名限 10 个字符中文支持也一般。很多时候要转成 GeoJSON 给前端或者转 WKT 入库。热搜里常出现的shp转txt、shp格式矢量数据导出为wkt本质都是属性加几何的文本化。import geopandas as gpd gdf gpd.read_file(china_karst.shp) # 转 GeoJSON gdf.to_file(china_karst.geojson, driverGeoJSON) # 导出 WKT 到 txt with open(karst_wkt.txt, w, encodingutf-8) as f: for idx, row in gdf.iterrows(): f.write(f{row[KARST_TYPE]}\t{row.geometry.wkt}\n)GeoJSON 用driverGeoJSON指定。WKT 导出时用制表符分隔类型和几何方便后续解析。至于shp转3dtiles那是把面拉伸成体块做三维可视化需要额外工具如3dtiles转换器不是 SHP 本身能直接搞定的别被热搜词带偏。4. 避坑与排查坐标系、面积、字段和性能的五个血泪经验这一章是我自己踩过的坑按“现象 → 原因 → 解决”写。你照着排查能省下至少一个下午。4.1 现象叠加后一片空白什么也看不到原因两个图层坐标系不一致一个地理坐标一个投影坐标软件按数值直接叠位置差了几十万米。解决统一 CRS 后再叠加。QGIS 里用“重新投影图层”代码里用to_crs()。别信“动态投影”能解决一切导出结果时它经常不生效。4.2 现象面积统计出来是负数或极小值原因在地理坐标系下直接算面积单位是平方度且高纬度地区变形严重。解决先转等积投影再算。全国数据用 Albers省级数据可以用对应中央经线的高斯投影。记住一句话算面积必须投影。4.3 现象属性表中文全是问号或乱码原因.dbf 文件编码和软件读取编码不匹配或者 .cpg 文件缺失。解决QGIS 里手动指定编码为 GBK 或 UTF-8 试代码里read_file(..., encodinggbk)。导出时统一用encodingutf-8并确保生成 .cpg 文件。4.4 现象字段名被截断成 10 个字符以内原因SHP 格式本身限制字段名最长 10 个字符。解决这是格式硬伤改不了。要么接受截断要么转成 GeoJSON 或 File Geodatabase 再操作。我一般会在转换后重新映射字段名。4.5 现象全国数据叠加时卡死或内存溢出原因面要素太多、节点太密叠加运算量爆炸。解决先按研究区裁剪再做叠加或者用 PostGIS 空间索引跑比桌面软件稳。QGIS 里可以先用“提取范围”裁出目标区域。5. 进阶技巧用渔网分割与空间索引加速大区域统计当你需要做格网化统计比如按 10km×10km 渔网统计岩溶覆盖率直接对全国数据跑会非常慢。我的习惯是先用渔网分割再建空间索引最后分组统计。这套流程在县域尺度做岩溶塌陷易发性评价时特别顺手。5.1 生成渔网并裁剪到研究区import geopandas as gpd from shapely.geometry import box import numpy as np # 读取研究区边界和岩溶数据 study_area gpd.read_file(study_boundary.shp) karst gpd.read_file(china_karst.shp).to_crs(study_area.crs) # 获取研究区范围 minx, miny, maxx, maxy study_area.total_bounds cell_size 10000 # 10km # 生成渔网 cols np.arange(minx, maxx, cell_size) rows np.arange(miny, maxy, cell_size) cells [box(x, y, x cell_size, y cell_size) for x in cols for y in rows] grid gpd.GeoDataFrame({geometry: cells}, crsstudy_area.crs) # 裁剪到研究区 grid gpd.clip(grid, study_area) # 与岩溶数据相交 inter gpd.overlay(grid, karst, howintersection) inter[karst_area] inter.geometry.area inter[coverage] inter[karst_area] / (cell_size ** 2) # 按网格聚合 grid_stats inter.groupby(inter.index)[coverage].sum() grid[coverage] grid_stats grid[coverage] grid[coverage].fillna(0) grid.to_file(karst_grid_coverage.shp, encodingutf-8)cell_size按你的分析尺度改做县级用 1km做省级用 10km。gpd.clip把渔网裁到研究区避免多余计算。coverage是每个网格内岩溶面积占比直接用于后续易发性建模。5.2 建空间索引与批量统计的取舍如果数据量再大比如全国 1km 渔网geopandas 会吃满内存。这时候我会把数据导入 PostGIS建 GiST 索引用 SQL 跑聚合。桌面端和数据库端的差别在百万级面要素时非常明显。另一个技巧是先把岩溶数据按类型 dissolve 掉减少要素数再叠加能快好几倍。-- PostGIS 里按渔网统计岩溶覆盖率 CREATE TABLE karst_grid AS SELECT g.id, SUM(ST_Area(ST_Intersection(g.geom, k.geom))) / ST_Area(g.geom) AS coverage FROM grid g JOIN karst k ON ST_Intersects(g.geom, k.geom) GROUP BY g.id;ST_Intersects走空间索引ST_Area在投影坐标系下才准确。这段 SQL 的前提是两张表都已经在投影坐标系且建了索引。从那以后我每次拿到新的 SHP都强制走一遍“看 CRS → 查字段 → 验几何 → 试叠加”这四步再也没出现过算完面积发现单位是度的情况。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑