简介这份资源提供中国首批5个国家公园的边界矢量图SHP图层面向地理信息系统从业者、生态保护研究者、高校师生及规划管理人员可用于自然保护区分析、制图与空间规划。压缩包共44个文件约1.73MB包含shp、shx、dbf、prj等核心矢量格式以及sbx、sbn空间索引、cpg编码说明和xml元数据文件覆盖大熊猫、东北虎豹、海南热带雨林、三江源、武夷山五个国家公园其中三江源还细分黄河源、长江源、澜沧江园区。这些图层可直接在ArcGIS、QGIS等软件中加载与卫星影像、地形图、人口数据叠加分析评估森林覆盖、人类活动影响或制作公众科普分布图。已有2169人学习下载适合需要国家公园边界基础数据的研究与教学场景。1. 边界数据拿到手之后这份 shp 图层到底能解决什么做生态评估、保护地规划或者自然地理制图的同行大概率都遇到过同一个尴尬想画一张五大国家公园的分布图翻遍手头资料要么只有文字描述的“四至范围”要么是分辨率低到没法用的截图再不然就是坐标系混乱、属性表残缺的二手数据。这份中国首批 5 个国家公园边界矢量图 shp 图层解决的正是这个“有分析需求、没干净底图”的缺口。它把三江源、大熊猫、东北虎豹、海南热带雨林、武夷山这五个国家公园的边界整理成了标准 GIS 能直接读取的 shapefile 格式适合做空间叠加、面积量算、缓冲区分析和专题制图。如果你正在做大熊猫国家公园栖息地连通性、三江源草地退化对比或者只是要给报告配一张像样的区位图这套数据能让你跳过最耗时的数据清洗环节直接进入分析阶段。2. 拆开 shp 图层坐标系、属性表与几何类型怎么核对拿到一个 shapefile最忌讳的就是双击打开、看着能显示就以为万事大吉。边界数据一旦坐标系搞错面积能差出几倍叠加分析更是全盘错位。这一章先把数据本身的“体检”做一遍再讲怎么把它用起来。2.1 五个国家公园的图层构成与字段含义shapefile 不是单个文件而是一组同名文件的集合。常见做法是至少保留.shp、.shx、.dbf、.prj四个少一个都可能出问题。.shp存几何.shx是索引.dbf是属性表.prj定义坐标系。这份数据按国家公园拆分每个公园一个独立图层属性表里通常包含公园名称、所属省份、边界类型等字段。字段名可能是英文缩写比如NAME、PROV、TYPE打开后先看.dbf的编码中文乱码多半是字符集没对上。文件后缀作用缺失后果.shp存储几何形状无法显示图形.shx几何索引部分软件报错或加载慢.dbf属性数据表丢失名称、省份等字段.prj坐标系定义坐标未知面积量算失效.cpg字符编码说明中文属性可能乱码核对字段时重点看有没有“面积”或“周长”这类预计算字段。如果有先别信自己用投影坐标系重算一遍因为原始字段可能是在地理坐标系下算的单位是度没有实际意义。2.2 坐标系判定与投影转换的实操命令这份数据大概率是地理坐标系GCS常见的是 WGS84 或 CGCS2000。判断方法很简单看.prj文件内容或者用 GDAL 的gdalsrsinfo命令直接读。如果要在 ArcGIS 或 QGIS 里做面积量算必须转到投影坐标系比如 Albers 等面积投影否则算出来的平方公里数是错的。# 查看 shp 文件的坐标系信息 gdalsrsinfo -o proj4 大熊猫国家公园.shp # 如果输出是 projlonglat说明是地理坐标系需要转换 # 用 ogr2ogr 转到 Albers 投影以中国常用参数为例 ogr2ogr -f ESRI Shapefile \ -t_srs projaea lat_125 lat_247 lat_00 lon_0105 x_00 y_00 datumWGS84 unitsm no_defs \ 大熊猫国家公园_albers.shp 大熊猫国家公园.shp第一行命令只读不写用来确认原始坐标系。第二段ogr2ogr是转换命令-t_srs后面跟目标投影的 proj4 字符串lat_1和lat_2是双标准纬线中国全国范围常用 25 和 47lon_0105是中央经线。转换后面积单位变成平方米再除以 10^6 就是平方公里。注意如果原始数据是 CGCS2000datum参数要相应调整不能直接套 WGS84否则会有米级偏移做小区域分析时这个误差不能忽略。2.3 用 Python 批量读取与面积量算如果五个图层要一起处理手动一个个转太慢。用geopandas写个循环批量读、批量转、批量算面积顺便把结果导出成 CSV方便后续做表格。import geopandas as gpd import os # 设定工作目录和输出投影 work_dir ./national_parks target_crs projaea lat_125 lat_247 lat_00 lon_0105 x_00 y_00 datumWGS84 unitsm no_defs results [] for fname in os.listdir(work_dir): if fname.endswith(.shp): path os.path.join(work_dir, fname) gdf gpd.read_file(path) # 记录原始坐标系 orig_crs gdf.crs # 转到等面积投影 gdf_proj gdf.to_crs(target_crs) # 计算总面积单位平方公里 area_km2 gdf_proj.geometry.area.sum() / 1e6 results.append({ file: fname, orig_crs: str(orig_crs), area_km2: round(area_km2, 2) }) # 输出汇总表 import pandas as pd df pd.DataFrame(results) print(df) df.to_csv(park_areas.csv, indexFalse)这段代码的关键点有三个gpd.read_file自动读取.prj里的坐标系to_crs做投影转换geometry.area在投影坐标系下才返回平方米。如果跳过to_crs直接算面积得到的是平方度数值毫无参考价值。跑完之后对照官方公布的国家公园面积如果偏差超过 5%就要检查原始边界是否简化过或者投影参数是否适合该区域。三江源跨度大用全国统一的 Albers 参数没问题但海南热带雨林面积小中央经线可以调到 111 附近精度会更高。3. 把边界数据用起来叠加分析、出图与格式转换数据核对无误之后真正的活才刚开始。这一章讲三个最常用的落地场景和土地利用数据叠加算保护地内各地类面积、做缓冲区看周边人类活动影响、导出成 GeoJSON 给前端或轻量工具用。3.1 与土地利用栅格叠加统计各地类占比常见做法是拿一份 30 米分辨率的土地利用栅格按国家公园边界裁剪再统计各地类像元数。用rasterio加geopandas可以完成核心是先把矢量边界转成栅格掩膜。import rasterio from rasterio.mask import mask import geopandas as gpd import numpy as np # 读取边界和栅格 boundary gpd.read_file(大熊猫国家公园_albers.shp) landuse rasterio.open(landuse_2020.tif) # 确保坐标系一致不一致先转 if boundary.crs ! landuse.crs: boundary boundary.to_crs(landuse.crs) # 用边界裁剪栅格 geoms [geom for geom in boundary.geometry] out_image, out_transform mask(landuse, geoms, cropTrue) out_meta landuse.meta.copy() out_meta.update({ height: out_image.shape[1], width: out_image.shape[2], transform: out_transform }) # 统计各地类像元数 unique, counts np.unique(out_image, return_countsTrue) for val, cnt in zip(unique, counts): if val ! landuse.nodata: print(f地类编码 {val}: {cnt} 像元)mask函数负责按几何裁剪cropTrue表示收紧输出范围。out_image是裁剪后的数组np.unique统计每个地类编码出现的次数。注意landuse.nodata要排除掉否则会把边界外的空值也算进去。如果边界跨了多个栅格文件得先做镶嵌再裁剪不然会漏掉边缘区域。3.2 缓冲区分析与人类活动影响范围提取做保护地评估时经常要看边界外 5 公里或 10 公里范围内有多少建设用地、道路。缓冲区分析就是干这个的。在geopandas里一行代码就能生成缓冲区但要注意投影坐标系下单位才是米。# 生成 5 公里缓冲区 boundary_proj boundary.to_crs(target_crs) buffer_5km boundary_proj.copy() buffer_5km[geometry] boundary_proj.geometry.buffer(5000) # 缓冲区面积减去原面积得到环带面积 ring_area (buffer_5km.geometry.area.sum() - boundary_proj.geometry.area.sum()) / 1e6 print(f5公里缓冲环带面积: {ring_area:.2f} 平方公里) # 导出缓冲区 buffer_5km.to_file(大熊猫_5km_buffer.shp, encodingutf-8)buffer(5000)里的 5000 是缓冲距离单位是米因为前面已经转到了投影坐标系。如果在地理坐标系下直接 buffer参数单位是度结果完全不对。导出时加encodingutf-8避免中文属性乱码。缓冲区生成后可以再和道路、居民点数据做空间连接统计范围内的要素数量。3.3 导出 GeoJSON 与 KML 的注意事项给前端做展示或者导入 Google Earth 看效果时需要把 shp 转成 GeoJSON 或 KML。转换本身不难但有几个坑GeoJSON 默认用 WGS84 地理坐标系如果原始数据是投影坐标系必须先转回去KML 对中文属性支持一般字段名最好用英文。# shp 转 GeoJSON指定 WGS84 ogr2ogr -f GeoJSON -t_srs EPSG:4326 \ 大熊猫国家公园.geojson 大熊猫国家公园_albers.shp # shp 转 KML ogr2ogr -f KML 大熊猫国家公园.kml 大熊猫国家公园.shp-t_srs EPSG:4326确保输出是 WGS84 经纬度这是 GeoJSON 的默认约定。KML 转换时如果属性表有中文建议先用-lco ENCODINGUTF-8指定编码。另外GeoJSON 文件会比 shp 大不少因为文本格式冗余如果只是网页展示可以先做几何简化用-simplify参数降低节点数。4. 避坑与排查边界数据最容易翻车的五个地方这一章全是血泪经验。边界数据看着简单但坐标系、拓扑、属性、版本、叠加这五关每一关都能让人卡半天。下面按“现象 → 原因 → 解决”逐条说。4.1 面积算出来差好几倍现象在 QGIS 里量算面积和官方公布的数据对不上有时差两三倍。原因图层是地理坐标系单位是度QGIS 默认按椭球算的面积单位是平方度不是平方公里。或者投影参数选错了比如把海南的数据用了适合东北的中央经线。解决先看.prj确认坐标系再用to_crs转到合适的等面积投影。全国范围用 Alberslat_125、lat_247、lon_0105局部区域把lon_0调到该区域中心经线。转完再算面积单位是平方米除以 10^6 得平方公里。4.2 叠加分析时提示几何无效现象做相交或裁剪时软件报“invalid geometry”或直接崩溃。原因边界数据在数字化时可能有自相交、重复节点或悬挂边拓扑不干净。shapefile 本身不强制拓扑检查问题会一直潜伏到叠加时才暴露。解决用geopandas的buffer(0)做一次零宽缓冲能修复大部分自相交。或者用shapely的make_valid方法。修复后再做叠加如果还有问题用explain_validity定位具体是哪个要素。from shapely.validation import make_valid gdf[geometry] gdf.geometry.apply(make_valid)4.3 中文属性变成乱码现象打开属性表公园名称显示成“???”或一串问号。原因.dbf文件的字符编码和软件读取时用的编码不一致。老版本 ArcGIS 默认用 GBKQGIS 和 GDAL 默认用 UTF-8。解决在数据目录下新建一个.cpg文件内容写UTF-8或GBK告诉软件用哪个编码读。或者用ogr2ogr转换时加-lco ENCODINGUTF-8重新导出属性表。4.4 五个图层边界对不上底图现象把边界叠加到在线底图上发现整体偏移了几百米。原因原始数据可能是 CGCS2000 坐标系而在线底图如天地图、影像底图用的是 WGS84 或 Web Mercator。CGCS2000 和 WGS84 在多数区域差异很小但在某些地区能到米级放大后肉眼可见。解决确认原始坐标系到底是哪个。如果是 CGCS2000转换时datum参数要用CGCS2000不能直接套 WGS84。在 QGIS 里可以用“重新投影图层”工具目标 CRS 选 EPSG:4326 或 EPSG:3857具体看底图要求。4.5 属性表字段丢失或错位现象转换格式后属性表里的字段名变了或者数据串到别的列。原因shapefile 的.dbf字段名有 10 个字符限制超长会被截断。不同软件对截断规则处理不一样导致字段错位。解决转换前先把字段名改成 10 字符以内的英文缩写比如PARK_NAME改成NAMEPROVINCE改成PROV。如果必须保留长字段名转成 GeoPackage 或 File Geodatabase这两种格式没有字段名长度限制。5. 进阶技巧用边界数据做多公园对比与自动化出图数据用顺了之后自然会想批量出图、做对比分析。这一章给一个可复用的出图脚本再讲一个容易被忽略的细节边界数据的版本管理。5.1 批量出图脚本与样式统一五个公园如果一张张调样式费时且不统一。用matplotlib加geopandas可以批量出图统一配色和标注。import matplotlib.pyplot as plt import geopandas as gpd import os plt.rcParams[font.sans-serif] [SimHei] # 中文字体 plt.rcParams[axes.unicode_minus] False work_dir ./national_parks out_dir ./maps os.makedirs(out_dir, exist_okTrue) for fname in os.listdir(work_dir): if fname.endswith(.shp): gdf gpd.read_file(os.path.join(work_dir, fname)) fig, ax plt.subplots(figsize(8, 8)) gdf.plot(axax, facecolor#a8d5a2, edgecolor#2d6a4f, linewidth1.2) ax.set_title(fname.replace(.shp, ), fontsize14) ax.set_axis_off() out_path os.path.join(out_dir, fname.replace(.shp, .png)) plt.savefig(out_path, dpi300, bbox_inchestight) plt.close()facecolor和edgecolor控制填充色和边框色set_axis_off去掉坐标轴出图更干净。dpi300保证印刷精度。如果要在图上加比例尺或指北针得额外用matplotlib的绘图元素手动加或者转到 QGIS 里用布局管理器做。5.2 边界数据的版本管理与更新习惯边界数据不是一成不变的国家公园范围可能调整坐标系标准也可能更新。我一般会做三件事第一原始数据只读单独放一个raw目录永不修改第二每次转换或修复后的数据放processed目录文件名带日期比如大熊猫_20250101.shp第三用 Git 管理属性表和元数据但 shp 二进制文件不适合直接进 Git可以只提交.prj和.dbf的 CSV 导出配合一个 README 记录数据来源和转换参数。从那以后我每次拿到新的边界数据都强制走一遍“看 prj → 转投影 → 修几何 → 算面积 → 对官方数据”的流程不再凭感觉直接叠加。这套习惯帮我省掉了至少三次返工。希望帮到你。本文还有配套的精品资源点击获取