
简介全国地质灾害点空间矢量shp分布数据面向GIS从业者、地质灾害研究者及城乡规划人员用于崩塌、塌陷、泥石流、地面沉降、地裂缝、滑坡和不稳定斜坡等灾害点的空间分布展示与分析可为监测预警、风险评估和灾后重建提供基础底图。资源压缩包约40.49MB共18个文件其中shp为矢量主文件配套dbf保存属性表shx、prj、cpg、xml分别提供索引、坐标参考、字符编码和元数据说明结构完整。目前已有259人学习下载可用于灾害成因研究、区域易发性评价、工程建设避让选址以及相关教学案例。借助该数据用户可以快速掌握全国地灾点的宏观分布规律结合属性字段开展专题制图与统计分析为灾害防治决策和科研工作提供支撑。1. 一份全国地质灾害点shp到底能解决什么实际问题地质灾害点空间矢量shp分布数据听起来像是个GIS专用名词实际上它解决的是非常具体的问题你手上有没有一张图能直接回答「这个县哪些村边上存在崩塌、滑坡、泥石流隐患」「拟建的线性工程穿过几个地灾隐患区」这类问题。把全国范围内的崩塌、塌陷、泥石流、地面沉降、地裂缝、滑坡、不稳定斜坡七类灾害点位落成点状shp最常见的用途是区域易发性评价、建设项目选址避让、国土空间规划里的灾害风险底图。我接触这份数据最多的场景是在可研阶段业主让你三天内答复选线方案是否避开了已知地灾隐患点没有这份矢量数据就只能翻纸质图册效率完全不是一个量级。适合谁用也很明确做地灾防治项目的勘察设计人员、规划院做双评价的技术人员、做环境影响评价的机构以及高校里研究地质灾害空间分布规律的研究生四类人群占了绝大多数使用场景。2. 看懂shp的数据模型七类灾种在属性表里怎么区分2.1 点状shp为什么是这个项目的唯一合理形态地质灾害数据的空间表达形式有过很多尝试但最终落到成果层面点状shp几乎成了事实标准。原因不复杂地灾隐患点的核心信息是「位置 灾种 规模 威胁对象」用一个点就能承载定位信息再靠属性表挂载其余内容。有人会问泥石流沟、滑坡体明明是有面积的为什么不用面状实际工作中隐患点有个「群测群防」的管理前提——每个点对应的是具体威胁对象和监测责任人管理粒度是点而不是体块面状数据对精度要求高野外实测成本大不同批次成果之间边界难以统一给后续管理留下很多麻烦。所以你在绝大多数公开成果里看到的都是以点为主偶有泥石流沟道用线或面表达的补充图层。这份数据里包含七个灾种崩塌、塌陷、泥石流、地面沉降、地裂缝、滑坡、不稳定斜坡。在shp属性表中它们通常用一个灾种代码字段区分常见的是DZ或HZDM之类的短整型字段数值1到7对应七类。也有的成果直接用汉字字段存灾种名称这种情况下查询虽然直观但不同批次的命名习惯不一致比如「崩塌」和「岩崩」、「滑坡」和「滑塌」都需要统一。拿到数据第一件事不是急着打开地图看而是先用属性表看一眼分类字段到底怎么存的。2.2 用Python快速探查shp的字段结构和灾种分布在没有GIS桌面软件的环境下最快摸清一份shp底细的方式是用ogrinfo看元数据再用 Python 的geopandas做字段统计。这里给出一个可以直接跑通的探查脚本前提是本机已装好geopandas和pyshp两个库。import geopandas as gpd # 读取shp第一个参数是文件路径注意中文路径在Windows下建议用原始字符串r... gdf gpd.read_file(rD:\geo_data\地质灾害点.shp, encodingutf-8) # 查看属性字段名和类型确认灾种字段到底叫啥 print(gdf.dtypes) # 打印字段列表人工确认哪个是灾种分类字段 print(gdf.columns.tolist()) # 假设灾种字段叫 DZDM按值统计各灾种数量 if DZDM in gdf.columns: print(gdf[DZDM].value_counts())脚本逻辑分三步先读文件并把字段类型打印出来让字段名和类型一览无余再输出列名清单方便对照数据说明书确认语义最后按灾种字段做数值统计能立刻看出七类灾害点的数量配比。参数层面要注意两点一是encoding参数国内大多数shp属性表用utf-8但老一批数据可能是gbk读出来是乱码就换编码重试二是DZDM这个字段名不是标准我见过叫LXDJ类型等级、DISASTER_TYPE、灾种的别硬套字段名。2.3 shp文件与dwg、kml、json的边界以转换为入口理解结构职场上常有人把AUTOCAD的dwg地形图直接改成shp来用这是典型的「数据搬家」。dwg存储的是图形实体和图层组织属性信息要么写在扩展数据里要么干脆没有转成shp后属性表往往是空的。常见做法是利用GIS平台将dwg按图层和要素类型转出转换时分别提取点、线、面并在字段映射中把块属性、文字标注转出来。这里的核心逻辑是shp的核心资产不在图形而在属性表。一张只有Geometry没有属性的shp和一张CAD底图没有本质区别分析价值很低。与此对应的另一个问题是shp与kml、json互转。shp是矢量数据格式的事实标准kml适合Google Earth展示geojson适合WebGIS接口传输3dtiles适合倾斜摄影模型前端加载。需要围绕shp做交互就不建议保留单一格式常见做法是导出多格式副本。转换工具方面QGIS、ArcGIS Pro自带转换对话框但如果你想在批处理里完成这些操作用GDAL的ogr2ogr命令即可转geojson用ogr2ogr -f GeoJSON转kml用ogr2ogr -f KML。热词里「shp转3dtiles」通常是先把shp按属性拉伸成三维要素再切3dtiles这已超出数据准备的范畴更接近三维可视化生产流程我后面会单独讲做法。3. 拿到shp先别急着分析坐标基准、字段完整性和范围核对3.1 坐标系判别地灾数据最隐蔽的硬伤地质灾害point数据最容易翻车的地方不是图形精度而是坐标基准不一致。国内老一批地灾成果里有西安80坐标系新成果基本是CGCS2000或WGS84投影方式又分地理坐标经纬度和高斯投影平面坐标。两份不同来源的shp叠在一起如果基准不一致视觉上点位偏移可能有几十米到几百米这在隐患点避让分析里是致命的——明明图上已经远离了300米实地却还在隐患范围内。拿到shp后的第一步规范操作是用ogrinfo命令确认坐标系定义再看数据说明文件里的描述是否与shp内置的.prj文件一致。我的习惯是这样# 查看shp的完整元数据包括坐标系、要素数量、图层范围 ogrinfo -so D:\geo_data\地质灾害点.shp 地质灾害点 # 只看空间参考信息 ogrinfo -so -al D:\geo_data\地质灾害点.shp | findstr /i wkt extent-so代表summary only只输出概要信息不展开全部要素速度快-al表示all layers。输出中如果看到GCS_China_Geodetic_Coordinate_System_2000加上单位是Degree说明是CGCS2000地理坐标如果是带CGCS2000 / 3-degree Gauss-Kruger zone 40之类描述的投影坐标系单位是米。这里有个坑很多数据的.prj文件缺失或写错ogrinfo读出来是undefined或空这时候不能猜要靠点位坐标的量级来判断经纬度大约在73到135度之间平面坐标大约在几千万量级或者几百公里量级。3.2 属性表补课点位数据最常见的三种脏数据属性表里最常见的脏数据第一是灾种字段为空的记录第二是坐标字段与实际几何位置矛盾第三是威胁对象字段与灾种语义不匹配。这三个问题直接决定数据能不能用于评价分析。拿日常处理经验说灾种字段为空的原因大多是作业人员在野外平板采集时漏录入后期抽查质检时才补。这种问题在拿到成果时已经存在解决思路不是让你重新跑野外而是结合点位的存档文字描述做规则推断比如名称字段含「危岩」「孤石」映射为崩塌含「滑面」「滑带」映射为滑坡。规则推断会有误判所以推断结果必须人工抽检复核。坐标字段与几何位置矛盾也很典型通常表现为属性表里X、Y字段存的坐标和shp实际点位对不上原因是外业调查表与GIS建库是两条线作业后期关联时行错位。检查方法是用Python读取几何坐标与属性坐标做差如果误差超过设定阈值就标记出来。这个脚本不复杂import geopandas as gpd import pandas as pd gdf gpd.read_file(rD:\geo_data\地质灾害点.shp, encodingutf-8) # 取出几何坐标 gdf[geom_x] gdf.geometry.x gdf[geom_y] gdf.geometry.y # 计算与属性坐标的差值阈值设0.001度约110米可按需调整 gdf[dx] abs(gdf[geom_x] - gdf[X]) gdf[dy] abs(gdf[geom_y] - gdf[Y]) # 筛选异常记录 bad gdf[(gdf[dx] 0.001) | (gdf[dy] 0.001)] print(f异常记录数: {len(bad)}) print(bad[[X, Y, geom_x, geom_y, dx, dy]].head(20))这段脚本的核心价值是快速定位坐标属性与几何分裂的记录。阈值0.001度约为赤道附近110米适用于中小比例尺筛查如果你做的是大比例尺详细调查建议阈值压到0.0001度。跑完脚本把异常记录导出成excel发给数据生产方人工核实比你一个点一个点看图靠谱得多。3.3 范围核对用图层Extent和行政区边界双重验证坐标基准查验和字段筛查之外还要做的第三件事是核对数据覆盖范围。行业里有个很实在的教训数据范围与标题声称不一致比如你要的是全国数据但成果只有某几个省份原因是不同来源的合并过程中漏了图层。这类数据不全的问题靠肉眼检查地图一般发现不了。用geopandas检查图层范围是最快的import geopandas as gpd gdf gpd.read_file(rD:\geo_data\地质灾害点.shp, encodingutf-8) # total_bounds返回(minx, miny, maxx, maxy) bounds gdf.total_bounds print(f范围: 西 {bounds[0]:.4f}, 南 {bounds[1]:.4f}, 东 {bounds[2]:.4f}, 北 {bounds[3]:.4f}) # 按省份字段统计确认覆盖了哪些行政区 if 省 in gdf.columns: print(gdf[省].value_counts())如果total_bounds输出的东西与全国范围两个数量级不符比如东西跨度只有两三度那就是局部数据。这个时候与其硬凑分析不如回头向数据提供方确认覆盖范围否则后续阐述性的结论很容易被审稿人或业主抓到数据缺陷。范围检查还有个价值点如果你拿到的数据是「全国」标题但实际只覆盖部分行政区那你后续做叠加分析时所用的区划底图请务必裁到与灾害数据一致的范围避免把无数据区域误判为「零隐患」。4. 从shp到结论三类常用分析怎么落地4.1 缓冲区分析判断工程选址是否触碰灾种影响范围地灾点数据最常见的落地场景是把隐患点周围一定距离内的敏感目标识别出来。规范做法是围绕每个灾害点做缓冲区再与评估对象做叠加。缓冲区半径怎么定是这套分析里最容易产生分歧的地方——不同灾种的影响范围差别极大崩塌按落石运动距离定一般取50到100米滑坡考虑滑体及前缘影响带常见取100到200米泥石流则要结合沟道长度取沟口至堆积扇范围干线工程往往会单独论证。经验上可以按「灾种分档设置距离」处理代码实现也直接import geopandas as gpd from shapely.geometry import Point gdf gpd.read_file(rD:\geo_data\地质灾害点.shp, encodingutf-8) # 灾种对应的缓冲半径单位米按实际项目调整 buffer_dist { 崩塌: 100, 塌陷: 150, 泥石流: 200, 地面沉降: 100, 地裂缝: 50, 滑坡: 150, 不稳定斜坡: 100 } # 先确保数据是投影坐标系单位是米如果是经纬度先投影再缓冲 if gdf.crs.is_geographic: gdf gdf.to_crs(EPSG:4547) # CGCS2000 / 3-degree Gauss-Kruger zone 40按需改 gdf[buffer_geo] gdf.apply( lambda row: row.geometry.buffer(buffer_dist.get(row[DZDM], 100)), axis1 ) # 转成GeoDataFrame输出 buf_gdf gpd.GeoDataFrame(gdf, geometrybuffer_geo, crsgdf.crs) buf_gdf.to_file(rD:\geo_data\地灾点_缓冲区.shp, encodingutf-8)脚本里的两个关键参数EPSG:4547是CGCS2000三度带投影示例实际应根据项目所在经度选择合适的带号别照抄缓冲区距离放在字典里统一管理后面规范要求变了改一处就行。执行完成后再与规划选址矢量做overlay就能统计出有多少拟建建筑落在灾害影响范围内。这个结果图通常要作为选址论证的支撑材料属性表里也要保留原始灾种字段方便专家看图时核对半径设定逻辑。4.2 灾种分布密度制图核密度分析与网格统计的取舍做区域易发性评价之前技术人员常用灾害点分布密度来做一个「热力图」式的宏观研判。这里有两类技术路线一是核密度分析Kernel Density输出连续平滑的密度表面二是网格统计在渔网内做点计数。核密度适合做区域宏观态势网格统计适合与栅格因子叠加建模。渔网分割shp这个常见诉求正是在网格统计这一步出现频率最高。网格统计的常见做法是先创建一个覆盖研究区的渔网面再对灾害点做空间连接。Fisher信息用ArcGIS的Create Fishnet工具或者用geopandas也能实现但要注意渔网尺寸的选择——精度过高会产生大量空网格统计图斑破碎过低会掩盖空间分异规律。常见做法是以行政区级评价用1km x 1km网格县级评价用250m或500m网格。代码段如下import geopandas as gpd import numpy as np gdf gpd.read_file(rD:\geo_data\地质灾害点.shp, encodingutf-8) # 转投影坐标系 gdf gdf.to_crs(EPSG:4547) # 研究区范围用点数据的边界外扩500m minx, miny, maxx, maxy gdf.total_bounds # 渔网尺寸500m x 500m cell_size 500 cols int((maxx - minx) / cell_size) 1 rows int((maxy - miny) / cell_size) 1 grid_polys [] for i in range(rows): for j in range(cols): x0 minx j * cell_size y0 miny i * cell_size x1 x0 cell_size y1 y0 cell_size grid_polys.append({ row: i, col: j, geometry: box(x0, y0, x1, y1) }) grid gpd.GeoDataFrame(grid_polys, crsgdf.crs) # 空间连接每个网格关联到的灾害点数量 joined gpd.sjoin(gdf, grid, howright, predicatewithin) cnt joined.groupby(joined.index).size().reset_index(namecnt) grid grid.merge(cnt, left_indexTrue, right_indexTrue, howleft) grid[cnt] grid[cnt].fillna(0)这是一个完整的渔网点密度统计过程输出的是带cnt字段的面shp。逻辑需要注意sjoin的predicate我用的是within确保一个点只归属一个网格如果用默认的intersects边界点可能被重复计算。此方法在数据量不大时完全够用全国级别几十万的点用这种方式也不会太慢如果到百万级建议改用PostGIS的ST_Contains空间连接。4.3 图层叠加与可视化行政区统计和出图标注的实操细节灾害点数据最终要落到报告上通常要出一张分区统计图把各行政区范围内的灾害点数量、主要灾种、威胁等级标注清楚。技术上不复杂但经验上有三个细节值得注意。一是叠加时要注意坐标系一致行政区边界如果用的是省界线shp要确认它与灾害点shp的基准一致。不同来源的省界线shp在局部地段会有差异比如全国1100万分省和125万分省界在边界细节上差别很大叠加后会产生误判。建议统一使用一套底图不要混搭。二是标注字段的选择图上标注一般放「数量」而不是「灾种代码」因为代码对决策者不友好但数据表里必须保留灾种字段。三是在color ramp选择上用从浅到深的单色渐变比多色更符合出图审美地灾专题图建议用黄色到红色渐变对应低密度到高密度。关于热词里提到的「省界线文件省1和省2的shp文件有什么区别」本质上是不同比例尺或不同标准下的行政区划在边界细节尺度上的差异省1和省2通常代表两套分类编码方案。用于统计灾害点分布和用于绘制地图底图选择的方案完全不同。用于统计原则上是越详细越好用于宏观出图过于精细的边界反而会让图面杂乱。5. 避坑shp在地灾应用中的六个常见故障与修复办法5.1 属性表中文乱码字段名变成「口口口」现象用ArcGIS或QGIS打开shp文件字段名或属性值全部显示为乱码常见于Windows中文版环境。原因shp的.dbf文件没有显式记录编码老数据多半是GBK或GB2312而新版GIS软件默认按UTF-8读取两边对不上就是乱码。这个跟数据本身没关系是读取环境的默认参数问题。解决第一步先用ogrinfo加-locale或--config SHAPE_ENCODING gbk测试读取是否正常确认编码后推荐用GDAL转成UTF-8版本避免后续其他工具再踩一次雷。命令如下ogr2ogr -lco ENCODINGUTF-8 D:\geo_data\地灾点_utf8.shp D:\geo_data\地质灾害点.shp -nln 地灾点转换后重新打开属性表确认文字正常后再进行后续分析基本一次解决。5.2 坐标漂移两份数据叠加后点位整体偏移几十米现象把地灾点shp和遥感底图或勘察点位叠加明显看出同一位置的点整体错开有的偏北、有的偏东系统性偏移。原因两种数据的坐标基准不一致一个可能是WGS84另一个是CGCS2000两者在多数地区平面差在几十厘米到几米之间如果是西安80数据常规区域偏移可达几十米到上百米。符号化看不出问题但做精确避让分析就露馅。解决先分别查看两个图层坐标系。接着用ogr2ogr做基准转换代码是把WGS84转成CGCS2000ogr2ogr -t_srs EPSG:4499 D:\geo_data\地灾点_cgcs2000.shp D:\geo_data\地灾点.shpEPSG:4499是CGCS2000地理坐标系。如果是省级平面坐标应用再转一次投影。这里要强调的是没有七参数的纯基准转换会有误差项目级应用若精度要求高应当向数据提供方索要转换参数或者用公共点做七参数解算不能图省事直接转。5.3 shp文件损坏ArcGIS无法读取或只显示部分要素现象打开shp时提示「无法打开要素类」或只能读出部分要素关闭软件再打开又正常反复不定。原因shp至少由.shp、.shx、.dbf三个文件组成.shx索引文件头或条目损坏GIS就要重建索引如果.shp主文件的几何记录体有坏块也会导致中途读取失败。常见于网盘传输或U盘拷贝中断。解决优先用shapechk这类shp修复工具处理。shapechk是针对shp文件做完整性检查与修复的老牌工具界面简单选择损坏的.shp文件后它会自动扫描几何记录并重建索引输出修复后的文件。没有可视化工具时也可以用GDAL的ogrinfo -so做一次完整读取检查再用ogr2ogr重写一份GDAL的重写过程本身就能剔除部分坏记录。5.4 属性字段类型错乱数值字段里有文本现象做统计时威胁财产字段求和报错或者排序结果混乱十万和九万的顺序颠倒。原因建库时该字段被定义为文本型内部的数值串没有类型约束另一种情况是少数记录确实存了「暂无」「未统计」等文字混进数字列里。解决先跑一遍value_counts()找出非数字记录统一替换为null然后用pandas的to_numeric把列强转成数字类型再重新导出shp。数值字段在shp里是强类型的修复一次后永久干净import geopandas as gpd import pandas as pd gdf gpd.read_file(rD:\geo_data\地质灾害点.shp, encodingutf-8) # 找出无法转成数字的值存为NaN gdf[威胁财产_clean] pd.to_numeric(gdf[威胁财产], errorscoerce) gdf.drop(columns[威胁财产], inplaceTrue) gdf.rename(columns{威胁财产_clean: 威胁财产}, inplaceTrue) gdf.to_file(rD:\geo_data\地灾点_字段修复.shp, encodingutf-8)这里errorscoerce是关键参数它让非法值直接变成NaN而不是中断报错输出后原字段被替换为干净数值后续统计不会再出岔子。5.5 数据重叠与重复点统计数量虚高现象同一个灾害点出现两次位置完全一致属性只有细微差别或者两条记录坐标略有不同但距离仅相隔几米实际是同一位置的重采样。原因多批次数据合并时没有做去重野外采集时同一位置多人采集且坐标获取精度不同外加内业建库时重复录入。解决先用空间去重按坐标距离阈值查重。常见做法是全图计算点间最小距离阈值按项目精度定一般取1米到5米。实现上可以用geopandas的snap和drop_duplicates组合但更稳的做法是转成shapely后用空间索引做邻近去重这里给出一个简单的版本import geopandas as gpd gdf gpd.read_file(rD:\geo_data\地质灾害点.shp, encodingutf-8) # 以坐标为唯一键去重容差1米投影坐标下 gdf[key] ( gdf.geometry.x.round(0).astype(int).astype(str) _ gdf.geometry.y.round(0).astype(str) ) dedup gdf.drop_duplicates(subset[key]).drop(columns[key]) print(f去重前: {len(gdf)}, 去重后: {len(dedup)})用round(0)把坐标取整到单位米与字段拼接成去重键。这个方式简单但会误删相距半米的两个不同灾种点所以去重前务必看看被删记录是否同灾种、同威胁对象二者都一致才能放心删。5.6 数据边界异常点位分布在流域或行政范围之外现象局部点位落到水域中央、行政区边界外或明显远离所在山谷看过之后觉得数据可疑。具体表现为点位与数字高程模型叠加时落在陡崖下方水面里。原因一部分是原始坐标转换错误比如度分秒格式直接按十进制度解析另一部分是用GPS采集时卫星信号差、记录漂移。解决对于纬度和经度反位、度分秒解析错位的情况可以用在线小工具批量换算修正对于漂移点没有一套万能修正法只能参考相邻点位置和地形特征做人工迁移数量少时手工改坐标数量多时需要结合影像和数字高程模型做规则校验。这步工作量大但避不开因为它直接影响后续分析的可信度。6. 进阶用坐标抽检和属性回查验证数据可用性顺手备好多格式副本数据能用的底线标准是任何一次误判都要有据可查。我给自己定了一套固定检验流程每次拿到地灾点shp数据后走一遍这个流程也推荐给团队新人使用。第一步抽检坐标定位。随机抽取30到50个点按点的经纬度落到影像底图上人工判断是否在地形合理位置。影像尽量用近期亚米级或两米级影像如果是山区还需要叠加等高线看点位是否在斜坡、沟口、陡崖等典型位置。抽检比例不必高但必须分层七类灾种每类至少抽5个这样远比只看总量有代表性。第二步属性回查。核对点位的灾种字段与名称字段是否匹配再核对威胁对象与灾害表现是否自洽——一个点如果灾种是泥石流威胁对象却是高层建筑就要回到影像上确认一下是沟口还是坡面必要时标为待核。回查结果记录成excel清单包含原始坐标、影像坐标、判定结论最终存档。这套抽检记录在项目验收时是很好的支撑材料也是发现问题后和提供方沟通的依据。第三步导出多格式副本。运行环境里不同协作方用的工具不一样规划院可能用ArcGIS前端组要geojson接接口外业App更偏向kml。一次性用ogr2ogr批量产出比每回现转要省心# 导出GeoJSON供web系统调用 ogr2ogr -f GeoJSON D:\geo_data\地灾点.geojson D:\geo_data\地灾点_修复.shp # 导出KML供外业采集App和Google Earth参考 ogr2ogr -f KML D:\geo_data\地灾点.kml D:\geo_data\地灾点_修复.shp # 导出MapInfo Tab格式供老项目衔接 ogr2ogr -f MapInfo Tab D:\geo_data\地灾点.tab D:\geo_data\地灾点_修复.shp这三个命令覆盖了与外部协作的高频场景。有一个细节值得指出导出kml时默认会把所有字段挂在要素描述里但kml对中文支持良好无需额外转换geojson导出后建议用文本编辑器确认一下中文编码是utf-8否则接口端可能出现乱码。这里不用花太多时间但转完顺手检查是极好的习惯省得下游在集成时跟你来回扯皮。最后一步符号化模板保存。在地灾专题图里我习惯用不同形状区分灾种圆形、三角形、方块搭配天然适合做分类表达颜色仍用黄到红渐近表示密度等级。符号化结果存成.lyrx叠加上行政边界和河流道路就是一张可以直接入报告的底图。这块模板建议做成项目启动的标准件下次拿到新数据集直接套用省去一遍遍调符号的时间。我自己的工位常备着一份标准化的流程清单从字段探查、坐标检查到修复再导出全流程走下来通常不超过半天。这套动作下来数据是否可信心里基本有数交付出去也不再提心吊胆。希望帮到你。本文还有配套的精品资源点击获取