news 2026/10/10 1:09:01

地质灾害点shp数据实战:七类灾害空间分析与风险评估全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
地质灾害点shp数据实战:七类灾害空间分析与风险评估全流程

简介:这份全国地质灾害点空间矢量数据面向地理信息、灾害防治、城乡规划及科研教学人员,系统整理了崩塌、塌陷、泥石流、地面沉降、地裂缝、滑坡和不稳定斜坡等七类灾害点的空间分布,可用于监测预警、风险评估、防治规划与灾后重建等场景。资源包共18个文件,约40.49MB,以shp、shx、dbf、prj、cpg、xml等标准GIS矢量格式为主,分别承载几何图形、索引、属性表、坐标投影与元数据信息,可直接在ArcGIS、QGIS等平台加载分析。目前已有270人学习下载。数据同时覆盖全国水系与地质隐患点等图层,便于叠加比对,为灾害成因分析、历史灾情重建和趋势预测提供第一手资料,也可作为高校与培训机构的案例素材,帮助读者快速建立对全国地质灾害空间格局的整体认知。

1. 地质灾害点空间矢量数据:七类灾害的 shp 文件到底怎么用

拿到一份标注了崩塌、塌陷、泥石流、地面沉降、地裂缝、滑坡、不稳定斜坡七种类型的全国地质灾害点空间矢量 shp 数据,第一反应往往是先拖进 GIS 软件看一眼点位分布。但真正做过灾害风险评估的人都知道,点位本身只是起点,关键在于属性表里有没有灾害类型编码、规模等级、发生时间这些字段,以及坐标系能不能和你的底图对上。这份资源解决的就是“灾害点在哪、是什么类型、密度多大”这三个基础问题,适合做区域风险区划、灾害易发性评价、国土空间规划前期排查的从业者。如果你手上只有 Excel 坐标表,或者拿到的点位没有分类字段,这份 shp 能省掉大量清洗时间。

2. 七类灾害的字段结构与坐标系:拿到数据先做这三件事

2.1 属性表字段的识别与类型编码对照

shp 文件的核心价值不在几何图形,而在属性表。七类灾害通常不会拆成七个独立文件,而是用一列类型字段区分。常见做法是建一个TYPE或HAZARD_TYPE字段,用中文或数字编码存储。数字编码更利于后续符号化,比如 1 代表崩塌、2 代表塌陷、3 代表泥石流、4 代表地面沉降、5 代表地裂缝、6 代表滑坡、7 代表不稳定斜坡。但不同来源的数据编码顺序可能不同,拿到后第一件事就是打开属性表确认编码规则。

用 Python 的geopandas可以快速查看字段结构和类型分布:

import geopandas as gpd # 读取 shp 文件,注意路径不要有中文和空格 gdf = gpd.read_file("./data/geohazard_points.shp") # 查看字段名、数据类型、非空数量 print(gdf.info()) # 查看灾害类型字段的取值分布 type_col = "TYPE" # 根据实际字段名替换 print(gdf[type_col].value_counts(dropna=False)) # 查看坐标系信息 print(gdf.crs)

这段代码的逻辑是先加载数据,再用info()看整体结构,value_counts()确认类型字段有没有空值或异常编码,最后检查crs属性。参数上唯一需要改的是type_col变量,把它换成你数据里实际的类型字段名。如果value_counts结果里出现 0 或 99 这类编码,说明存在未分类或缺失,需要单独处理。

2.2 坐标系判断与投影转换的实操步骤

全国范围的 shp 数据,坐标系常见两种:地理坐标系 WGS84(EPSG:4326)或 CGCS2000(EPSG:4490),单位是度;投影坐标系如 Albers 等面积投影,单位是米。做密度分析、缓冲区分析必须用投影坐标系,否则距离计算会随纬度变化产生偏差。判断方法很简单,看gdf.crs输出的unit是 degree 还是 metre。

如果拿到的是地理坐标系,需要转成适合全国范围的 Albers 投影。常用参数是中央经线 105°E,双标准纬线 25°N 和 47°N:

# 定义中国 Albers 等面积投影 albers_crs = "+proj=aea +lat_1=25 +lat_2=47 +lat_0=0 +lon_0=105 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" # 转换坐标系 gdf_proj = gdf.to_crs(albers_crs) # 验证转换后单位 print(gdf_proj.crs)

参数说明:lat_1和lat_2是双标准纬线,取 25 和 47 能覆盖中国大部分区域,面积变形最小;lon_0=105是中央经线,位于中国中部;units=m确保输出单位是米。转换后所有距离、面积计算才准确。如果只是做点位展示不做分析,可以跳过这步,但一旦涉及密度或缓冲区,这一步不能省。

2.3 数据完整性检查:空值、重复点与范围越界

属性表里常见的坑是空值和重复点。空值出现在类型字段会导致符号化时丢点,重复点会让密度分析结果虚高。用下面这段代码做三项检查:

# 检查类型字段空值 null_count = gdf_proj[type_col].isna().sum() print(f"类型字段空值数量:{null_count}") # 检查几何空值 empty_geom = gdf_proj.geometry.is_empty.sum() print(f"空几何数量:{empty_geom}") # 检查重复点(基于坐标) coords = gdf_proj.geometry.apply(lambda geom: (geom.x, geom.y)) dup_count = coords.duplicated().sum() print(f"重复坐标点数量:{dup_count}") # 检查范围是否越界(中国大致范围:经度73-135,纬度3-54) bounds = gdf_proj.total_bounds print(f"数据范围:{bounds}")

逻辑上先查属性空值,再查几何空值,最后用坐标元组判断重复。重复点不一定都是错误,同一位置发生多次灾害是可能的,但如果类型字段也完全相同,大概率是重复录入。范围检查用地理坐标系下的经纬度边界更直观,投影后的坐标范围需要反算回经纬度才能判断。

注意:如果total_bounds出现负数或异常大值,说明坐标系定义可能错了,不要急着做分析,先核对.prj文件内容。

3. 从点位到风险图:密度分析与分级设色的完整链路

3.1 核密度分析的参数选择与带宽确定

拿到灾害点后,最常用的分析是核密度估计,把离散点转成连续密度面。geopandas配合seaborn或scipy可以做,但更推荐用KDEpy或scipy.stats.gaussian_kde,因为可以控制带宽。带宽是核密度分析最关键的参数,太小则密度面破碎,太大则掩盖局部高发区。

常见做法是用 Silverman 经验法则先算一个参考带宽,再根据灾害点平均间距调整:

import numpy as np from scipy.stats import gaussian_kde # 提取投影后的坐标 x = gdf_proj.geometry.x.values y = gdf_proj.geometry.y.values positions = np.vstack([x, y]) # 计算 Silverman 参考带宽 n = len(x) std = np.sqrt((x.std()**2 + y.std()**2) / 2) bandwidth = std * n**(-1/6) print(f"Silverman 参考带宽:{bandwidth:.2f} 米") # 用参考带宽做核密度估计 kde = gaussian_kde(positions, bw_method=bandwidth / std)

参数说明:bw_method控制带宽,传入的是相对值。如果灾害点密集区集中在某个断裂带附近,带宽可以取参考值的 0.5 到 0.8 倍,让高发区更突出。如果做全省尺度区划,带宽取 1.2 到 1.5 倍,结果更平滑。没有绝对标准,取决于出图比例尺和决策粒度。

3.2 按灾害类型分层统计与制图输出

七类灾害的分布规律不同,滑坡和泥石流常沿沟谷分布,地面沉降和地裂缝集中在平原区,崩塌和不稳定斜坡多在山地。分层统计能看出这种差异:

# 按类型分组统计数量和平均位置 type_stats = gdf_proj.groupby(type_col).agg( 数量=(type_col, "count"), 中心经度=("geometry", lambda g: g.centroid.x.mean()), 中心纬度=("geometry", lambda g: g.centroid.y.mean()) ).reset_index() print(type_stats) # 导出分层结果 type_stats.to_csv("./output/type_summary.csv", index=False, encoding="utf-8-sig")

这段代码按类型字段分组,统计每类灾害的数量和中心位置。encoding="utf-8-sig"是为了 Excel 打开不乱码。输出结果可以直接放进报告,说明哪类灾害在哪个区域最集中。如果某类灾害数量极少(比如个位数),在后续制图中要单独标注,避免被其他类型的符号掩盖。

3.3 与行政区划叠加的统计方法

灾害点最终要落到行政区上才有管理意义。用geopandas的sjoin做空间连接,把点的类型属性挂到区县多边形上:

# 读取行政区划 shp admin = gpd.read_file("./data/admin_boundary.shp") # 统一坐标系 admin = admin.to_crs(gdf_proj.crs) # 空间连接:点落在哪个区县 joined = gpd.sjoin(gdf_proj, admin, how="left", predicate="within") # 按区县和灾害类型交叉统计 cross_tab = joined.groupby(["区县名称", type_col]).size().unstack(fill_value=0) print(cross_tab.head()) # 导出交叉表 cross_tab.to_csv("./output/county_type_cross.csv", encoding="utf-8-sig")

逻辑说明:sjoin的predicate="within"表示点完全落在多边形内,how="left"保留所有点,即使没匹配到区县也不丢。交叉表用unstack把类型字段转成列,行是区县,值是数量。这个表可以直接用于制作分区统计图,或者导入 Excel 做进一步排序。如果发现某些点没匹配到区县,检查行政区划的边界是否完整,或者点是否落在边界线上。

提示:空间连接前务必确认两个数据的坐标系一致,否则sjoin会报错或结果全空。用admin.crs == gdf_proj.crs判断,不相等就先to_crs。

4. 避坑与排查:shp 数据常见的五个翻车现场

4.1 中文属性表乱码:现象、原因与解决

现象:用 ArcGIS 打开属性表,中文字段显示为乱码或问号。原因:shp 文件的.dbf表默认编码是 GBK 或 UTF-8,但软件读取时用了错误编码。解决:用geopandas读取时指定encoding参数,比如gpd.read_file(path, encoding="gbk")或encoding="utf-8"。如果已经读进来乱码,用gdf[col].str.encode('latin1').str.decode('gbk')尝试修复。更稳妥的做法是导出时统一用 UTF-8,并在文件名里标注编码。

4.2 坐标系丢失:.prj 文件缺失导致位置偏移

现象:数据加载后点位跑到国外或海里。原因:shp 文件缺少.prj文件,软件默认按 WGS84 处理,但实际可能是其他坐标系。解决:先问数据提供方坐标系,或者用已知地物比对。如果确认是 CGCS2000,手动设置gdf.crs = "EPSG:4490",再转目标投影。不要直接to_crs,因为原始坐标系未知时转换没有意义。

4.3 重复点与悬挂点:密度分析结果虚高的排查

现象:核密度图出现异常高值斑块。原因:同一位置有多个重复点,或者点落在行政区边界上被两个区县同时统计。解决:用coords.duplicated()查重复,用drop_duplicates(subset=["geometry"])去重。边界悬挂点用sjoin时会出现一对多,改用predicate="within"并去重,或者用representative_point()把点移到多边形内部。

4.4 类型字段编码不一致:合并多来源数据时的对齐

现象:把两个来源的 shp 合并后,类型字段出现“滑坡”和“6”并存。原因:不同来源一个用中文一个用数字。解决:建一个映射字典统一编码,用map函数转换。映射前先value_counts确认所有取值,避免遗漏。转换后用assert检查没有空值。

4.5 大数据量卡顿:分块读取与空间索引

现象:全国几十万个点,sjoin跑十几分钟甚至内存溢出。原因:没有建空间索引,每次查询都全表扫描。解决:geopandas的sjoin默认会建索引,但如果数据太大,先用gdf.cx[经度范围, 纬度范围]做矩形裁剪,只保留研究区。或者用dask-geopandas分块处理。另一个技巧是把点转成GeoDataFrame后先to_file成 GeoPackage,读取速度比 shp 快很多。

5. 进阶技巧:用 QGIS 表达式批量符号化与出图模板

前面用 Python 做了分析和统计,但最终出图往往在 QGIS 里完成。七类灾害如果一个个手动设符号,改一次颜色要重复七遍,效率极低。用 QGIS 的表达式驱动符号化,可以一次配置、批量生效。

具体做法:在图层属性里打开符号化,选择“分类”模式,字段选TYPE,然后点“分类”按钮自动识别所有类型。但默认颜色是随机分配的,需要手动调。更高效的方式是用“规则”符号化,写七条规则,每条对应一个类型编码,颜色按灾害严重程度从暖到冷排列。比如滑坡和泥石流用红色系,地面沉降和地裂缝用橙色系,崩塌和不稳定斜坡用黄色系。

如果要在多个项目里复用这套符号,把图层样式导出为.qml文件,下次直接加载。导出方法:右键图层 → 导出 → 保存样式。加载时在符号化面板底部点“样式” → “加载样式”。

出图模板方面,QGIS 的打印布局可以保存为.qpt模板。把图例、比例尺、指北针、标题位置固定好,下次换数据只需替换图层。模板里图例的自动更新要勾选“按图层更新”,否则换了数据图例还是旧的。

还有一个容易被忽略的技巧:用 QGIS 的“几何生成器”给点加偏移。当多个灾害点重叠时,默认只显示最上面一个。在符号化里加一个“点偏移”符号层,用@geometry_point_num变量让重叠点自动散开,这样密度高的区域能看出点的数量差异,而不是糊成一团。

从那以后我每次拿到新的 shp 数据,都强制走一遍“看字段 → 查坐标系 → 去重 → 建索引”这四步,不管数据来源多可靠都不跳过。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 1:08:33

PCA9422+ATmega2560构建闭环电源管理架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 1:08:32

STM32与PCA9422 PMIC的嵌入式电源管理实战:I2C调压与低功耗设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 1:08:17

相机标定实战指南:四种模型与标定板选择,避开双目测距那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 1:07:41

PCA9422与R7FA6M4AF3CFB协同实现嵌入式电源闭环管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 1:07:02

STM32与PCA9422的PMIC电源管理方案:从硬件到软件全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 1:06:41

从SQLCipher到FTS5:构建微信聊天记录实时查询与增量同步管道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华