ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

自然保护区空间数据实战:从Shapefile到面积统计与可视化

自然保护区空间数据实战:从Shapefile到面积统计与可视化 简介本资源为2021年中国自然保护区空间与属性一体化数据集面向生态环境研究者、GIS分析人员、政策制定者及高校地理/生态专业师生用于支撑保护区分布格局分析、保护成效评估与空间规划决策。压缩包共7个文件含shp矢量图层含shx、prj、dbf、xml配套文件支持GIS可视化与空间分析xlsx表格提供结构化属性信息名称、级别、面积、主要保护对象等便于统计与交叉验证整体体积仅6.04MB轻量易用。已有8119人学习下载体现其在科研与实务中的广泛认可度。用户可直接加载shp至ArcGIS/QGIS开展空间叠加、缓冲区分析或制图结合xlsx完成分级统计、保护对象聚类及区域对比研究数据字段完整、坐标系规范WGS84开箱即用显著降低基础数据获取与预处理成本。 最近在整理生态空间分析相关的项目素材翻到一个旧压缩包《2021年中国自然保护区数据.zip》顺手把它重新处理了一遍。这包数据其实挺典型的看起来就是一个普通的Shapefile压缩包但真正用起来坐标系、字段口径、面积统计、可视化这些环节每一步都能踩出点东西来。这篇就当作一次完整的数据复盘从解压开始到统计分析、出图、避坑把一套可复用的流程写出来。在开始之前先说明一下这包数据是什么。它主要包含中国范围内各类自然保护区的空间位置、名称、类型、级别和面积等信息适用于生态保护研究、空间规划、环境影响评价、自然地理教学等场景。适合的人群包括GIS初学者、生态学研究生、环境咨询从业者以及那些想用公开数据做空间分析但不想从底层开始砌数据的开发者。如果你手里也有一份类似命名的保护区数据或者准备做全国尺度的生态空间分析这篇应该能帮你省不少时间。1. 拿到压缩包后的“第一眼”检查1.1 解压后先别急着拖进GIS先看清文件家族我拿到的是一个zip压缩包大小大概几十MB到几百MB不等具体看精度和属性表内容。解压之后通常能看到不止一个文件而是同一名字的一组文件例如China_Nature_Reserve_2021.shpChina_Nature_Reserve_2021.dbfChina_Nature_Reserve_2021.shxChina_Nature_Reserve_2021.prjChina_Nature_Reserve_2021.cpgChina_Nature_Reserve_2021.sbn / sbx / qix可选很多人只把.shp拖进软件结果发现图层显示不出来或者属性表是空的原因就是这些配套文件没放齐全。Shapefile不是一个单一文件而是一组文件的集合。.shp存几何坐标.dbf存属性字段.shx是几何位置索引.prj是坐标系描述.cpg负责告诉软件属性字段用什么字符编码。如果.prj缺失软件会默认用一个未知坐标系面积、距离计算全部可能出现偏差如果.cpg缺失属性表里的中文大概率乱码。所以拿到数据的第一件事不是打开地图而是检查这组文件是否完整。如果缺少.prj可以通过属性表里的经纬度范围推测坐标系但这个方法误差很大最稳妥的是找数据来源重新下载。如果缺少.cpg打开属性表乱码时可以手动指定编码常见的中文编码是 UTF-8 和 GBK后面我会详细说操作。1.2 属性字段怎么读名称、类型、级别和面积口径把这包数据加载进QGIS或ArcGIS之后属性表通常是这样的字段结构NAME保护区名称比如“某某国家级自然保护区”TYPE保护区类型比如森林生态、湿地、荒漠、野生动物等LEVEL级别常见的是国家级、省级、县级等AREA面积字段有的单位是公顷有的是平方千米也有的是亩这里必须看元数据说明ESTABLISH_YEAR建立年份有的数据有有的没有LOCATION所在省份或行政区这里最需要注意的是“面积口径”。生产者在使用的时候可能是直接用经纬度坐标在WGS84椭球面上算的也可能是先投影到平面再算的这会导致同一个保护区的面积数值千差万别。我在处理的过程中发现有些矢量面本身就存在边界重叠或缝隙如果直接把面积字段拿来求和结果会和重新计算面积的结果差出好几个百分点。这背后不是数据造假而是统计口径和几何精度不同。所以一个基本判断是如果你只是想做一个示意图属性表里的面积字段够用但如果是要出统计年报、写分析报告最好还是自己用投影坐标重新算一次面积。后面我会给出计算方法。另外我注意到这份数据里“自然保护区”和“自然保护地”是两个概念。自然保护地是更大的伞包括自然保护区、自然公园、风景名胜区等。如果你下载的数据文件名是“自然保护区”那么里面大概率不会有自然公园。做分析之前先搞清楚数据范围别用“自然保护区”的数据去推“自然保护地”的结论这是新手最容易犯的一类口径错误。2. 工具准备与数据打开免费方案也能干重活2.1 为什么我推荐QGIS而不是直接上ArcGIS如果你只是偶尔处理一次空间数据QGIS完全够用而且是免费的不需要破解也不需要考虑授权问题。QGIS对Shapefile的支持很成熟加载速度快配色系统也比ArcGIS默认的民族风配色舒服一些。很多做生态分析的朋友一开始用ArcGIS后来切到QGIS主要理由是工作流更轻、插件生态丰富而且跨平台Windows和Mac都能跑。打开数据的步骤很简单打开QGIS在菜单栏选择“图层”→“添加图层”→“添加矢量图层”数据源类型选择“文件”点击“…”按钮找到刚才解压的.shp文件编码类型如果出现乱码手动选 UTF-8 或 GBK点击“添加”图层就会出现在地图画布上如果加载后属性表中文正常说明.cpg文件生效了。如果中文变成“锟斤拷”或者“涓夋鏉”就是编码识别失败右键图层→“属性”→数据源重新选择字符编码即可。2.2 用GeoPandas读取数据适合批量处理如果要做批量统计、多个图层叠加分析我习惯用Python的GeoPandas库。它的DataFrame结构对做过Pandas的人来说非常友好处理几千个面要素毫无压力。安装方式是常规的pip install geopandas不过建议用conda装因为GeoPandas依赖较多conda能自动解决底层库版本问题。读取数据的代码很简单import geopandas as gpd gdf gpd.read_file(China_Nature_Reserve_2021.shp, encodingutf-8) print(gdf.head()) print(gdf.crs)这里有一个细节encoding参数很重要。如果数据是GBK编码而你读取时用了默认的UTF-8属性字段里的中文就会乱码。如果你不确定编码可以先用文本编辑器打开.dbf文件的前几百个字节或者直接用Python尝试常见的几种编码直到输出正常为止。读取后先打印gdf.crs看坐标系信息。如果显示的是EPSG:4326说明是WGS84经纬度坐标如果是EPSG:4490就是CGCS2000经纬度坐标如果是EPSG:4547之类的数字那就是高斯-克吕格投影坐标。这决定了后面面积计算怎么处理。2.3 坐标系基础为什么不能直接在WGS84下算面积很多人拿到地理数据直接就用ArcGIS的“计算几何”算面积结果发现面积比真实值大了不少或者不同区域的面积失真程度不一样。原因很简单WGS84是经纬度坐标系它的单位是度不是米。把一个以度为单位的几何图形直接用来算面积软件必须强行把度“当作”米来处理或者在后台做了一次并不适合该区域的球面计算结果自然很不稳定。正确的思路是先把数据投影到一个合适的平面坐标系再计算面积。对于全国范围的保护区数据我推荐使用Albers等积投影Albers Conical Equal Area因为它能保证面积不因纬度变化而失真适合全国尺度的面积统计。如果你只是分析某一个省份的数据使用该省份的UTM投影带或者高斯-克吕格投影带更合适。投影转换在QGIS里可以用“矢量几何”→“投影”工具批量处理在GeoPandas里也很简单albers projaea lat_125 lat_247 lat_00 lon_0105 datumWGS84 unitsm no_defs gdf_albers gdf.to_crs(albers) gdf_albers[area_m2] gdf_albers.geometry.area这样算出来的area_m2就是平方米再除以10000就是公顷除以1000000就是平方千米。3. 数据分析实战从“有一堆面”到“能写进报告里”3.1 按保护区类型和级别做统计拿到属性表之后最常见的需求是统计不同类型、不同级别的保护区数量和面积。这个操作在GeoPandas里非常直接type_stats gdf_albers.groupby(TYPE).agg( count(NAME, count), total_area_ha(area_m2, lambda x: x.sum() / 10000) ).reset_index() print(type_stats)输出会显示每种类型有多少个保护区、总面积多大。比如森林生态类可能数量最多湿地类可能数量少但平均面积大荒漠类则单个保护区面积大但总数稀少。这类统计结果可以直接放进报告的表格里。这里有一个容易被忽视的细节count()统计的是要素数量不是保护区数量。如果一个保护区被拆分成多个不相邻的面要素比如有些河流型保护区包含多个江段那么实际保护区数量会小于面要素数量。如果要做精确的“数量”统计需要检查是否有NAME相同或ID相同的多个要素必要时按NAME去重后再数。我在实际处理中发现这份数据里确实存在同名多个要素的情况尤其是在以河流、湿地为保护对象的类型里。这是因为保护区的边界由多个不相邻的多边形构成Shapefile里一个要素只能记录一个外环所以拆成了多条记录。这种数据形态是合理的但如果忽略这一点直接数行数容易多算。3.2 计算各省份的保护区覆盖率覆盖率 保护区面积 / 省级行政区面积这个指标经常被用来评估区域生态保护水平。操作流程大概分三步第一步准备一份省级行政区划矢量边界数据。网上有很多公开的省界数据选择一个数据精度适中的即可不用太细重点是边界与这份保护区数据能大致吻合。第二步把省界数据加载进来同样投影到Albers等积投影坐标系。然后用空间连接把保护区要素归属到每个省provinces gpd.read_file(province.shp, encodingutf-8) provinces provinces.to_crs(albers) # 空间连接每个保护区面落在哪个省 joined gpd.sjoin(gdf_albers, provinces, howleft, predicateintersects)第三步按省分组求和得到每个省的保护区面积再除以该省总面积province_protected joined.groupby(NAME).apply( lambda x: x.geometry.area.sum(), include_groupsFalse ) province_total provinces.set_index(NAME).geometry.area coverage province_protected / province_total * 100有一点要注意如果一个保护区跨越多个省份sjoin可能会让它出现在多个省份的统计里导致面积被重复计算。这种跨省保护区在现实中不少见。稳妥的做法是先把保护区面按省界进行切分再分别计算各省内的面积或者根据保护区的主要所在省份进行归属。具体怎么选取决于你的分析目的。如果是评估“各省实际管辖范围内的保护地占比”那切分更合理如果是统计“每个省有多少保护区资源”那归类到主要省份也可以接受。3.3 功能分区分析核心区、缓冲区、实验区的空间含义许多保护区数据里还附带功能分区字段比如核心区、缓冲区和实验区。核心区原则上禁止人为活动缓冲区限制活动实验区可以进行科普教育和有限度的科研活动。如果你拿到的是2021年的数据大概率会看到这三个类别的面要素。在分析时我习惯把每个分区的面积占比列出来再结合土地利用数据看核心区里是否还有耕地或建设用地。具体操作用叠加分析即可把功能分区图层与土地利用图层做交集然后统计不同地类在各分区的面积。如果发现核心区内存在大面积的耕地或居民点不必急着下结论先确认两套数据的年份是否一致。保护区边界在历史上可能调整过土地利用数据也可能有错。把年份对应上再判断人地矛盾是否真实存在。3.4 空间热点哪些地方保护区扎堆全国保护区分布不是均匀的往往集中在西南山地、东北林区、青藏高原边缘等区域。简单做一次核密度分析就能直观看到分布热点。在QGIS里可以用“分析工具”→“核密度分析”来实现。加载保护区面的质心点半径根据你关注的尺度设定全国范围我用100公里或150公里比较合适省级范围30到50公里就行。输出栅格用渐变色渲染热点区域会非常明显。在Python里也可以实现核密度估计用scipy.stats.gaussian_kde或 PySAL 库但QGIS的交互体验更好适合快速出图。核密度分析的意义不只是视觉它会帮你发现那些“哪哪都有保护区”的区域以及“完全没有保护覆盖”的空白区。后者往往才是需要关注的地方。3.5 缓冲区分析评估人为活动对保护区的潜在影响保护区不是孤岛周边的基础设施建设、农业开垦都可能对保护对象产生影响。常用的一种分析方法是建立缓冲区看看缓冲区内的土地利用构成。比如我想评估道路对保护区的影响可以先用道路数据给保护区向外缓冲5公里然后叠加土地利用数据统计缓冲区内的不透水面比例buffer gdf_albers.to_crs(albers).geometry.buffer(5000)如果发现某个保护区缓冲区内的不透水面占比偏高那说明该保护区可能面临较强的人为干扰压力。这个指标可以和保护区的级别做相关性分析看看是不是国家级保护区的周边环境普遍比省级更好。实际操作中一定要先统一坐标系再做缓冲区分析否则缓冲距离会在不同纬度上出现不同程度的位置偏移。4. 可视化出图让分析结果“看起来专业”4.1 按保护类型分级设色在QGIS里右键图层→“属性”→符号化选择“分类”按TYPE字段设置颜色。颜色的选择上我建议用色相差异明显的配色方案来区分类型比如森林生态用绿色系湿地用蓝色系荒漠用橘黄色系野生动物用紫色系。不建议用单一色阶表示分类数据因为分类数据没有大小之分用连续渐变色会误导看图的人。图例名称可以改成中文或者保留英文原文取决于报告读者。如果只是自己分析怎么方便怎么来如果是要汇报最好把TYPE字段重新映射成明确的人类可读名称比如“forest”改成“森林生态型”。4.2 标注优化别让标签糊成一团保护区名称通常比较长尤其是一些“某某国家级自然保护区”十几个字很常见。直接开标注会糊成一团解决办法有几个标注表达式里加上换行符比如每隔六个字符换行字号调小最小8号字左右开启“避让”选项重叠时自动隐藏部分标签用“标注→点位移”或者“聚合适配”来错开空间位置如果你只是要一张示意小图其实可以不标名称只标类型。把名称放到一个单独的图层里设置“仅当缩放级别大于1:100万时显示”这样既保留信息又不显得乱。4.3 布局出图输出前的“最后一公里”出图之前需要开一个打印布局。QGIS左下角切换到“打印布局”然后插入地图框选一个区域把地图画布放进来插入图例勾选需要显示的图层插入比例尺设置合适的长度比如500公里插入指北针图上一般放在右上角或右下角插入文本标注数据来源和坐标系说明这个过程很多人会忽略一个细节图例里的图层名可能还是文件名导出的图看起来像“China_Nature_Reserve_2021”不专业。在打印布局里图例项可以双击修改标题改成“自然保护区分布”就可以了。另外如果你的分析里做了面积计算图上又没有标注坐标投影信息那报告阅读者很难判断面积数值是否可信。建议在图的角落里加一行小字“面积统计基于Albers等积投影坐标系WGS84”。5. 常见问题与排查技巧实录5.1 中文乱码问题这是使用国内来源的矢量数据时最常见的坑。症状是属性表里出现乱码最常见的是“涓夋鏉”或“鐪佺骇”这类典型的UTF-8被GBK解码的样子。解决办法如下QGIS右键图层→属性→数据源→图层编码改成“UTF-8”或“GBK”看哪个能正常显示GeoPandasread_file(..., encodinggbk)或encodingutf-8ArcGIS在ArcToolbox里添加“定义投影”或者“添加编码”工具手动指定编码经验之谈是如果数据是2020年以前发布的优先试GBK如果是2022年以后发布的优先试UTF-8。但这不是固定的最好还是看数据来源说明。5.2 面积计算结果异常偏大或偏小面积异常一般有三个原因坐标系是WGS84没有做投影转换导致软件用“度”来算面积结果严重失真坐标系正确但用了Web墨卡托投影EPSG:3857来算面积导致高纬度地区面积虚增低纬地区反而偏小。这个投影适合网络地图显示不适合做面积统计原始面本身存在自相交或重复顶点导致计算时面积被重复累加或部分抵消解决方案是先检查坐标系再统一转换到Albers等积投影最后用修复几何工具检查每个要素的几何有效性。QGIS的“矢量几何”→“修复几何”工具能自动修复大部分自相交问题。我用这份2021年的数据实测过在WGS84下直接用GeoPandas的area属性返回的是以“度”为单位的伪面积同一个保护区算出来的数值和Albers投影下相差几倍转成Albers之后结果和官方公布面积基本能对得上误差在合理范围内。5.3 属性字段名被截断Shapefile格式有个古老限制字段名不能超过10个字节所以中文或超长字段名可能会被截断成ESTABLISH_、PROTECTED_之类的残缺名称。这不是数据损坏而是格式本身的限制。解决办法可以在读取后用rename字段名或者在QGIS里新建一个字段并复制内容。如果数据转成GeoJSON或GeoPackage格式这个限制就不存在了。所以如果要做复杂分析我建议先把Shapefile转成GeoPackagegdf.to_file(reserve.gpkg, layerreserve, driverGPKG)GeoPackage是开放格式字段名可以长也支持空间索引和拓扑约束处理效率比Shapefile好很多。2021年这包数据虽然原始格式是Shapefile但转换后分析体验提升明显。5.4 图层加载后显示“无效几何”有些保护区面可能因为数字化精度不够存在自相交或者重复点导致加载后某些要素无法正确显示。排查方法是用“矢量菜单→检查几何”工具跑一遍。出现红色报错的要素可以用“修复几何”工具处理生成一个新图层再检查一遍属性表是否完整。如果修复后要素数量发生变化比如从1000个变成1000个但几何形状不同说明数据本身存在多重多边形和空洞。这种情况下需要根据实际需求决定是保留还是合并。做面积统计时我一般保留原始要素的数量只修复几何不做合并避免边界失真。5.5 空间叠加后出现大面积“NoData”空间连接时有些小面积要素由于没有与省份边界相交导致归属字段为空。原因是这些要素可能刚好位于行政边界的缝隙或者数据本身存在偏移。解决办法是先检查这些空要素的坐标看看它们在哪个位置如果坐标明显落在某个省边界上可能是边界数据不精确手工指定归属如果空要素数量极少可以直接在统计中剔除但在报告里说明剔除数量和处理方式5.6 前几版数据和2021年数据边界对不上如果你手头还有2015年或2018年的保护区数据进行对比分析时会发现不少保护区边界存在调整有的面积增加了有的减少了甚至有的被撤并。这不是数据错误而是保护区进行了优化整合这是生态保护工作中的常态。做时间对比时不要直接叠加看差异最好先按名称关联再用对称差工具提取变化区域最后人工核对变化是否合理。如果某个保护区的边界整个变了可能不是边界调整而是数据版本之间用了不同的处理标准这类情况一般需要在结果里单独说明。6. 这包数据还能怎么用扩展思路分享6.1 结合物种分布数据做“保护覆盖评估”一个很有价值的分析是把保护区数据与物种分布记录叠加看看有多少物种记录点落在保护区内。国内外的物种分布数据库里有大量公开的观测数据这些数据通常包含物种名称、经纬度、观察时间和数据来源以GBIF为例接口可以直接批量下载。操作思路是把物种点数据转换成GeoDataFrame用空间连接判断每个观测点是否落在保护区内然后统计有多少物种的观测点完全不在保护地内这一类“保护缺口”往往是最有研究价值的发现。不过要注意观测点是存在调查偏差的有些区域观测记录多只是因为去的人多不代表生物多样性高。所以这类分析只能反映“已知物种记录的保护覆盖情况”不能直接推导真实世界里的物种覆盖比例。做报告时需要在方法部分写明这个局限性。6.2 与人类足迹数据叠加做“保护地压力评估”人类足迹数据Human Footprint Index描述了道路、农田、夜间灯光、人口密度等多维人类活动强度。将保护区边界与人类足迹栅格叠加可以统计保护区内的人类干扰水平。具体做法是先对保护区和人类足迹栅格分别处理用zonal_statistics统计各保护区内的平均干扰值再按干扰值排序找出“名义上保护但实际压力很大”的区域。我在处理2021年数据时发现个别保护区内部的平均人类足迹值甚至高于周边区域这与保护区的管理现状往往密切相关。这类结果虽然比较中性但如果直接发布容易引发争议。我的建议是先别急着把完整排名发出来先做小范围方法验证再决定对外呈现形式。6.3 做保护区网络的空间连通性分析保护区的生态价值不只在于单个保护区的面积更在于它们之间是否有生态廊道连接。把全部保护区面文件提取质心用距离矩阵分析相邻保护区的空间分布可以计算保护区间最近邻距离判断哪些区域相邻过于稀疏。如果在相邻保护区之间做最小成本路径分析还需要准备阻力面数据比如土地利用类型选做阻力值建设用地阻力高耕地中等森林和水体低。这个分析比单纯的缓冲区分析复杂但结果非常有价值能够直接为生态廊道规划提供技术参考。不过全国尺度的廊道分析计算量很大建议先选一个区域做试点比如某一个大山系或流域而不是一次性跑全国。6.4 转成GeoJSON/PostGIS用于Web可视化如果你想把保护区数据发布成Web地图比如用Leaflet或MapLibre显示需要把Shapefile转换成GeoJSON或者PostGIS数据库。转换后需要注意一个问题如果原始数据是CGCS2000或高斯-克吕格投影Web地图通常要求WGS84经纬度坐标否则图形位置会偏移。用GeoPandas一条to_crs(epsg4326)就能解决。转成GeoJSON后文件可能会比较大建议用__geo_interface__结合json.dump压缩输出或者用tippecanoe生成矢量瓦片这样前端加载速度快很多。2021年的保护区数据在Web端展示时还可以把属性表中包含的类型和级别做成筛选条件允许用户按类型查看比静态图片有更强的交互感。如果你已经有数据服务后端PostGIS存储也是好选择查询效率远高于直接读Shapefile。6.5 与采样的“保护地管理成效”评估结合生态学界现在越来越关注保护地管理成效而不只是面积指标。管理成效评估常用方法之一是“管理有效性跟踪工具”METT它靠问卷打分来评估保护地管理和规划执行情况。空间数据可以补充后半段的客观指标比如用NDVI时间序列评估保护区植被变化趋势看植被是否好转或者用夜间灯光数据看人类活动是否变化。把保护区数据和管理成效评估结合可以制作“保护地档案卡”每个保护区一个页面左边是基本信息右边是空间统计指标比如覆盖率、平均NDVI变化斜率、夜间灯光趋势。这类综合评估报告比单纯的空间统计更加切合政策和管理需求对生态保护从业者来说非常有参考价值。当然如果只是自己练手也可以从某一个指标开始尝试不用一上来就做全指标体系。写在后面关于处理这类数据的一些体会我这次整理2021年保护区数据前后花了不少时间但最大的收获不是跑通了一条流程而是摸清了数据里那些“模棱两可”的地方同一个名字可能对应多个面要素面积字段可能和实测差一截投影坐标系不统一会导致统计结果失真不同年份的边界又可能整体偏移。做空间分析最怕的不是数据量大而是数据语义不清晰。希望这篇内容能帮你在面对类似的数据包时少走一些弯路把更多精力花在提出好问题而不是和文件格式做斗争上。本文还有配套的精品资源点击获取
返回列表