FEATURED · 精选文章

全国省级土壤类型空间分布数据实战:shp/dbf分类编码、面积统计与制图

发布时间 / 2026/9/10 5:41:18
来源 / 创域科博编辑部
栏目 / 资讯中心
全国省级土壤类型空间分布数据实战:shp/dbf分类编码、面积统计与制图 简介中国57大类148小类土壤类型空间分布数据整合了全国及31个省级行政区的土壤分类成果覆盖土类、亚类、土属、土种等制图单元并对照FAO体系适用于国土规划、农业区划、环境研究和地理教学等场景也可供需要精细化土壤制图的GIS从业者直接使用。压缩包共168个文件体积约174.2MB包括32组标准shapefile文件、GeoJSON、可编辑的mxd工程文件、标准成图TIF图片、土壤分类编码表Excel和样式参考JPG支持在ArcGIS或QGIS中直接加载、查询和出图。已有188人学习使用。属性表中的SOIL_ID与编码表亚类一一对应方便快速匹配与符号化mxd文件已对全国土壤分类完成绘制各省份shp文件可自行按需绘制配合样式修改示意图可自由调整配色方案。1. 为什么需要一份可编辑的全国省级土壤类型空间分布数据做土地利用规划或环境评估时最耗时的往往不是分析而是数据整理。土壤类型空间分布数据不同于普通POI或遥感影像它既有空间几何、又有分类层级还涉及与FAO分类体系的对照。这份资源覆盖全国57大类、148小类同时提供全国和31个省市自治区的shape文件mxd工程文件可直接编辑TIF成图能直接用于报告插图。要说明的是mxd只绘制了全国范围土壤分类各省份的shp需要自行加载绘制配套的样式修改示意图正是为此准备。对GIS从业者来说省去的是从零整理分类编码和边界拓扑的时间拿到手可以直接进入分析环节。2. 土壤分类编码体系SOIL_ID、亚类与FAO对照表的映射逻辑2.1 制图单元与分类层级的关系这份数据采用土类、亚类、土属、土种作为制图单元。在土壤地理学中土类是最高级别的分类单元亚类是土类的进一步细分。全国57大类对应到148小类意味着平均每个土类下约有2.6个亚类。但实际分布并不均匀比如红壤、褐土这类分布广泛的土类亚类数量会明显多于高山土类。属性表中的SOIL_ID字段与分类编码表的“亚类”一一对应。这个设计值得注意SOIL_ID不是随便编的编号它直接指向分类编码表中的某一行。实际操作中资源附带的“土壤分类体系”excel里包含完整的编码表使用时要先做一次关联。在QGIS中可以用“Join attributes by field value”把编码表关联到shp属性表上关联字段就是SOIL_ID。在ArcGIS中则是右键图层选择Joins and Relates。关联之后图斑才能从一串数字编码变成可读的土壤名称这一步不做后面任何图例和报表都没法生成。这里有一个容易踩的坑编码表里可能存在同一亚类对应多个土属的情况。也就是说SOIL_ID在shp属性表中是唯一的但编码表拆到土属级别后一个SOIL_ID可能对应多行。做关联时如果选择的是土属字段会出现一对多关联导致要素重复。所以日常分析建议关联到“亚类”字段为止不要轻易下钻到土属土种除非你确认这份数据的制图精度支持到那个级别。2.2 dbf文件结构解析shp文件中空间几何存在.shp里属性信息存在.dbf里。一个常见的操作误区是直接用Excel打开dbf文件这样会丢失字段格式尤其数值型字段转成文本后后续面积计算会出错。建议优先用GDAL自带的ogrinfo命令行查看。ogrinfo -so -al 土壤类型空间分布_全国.shp输出会列出图层名、几何类型、要素数量以及所有字段的定义。执行后至少应该看到SOIL_ID字段类型为Integer或String、几何类型为Polygon、要素数量与图斑数量一致。-so参数表示只输出摘要信息不遍历每个要素。去掉它也可以逐条查看记录但数据量大时输出会刷屏。ogrinfo是GDAL自带工具安装过QGIS或ArcGIS Pro的环境里一般都有。如果环境里没有GDAL也可以直接用Python读取dbf部分。geopandas的read_file方法会自动加载shp的几何和dbf的属性一步到位。import geopandas as gpd gdf gpd.read_file(土壤类型空间分布_全国.shp) print(gdf.columns.tolist()) print(gdf.crs) print(gdf[SOIL_ID].nunique())代码逻辑是读取shp并输出字段列表、坐标系信息再统计SOIL_ID去重数量。如果nunique的结果是148说明亚类级别的图斑分类完整。crs检查很关键如果坐标系是WGS84经纬度计算面积前必须投影到合适的等积投影否则面积数值没有意义。另外dbf的字符编码也可能有问题。老版本ArcGIS导出的dbf常用GBK编码geopandas默认按utf-8读会乱码这时需要传encoding参数指定encodinggbk。2.3 分类编码表的字段约定与用法编码表一般包含土类名称、亚类名称、土壤代码等多个字段。不同字段的粒度不同使用时要先明确自己需要哪个层级的分类。比如做全国尺度的宏观分析土类级别就够用了不需要下钻到亚类但如果是省级项目图斑边界精度更高亚类会更合适。字段名示例值说明SOIL_ID1101关联键对应shp属性表土类红壤57大类之一亚类典型红壤148小类之一土属第四纪红土更低级别分类单元注意编码表里的名称写法可能与shp中的字段值略有差异比如全角半角空格、简繁体不一致。关联时先对SOIL_ID做散点图或频次统计确认两边取值范围一致。还有一种常见误用用“土类”字段做唯一值渲染但这个字段在shp中不一定存在因为shp属性表里只有SOIL_ID编码。这也是为什么资源里专门准备了编码表excel先join再符号化是标准流程。3. shape文件实操dbf属性表读取、筛选与面积统计3.1 全国与省级数据的目录组织资源里省级数据按省份命名比如土壤类型空间分布_新疆维吾尔自治区.dbf、土壤类型空间分布_西藏自治区.dbf。每个省份的shp都由同名的一组文件组成包括.shp、.dbf、.shx等。拿到手后先检查文件完整性缺了.shx或.dbfshp都无法直接加载。文件命名带完整省份名这对自动化批量处理很友好可以直接从文件名提取省份信息。省份shp之间的边界在接边处会出现轻微重叠或缝隙这属于正常现象因为各省独立数字化后没有做拓扑一致性处理。做全国汇总分析时优先用全国shp不要用省级shp拼接。反过来说如果项目确实需要分省出图用省级shp反而比从全国数据裁剪更省事因为省界的处理已经做好了。3.2 用Python批量读取省份数据并汇总批量处理时用glob匹配文件名最方便。省份名称是中文打印日志时注意控制台编码Windows下有时需要设置PYTHONIOENCODING环境变量否则print中文会报编码错误。import geopandas as gpd from pathlib import Path shp_files list(Path(.).glob(土壤类型空间分布_*.shp)) for f in shp_files: gdf gpd.read_file(f, encodingutf-8) soil_counts gdf[SOIL_ID].value_counts() print(f{f.stem}: {len(gdf)}个图斑, {len(soil_counts)}种亚类)这里encoding参数要根据dbf实际编码调整。如果省份名称出现乱码把encoding改为gbk再试。value_counts统计的是每个亚类的图斑个数注意是图斑数不是面积。图斑数多的亚类不一定面积大因为数据中可能存在大量破碎化的小图斑这种图斑在山地丘陵地区很常见。如果需要面积排序要在后面接投影和面积计算步骤。3.3 筛选特定土壤类型并计算面积计算面积是高频需求。经纬度坐标系下计算面积会得到错误结果必须先投影。gdf_proj gdf.to_crs(EPSG:32650) # WGS 84 / UTM zone 50N覆盖部分中国中部区域 gdf_proj[area_km2] gdf_proj.geometry.area / 1_000_000 result gdf_proj.groupby(SOIL_ID)[area_km2].sum().sort_values(ascendingFalse) print(result.head(10))投影参数不是固定的。全国范围建议用Albers等积投影中央经线取105°E两条标准纬线取25°N和47°N这是中国制图常用参数。UTM分带只适合小范围跨带区域会有变形。代码里除以1_000_000是把平方米转为平方公里。注意groupby分组依据是SOIL_ID如果你已经做了编码表关联也可以用亚类名称分组但名称可能重复不如编码稳定。3.4 按区域裁剪省级数据如果项目需要某个地级市的数据但资源里只有省级shp最稳妥的方式是用行政边界去裁剪。ogr2ogr -f ESRI Shapefile 裁剪结果.shp 土壤类型空间分布_四川省.shp -clipsrc 地级市边界.shp-clipsrc参数接受一个输入文件作为裁剪范围也可以用-clipsrc xmin ymin xmax ymax直接指定四至范围。裁剪操作不修改原始shp输出是新文件。如果省份shp和地级市边界shp的坐标系不一致先统一坐标系再做裁剪否则裁剪结果会偏移。这事我在项目里遇到过两次坐标系一个是WGS84一个是CGCS2000肉眼看不出来面积却差了接近1%。4. mxd工程与TIF成图的配合从ArcMap绘制到成果交付4.1 mxd文件的适用场景与限制mxd是ArcMap的工程文件记录图层的符号化方式、标注设置和页面布局。资源里的mxd只绘制了全国范围的土壤分类不包含各省份。原因在于ArcMap的mxd依赖绝对或相对路径指向shp文件省份数据的路径没有统一约定直接放进去容易断链。所以作者选择只保留全国图层省级数据让用户自行添加。用ArcMap打开mxd时如果提示图层来源无效需要重新指定shp路径。右键图层选择Data → Repair Data Source定位到全国shp文件即可。路径中尽量不要包含中文和空格mxd对路径的宽容度有限。另外mxd版本也有兼容性问题ArcGIS 10.x的mxd可以在ArcGIS Pro中通过导入功能打开但布局和符号可能稍有变化。如果你手里既没有ArcMap也没有ArcGIS Promxd文件基本用不了这时候直接加载shp到QGIS更实际。4.2 各省份shp自行绘制成图拿到省份shp后新建mxd加载shp然后按SOIL_ID字段做唯一值符号化。关键点是选择唯一且完整的字段不要选土类字段因为土类字段可能有空值。尽管shp属性表里通常只有SOIL_ID编码表join之后才会出现土类和亚类名称字段但join后的名称字段偶尔会有NULL值这时符号化会缺漏。在ArcMap中设置唯一值渲染的步骤右键图层 → Properties → Symbology → Categories → Unique valuesValue Field选择SOIL_ID点击Add All Values。如果图斑数量很大加到几百个值时界面可能卡顿。可以先只添加一个值然后用Add Values按SOIL_ID范围批量添加比如输入“1101;1102;1103”这样分号分隔的编码串。这个方法比一个个点快得多尤其对148个小类来说省下不少时间。4.3 TIF成图与CAD自动定位的关联TIF成图可以作为底图直接插入CAD在AutoCAD或中望CAD里通过影像附着或光栅图像参照命令插入。自动定位的关键在于TIF旁边要有一个tfw世界文件它记录了影像左上角坐标、像元尺寸和旋转参数。CAD读取tif时会自动寻找同名tfw借助它识别定位信息。验证tfw文件是否存在在TIF同目录下查看有没有.tfw后缀文件。如果没有但TIF是GeoTIFF格式可以用GDAL转换出来。这里的逻辑是先把GeoTIFF重写一遍确保写入完整的坐标参考信息再用listgeo导出tfw文件。gdal_translate -of GTiff 土壤类型分布TIF.tif 土壤类型分布_带坐标.tif listgeo -tfw 土壤类型分布_带坐标.tifgdal_translate将GeoTIFF中的地理参考信息重新整理listgeo是ESRI工具如果环境里没有可以用Python的rasterio读取transform并手动写入tfw。CAD里插入TIF后若发现位置偏移先检查tfw中的坐标系是否与CAD地图坐标系一致。比如tfw里存的是经纬度而CAD图纸是高斯投影平面坐标直接插入必然对不上。处理地形图、土壤图这类栅格成图时这是一致的逻辑。4.4 样式文件与配色修改资源包含显示样式修改示意图实际使用中配色方案往往需要按项目风格调整。ArcMap里修改单个颜色可以双击符号框选择但148个分类逐一点击不现实。效率更高的做法是导入lyr样式文件或者直接在Python里根据SOIL_ID的数值范围生成配色字典。QGIS用户会遇到mxd和lyr都不兼容的问题但可以在QGIS里用“Style Manager”按SOIL_ID的字符串前缀配置分组颜色。比如SOIL_ID前两位是土类编码那么以“11”开头的统一给同一色系这一步写一个规则表达式即可。这种按前缀分组的做法在制图时很实用比逐类手工配色可维护性强得多。5. 省级shp批量处理与配色定制的落地技巧5.1 用Python批量为省级shp统一坐标系不同省份的shp坐标系可能一致也可能不一致。批量统计前统一坐标系是必要操作。import geopandas as gpd from pathlib import Path albers projaea lat_125 lat_247 lat_00 lon_0105 datumWGS84 for f in Path(.).glob(土壤类型空间分布_*.shp): gdf gpd.read_file(f, encodinggbk) gdf_albers gdf.to_crs(albers) out_path f.parent / (f.stem _albers.shp) gdf_albers.to_file(out_path, encodingutf-8)to_crs接受proj4字符串这里定义的是Albers等积投影。输出文件命名加_albers后缀保留原始文件不被覆盖。to_file的encoding只影响dbf写入不影响几何精度。如果省份数量多跑一遍只要几分钟跑完后可以统一做面积统计和裁剪。5.2 快速验证数据完整性一个实用技巧用要素面积总和反推边界是否异常。全国陆地面积约960万平方公里如果统计结果偏差超过5%大概率是坐标系或拓扑有问题。注意这里的偏差主要来源于shp中包含争议区域或岛屿实际统计时可能略高于960万这算正常。另一种验证方式是检查每个省级shp的属性表是否有SOIL_ID为空的行空值会影响唯一值符号化的显示。用一个简单的布尔判断过滤空行。null_rows gdf[gdf[SOIL_ID].isnull()] print(len(null_rows))如果存在空行需要决定删除还是填充。删除会影响图斑数量填充则需要参考相邻图斑类型这属于数据清洗范畴。大多数应用场景下可以直接填充为“未分类”编码比如用9999占位这样图例上还能显示。5.3 配色方案的批量套用拿到样式文件后在ArcMap中右键图层 → Import symbology选择样式文件即可完成配色套用。QGIS用户可以用QML文件但资源里没有提供。推荐的替代方案是先用Python读一遍所有SOIL_ID生成一个颜色映射表然后按映射表逐类设置颜色。这样不会漏掉任何亚类。如果希望图例更简洁可以用土类做一级合并显示。比如红壤、黄壤同属铁铝土纲在渲染时用相近色系区别亚类但图例只展开到土类。这种双层结构在ArcMap中可以通过“Group values”实现在QGIS里则用Rule-based渲染写多条规则。视觉效果比平铺148个图例清爽很多。5.4 将TIF用于其他GIS平台的注意事项TIF成图除了CAD和印刷出图在WebGIS中也能作为切片底图。如果要在Mapbox或Leaflet中叠加需要先将TIF从Albers投影转到Web Mercator投影。gdalwarp -t_srs EPSG:3857 -r near 土壤类型分布TIF.tif 土壤类型分布_web.tif重采样方法用near因为土壤类型是分类数据不是连续数值。如果用bilinear或cubic边界会插值出不存在的过渡值这是分类栅格处理中最容易踩的坑。输出后如果文件太大用gdal_translate转成PNG或JPEG配合gdal2tiles.py生成瓦片前端展示更流畅。检查重采样后TIF和原TIF的面积总量如果差异明显说明投影参数设置有问题回到坐标系定义去查。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻