ARTICLE DETAIL

资讯详情

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

江苏土壤类型shapefile:坐标系、编码与面积统计实战指南

江苏土壤类型shapefile:坐标系、编码与面积统计实战指南 简介江苏土壤类型空间分布标准shape文件依据一比四百万中国土壤图编制采用三位数字编码区分土类与亚类面向地理信息、土壤调查及生态研究者可用于省级尺度土壤类型制图与分析。压缩包共有16个文件整体大小约1.03MB以shp、dbf、prj、shx等矢量核心文件为主辅以xlsx分类编码表、docx说明文档、jpg样式示例及省级行政区划边界数据结构完整、即下即用。目前已有92人学习下载。资源中的土壤分类体系表可对照联合国粮农组织分类体系理解土类、亚类、土属、土种等制图单元属性表SOIL_ID与编码表亚类一一对应便于按编号检索和分类统计。同时提供可编辑地图文档与标准成图用户可直接制图也可与省级区划叠加套合适合项目前期分析、课程设计或科研底图场景。1. 江苏土壤类型空间分布 shapefile先搞清楚你拿到的这张图是什么做省域空间分析的人最怕的不是没有数据是拖进 GIS 的第一眼就翻车江苏的图斑跑到海里、属性表全是问号、面积统计出来少了十倍。这份江苏土壤类型空间分布标准 shapefile也就是常说的 shape 文件解决的正是这类「省域土壤底图不可用」的老大难。它把土纲、土类、亚类这些分类信息落到矢量图斑上叠加行政区边界后能直接做面积统计、专题制图和耕地适宜性评价。适合自然资源、农业、生态和规划口的从业者也适合刚开始碰省级土壤数据的 GIS 新人——前提是你愿意花半小时把坐标系、字段和编码这三件事先理清楚。2. 读懂标准 shapefile 的结构伴随文件、坐标参考系与土壤字段语义「标准」这个词在 shapefile 场景下不是客套话它至少包含四层意思文件组织规范、坐标参考系明确、属性表字段有字典、几何拓扑干净。大多数拿到的省级土壤数据四样里能占两样就不错。先把这个底摸清后面所有处理才不会白做。2.1 shapefile 不止一个 .shp伴随文件各管什么事shapefile 是 ESRI 定义的矢量存储格式它天生不是一个单文件。一个能正常打开的标准 shapefile至少要有 .shp、.shx、.dbf 三个文件工程上还要带 .prj 和 .cpg分别记录坐标参考系和字符编码。很多人收到压缩包只解压出一个 .shp拖进 QGIS 直接报「无效数据源」就是因为少了兄弟文件。文件后缀作用丢失后果.shp存储点、线、面几何坐标无法读取.shx几何空间索引加速要素读取打开变慢部分软件拒绝加载.dbf属性表dBASE 格式图形能显示属性表打不开.prjWKT 格式的坐标参考系定义软件只能盲猜坐标系极易错位.cpg字符编码声明如 UTF-8、GBK中文属性大概率乱码ArcGIS 还会生成 .sbn/.sbx 作为空间索引删掉不影响数据本身只是重算一次而已。真正要记牢的是主文件名必须完全一致比如jiangsu_soil.shp对应jiangsu_soil.dbf改名要五个文件一起改只改一个就会打不开。我处理过一份所谓「标准」的全国土壤数据压缩包里只有 .shp 和 .dbf缺 .prj。没有 .prjQGIS 默认按 WGS84 经纬度猜而实际坐标是投影坐标图斑直接飞到了哈萨克斯坦方向。所以拿到手第一件事不是打开是清点文件完整性缺 .prj 的一律先按未知坐标系隔离处理。2.2 土壤属性表字段从土纲到土属的层级结构与代码字典土壤数据的属性表考察的是有没有分类层级概念。中国土壤分类系统从上到下分土纲、亚纲、土类、亚类、土属、土种六级。江苏常见土类包括水稻土、潮土、滨海盐土、黄棕壤、红壤、砂姜黑土等但属性表里通常不会直接给你「水稻土」三个字而是给一个像110101这样的代码。shapefile 的 .dbf 字段名最长只有 10 个字节中文基本塞不下所以你会看到TYPE_CODE、TYPE_NAME、AREA这类缩写或者拼音缩写。字段类型也值得警惕有些数据源把面积字段存成文本排序分组时会把1234.5和567.8当字符串处理必须先转成 float。多数不规范的土壤数据属性表里只有代码没有中文名。这个时候必须找配套的图例字典——通常是发布的 PDF 图例、数据说明文档或者论文附录里的代码对照表。找到后第一时间整理成 CSV 备查。没有字典的土壤数据就是黑匣子你敢拿它做统计后面解释不清结果时没人帮你扛。用 GeoPandas 打开后建议先做三步体检import geopandas as gpd gdf gpd.read_file(soil_raw.shp, encodinggbk) print(gdf.columns.tolist()) # 看字段名 print(gdf.dtypes) # 看字段类型重点确认面积字段 print(gdf.head(20)) # 抽查前 20 行确认代码与名称对应关系代码说明encodinggbk是尝试用中文编码读入如果报错或乱码再换encodingutf-8。这里的价值不在代码本身而在养成「先体检再使用」的习惯。字段名、类型、前 20 行数据能暴露九成问题。2.3 江苏适用坐标系先看清原始数据再谈转换坐标参考系是土壤 shapefile 里最容易出问题的点。先做一个范围校验江苏大致在 东经116°18′~121°57′北纬30°45′~35°20′。如果某图层的坐标范围里出现几十万甚至几百万的数那它一定是投影坐标系不是经纬度。省域尺度下三种坐标系各有用途使用场景推荐坐标系理由浏览、叠加查询CGCS2000 或 WGS84 经纬度通用性最好任何底图都能对齐面积统计、距离量算CGCS2000 / 3-degree Gauss-Kruger CM 120E江苏主体落在 120°E 三度带内变形小全省专题制图CGCS2000 Albers 等积投影双标准纬线等积全省面积无系统性偏差实操中我的习惯是原始数据如果带 .prj先看它写的是什么如果缺 .prj去数据发布页找说明。确认原始坐标系后用 QGIS 的「图层-导出-另存为」重新指定目标坐标系一次性产出规范文件。要强调的是set_crs和to_crs的区别前者只是给数据贴个坐标系标签不改变坐标数值后者才做真正的坐标变换。用错了图斑位置不变但标注变了后续叠加全乱。3. 把原始土壤数据整理成江苏标准 shapefile数据源选型与预处理3.1 数据源怎么选全国 1:100 万土壤图、省域专题图与栅格数据的取舍做江苏省级土壤分析常见数据源有三类。第一类是全国第二次土壤普查成果数字化后的 1:100 万中国土壤图覆盖全国分类体系是中国的七级分类属性字段完整缺点是比例尺小边界精度一般乡镇尺度基本不能用。第二类是部分省份公开或科研机构发布的省域土壤专题图比例尺能到 1:20 万甚至 1:5 万精度高不少但格式、坐标系、字段结构五花八门有的还是 CAD 导出的多边形。第三类是 HWSD世界土壤数据库这类全球栅格数据优点是字段标准化缺点是土壤分类用 FAO 体系和国内习惯对不上转矢量以后图斑细碎得没法看。选择建议很直接做省级宏观分析优先用全国 1:100 万矢量数据裁剪做县域或地块级评价必须找省域高精度专题图做跨境、全球对比研究才考虑 HWSD。不要混用两套不同分类体系的数据哪怕都是代码字段代码表不同合并结果就是灾难。数据源确定后还要确认三件事数据发布时采用的坐标系、属性表里分类字段的层级、以及数据是否有配套元数据文档。这些信息直接决定后续预处理脚本怎么改。3.2 用 GeoPandas 按江苏边界裁剪可直接改跑的脚本拿到覆盖华东甚至全国的土壤矢量图后第一步是按江苏省界裁剪。这里的关键不是剪而是剪之前先统一坐标系、先粗筛再精剪否则大范围数据做空间运算会慢到怀疑人生。import geopandas as gpd # 读取原始土壤数据编码按源数据实际情况选 gbk 或 utf-8 soil gpd.read_file(china_soil_1m.shp, encodinggbk) # 读取江苏省行政边界 jiangsu gpd.read_file(jiangsu_admin.shp, encodingutf-8) # 如果土壤数据缺坐标系先按元数据说明手动指定不然后面全错 if soil.crs is None: soil soil.set_crs(EPSG:4490) # CGCS2000 经纬度按实际情况改 # 边界统一到土壤数据的坐标系再裁剪 jiangsu jiangsu.to_crs(soil.crs) bounds jiangsu.total_bounds # 先用边界框粗筛降低空间计算量 soil_box soil.cx[bounds[0]:bounds[2], bounds[1]:bounds[3]] # 精确裁剪gpd.clip 在老版本可能不可用可换 gpd.overlay(soil_box, jiangsu, howintersection) soil_js gpd.clip(soil_box, jiangsu) print(f裁剪前 {len(soil_box)} 个图斑裁剪后 {len(soil_js)} 个图斑)参数说明cx是 GeoPandas 的坐标索引器按 x/y 范围直接过滤要素这一步能把千万级要素筛到几十万级后续 clip 才快。gpd.clip会按边界精确切割图斑跨省图斑在省界处被切断这是预期的结果。需要特别注意的是源数据里如果已经有AREA字段裁剪后这个面积值就失效了必须用新几何重算这一步很多人漏掉。裁剪完成后立刻做投影转换把数据转到适合江苏的投影坐标系# projtmerc 是高斯-克吕格投影lon_0120 对应中央经线 120°E soil_js soil_js.to_crs( projtmerc lat_00 lon_0120 k1 x_0500000 y_00 ellpsGRS80 unitsm no_defs ) # 重新计算面积单位为平方千米 soil_js[area_km2] soil_js.geometry.area / 1e6这里用 PROJ 字符串而不是 EPSG 编号是为了避免不同版本 GeoPandas 对 EPSG 支持不一致的问题。中央经线选 120°E覆盖江苏绝大部分区域投影变形在千分之一量级省级面积统计完全够用。如果后续要和全国数据拼图则统一改用 Albers 等积投影更稳妥。3.3 统一字段与编码后输出给后续使用铺路裁剪和投影只是预处理的一半另一半是字段整理。shapefile 的 DBF 格式对字段名长度要求很严格超过 10 字节会被截断截断后重名引发一堆玄学报错。所以在输出前把关键字段重命名为短英文名中文含义留到字典文件里说明# 假设源字段DLBM(代码), DLMC(名称)这里做重命名和筛选 soil_js soil_js.rename(columns{ DLBM: type_code, DLMC: type_name }) # 只保留业务需要的字段geometry 自动保留 soil_js soil_js[[type_code, type_name, area_km2, geometry]] # 输出时显式指定 utf-8 编码并生成 .cpg 文件可被 QGIS 识别 soil_js.to_file(jiangsu_soil_std.shp, encodingutf-8)代码逻辑先重命名再筛选避免把一堆无关字段带进成品to_file输出时会自动补齐 .shp/.shx/.dbf/.prjencodingutf-8同时生成 .cpg 文件这样 QGIS 打开不会乱码。这里有个经验如果你的下游是 ArcMap建议把编码改成gbk输出。ArcMap 对 UTF-8 的 .dbf 支持不稳定属性表容易乱码反之 QGIS 对 GBK 也能良好识别。没有绝对正确的编码只有匹配使用方的编码。输出完别急着用用 QGIS 重新打开一次看一下字段名是否完整、中文是否正常、图斑位置是否落在江苏三样全过才算交付。4. 把整理好的江苏土壤 shapefile 用起来专题图、面积统计与叠加分析4.1 在 QGIS 里制作江苏土壤类型专题图符号化参数与配色建议数据整理干净后最直接的产出是一张能放进报告里的土壤类型分布图。QGIS 里操作路径不复杂加载jiangsu_soil_std.shp和江苏行政边界右键土壤图层进入「属性-符号化」顶部下拉选「分类Categorized」值字段选type_name点击「分类」按钮生成所有土类。参数项建议设置渲染方式唯一值分类Categorized值字段type_name土类中文名配色方案ColorBrewer Set3或按土类语义手动配色边界线宽0.2 mm颜色 #666666图例标题土壤类型土类初学者容易犯的错是把土属甚至土种直接渲染类别上百个图例比地图还长。正确做法是先按土类渲染几十个符号就够了真要表达细类用「基于规则」的渲染器把几个相关土属合并成一组图面才干净。如果想在属性表里新增一列大类型用字段计算器写表达式CASE WHEN type_name LIKE %水稻% THEN 水稻土 WHEN type_name LIKE %潮土% OR type_name LIKE %盐土% THEN 潮土盐土 ELSE 其他 END这个表达式的重点是LIKE模糊匹配能兜住命名口径不完全一致的数据。注意新增字段名要用英文短词比如group_name中文名留给显示别名。4.2 按地级市汇总土壤类型面积sjoin 与 groupby 的组合玩法专题图只能看分布领导更关心数字江苏十三个地级市每个市水稻土多少平方公里、盐土多少。用 GeoPandas 一行句读完import geopandas as gpd soil gpd.read_file(jiangsu_soil_std.shp, encodingutf-8) city gpd.read_file(jiangsu_city.shp, encodingutf-8) # 空间连接把每个图斑挂到所在城市 soil_city gpd.sjoin(soil, city, howinner, predicateintersects) # 面积字段已在投影坐标系下算好这里直接分组汇总 table soil_city.groupby([city_name, type_name], dropnaFalse)[area_km2].sum() table table.reset_index() table.to_csv(soil_area_by_city.csv, indexFalse, encodingutf-8-sig)参数说明predicateintersects表示只要有相交就把图斑连到该城市howinner过滤掉省界外零星要素area_km2是第 3 章投影后重算的面积不是源数据老字段。输出用utf-8-sig是为了让 Excel 打开 CSV 不乱码。这个脚本的结果可以作为初稿但不能直接交。把一个城市所有土壤类型面积加起来和该市陆域面积对比误差超过 2% 就要回头查要么是沿海滩涂图斑缺失要么是坐标系没转对。我一般还会输出一个县级汇总作为中间校验因为县界精度通常比市界细能暴露更多边界问题。4.3 与土地利用数据叠加先统一坐标系和精度再做空间连接土壤数据最常见的下游应用是和土地利用现状数据叠加分析耕地土壤类型构成。这里最大的坑是比例尺不匹配土壤图一般是 1:100 万国土调查数据是 1:1 万甚至更高精度边界线对不齐是必然的不是数据坏了。正确的做法是接受精度差异不强行修边界。把两组数据统一到同一投影坐标系后直接做面面叠加统计的是「土壤图斑与土地利用图斑的重叠面积」landuse gpd.read_file(landuse_js.shp, encodingutf-8) landuse landuse.to_crs(soil.crs) # 叠加每个交集多边形继承双方的属性 merged gpd.overlay(soil, landuse, howintersection) merged[area_km2] merged.geometry.area / 1e6 merged[type_name].value_counts()这里输出的是分割后的碎多边形每个多边形同时带土壤类型和地类属性再做 groupby 就能得到交叉矩阵。要注意gpd.overlay会把两边的同名字段自动加_1后缀比如两个数据都有name字段结果里会出现name和name_1分析前先columns看清再选字段。5. 江苏土壤 shapefile 排查避坑坐标系错位、编码乱码与碎图斑的翻车记录省域土壤数据这一路走下来翻车率最高的就集中在五个场景。每一条我都按「现象 → 原因 → 解决」写清楚照着排查大部分问题十分钟内能定位。5.1 打开图斑就「飞到国外」坐标参考系错位现象把土壤面图层和在线底图叠在一起江苏的图斑出现在哈萨克斯坦方向或者显示在非洲西海岸坐标范围推出来有几百万的数值。原因八成是图层缺 .prj 文件软件默认按 WGS84 经纬度解析但原始数据本身是投影坐标数值没有被转换直接当作经纬度显示位置自然荒谬。另一小半是数据原始坐标系是北京54或西安80软件按 CGCS2000 读取形成几百米平移错位。解决先去发布页或元数据里确认原始坐标系的准确名称然后在 QGIS 里右键图层选择「设定 CRS」手动指定正确的坐标系。注意这里不是「另存为」重新投影而是先用set_crs明确标签再用「导出-另存为」转换成目标坐标系。在 GeoPandas 里同理gdf gdf.set_crs(EPSG:4490)之后再gdf.to_crs(projected_crs)变换顺序不能反。5.2 属性表中文全乱码数据源编码没对上现象打开属性表土壤名称显示为「????????」或者「锟斤拷锟斤拷」数字字段正常。原因源 .dbf 文件是 GBK 编码但读取软件按 UTF-8 解析要么 .cpg 文件缺失软件只能猜编码。ArcGIS 和 QGIS 对这种情况的处理方式不同ArcMap 更依赖系统区域设置所以同一份数据在两个软件里表现还不一样。解决在 QGIS 的「数据源管理器」里把编码从 UTF-8 改为 GBK重新加载即可。Python 侧更直接gdf gpd.read_file(jiangsu_soil_std.shp, encodinggbk) # 读出来后立即另存为标准 utf-8 版本 gdf.to_file(jiangsu_soil_utf8.shp, encodingutf-8)这段的核心是「先按正确编码读入再统一输出为 UTF-8」。但如果下游是 ArcMap建议输出为encodinggbk更稳。判断标准只有一个谁打开不乱码就按谁的来。5.3 面积统计少了一位用经纬度坐标直接算了面积现象全江苏土壤面积汇总出来只有几千平方公里而江苏省陆域面积约 10.72 万平方公里差着一个数量级。原因数据还停留在经纬度坐标系时geometry.area返回的单位是平方度不是平方千米。平方度随纬度变化不是一个固定值直接除以系数得到的数字没有任何物理意义。还有人会顺手选了 Web 墨卡托投影EPSG:3857来算面积高纬度区域面积被放大得离谱江苏这种中纬度地区能虚胖 20% 以上。解决面积计算必须在等积或近等积投影下完成。江苏用 CGCS2000 三度带中央经线 120°E即可代码见第 3.2 节。计算之前养成一个条件反射gdf.crs.to_epsg()看一下如果返回 4326 说明是经纬度直接停下来先投影再算。算完后和全省陆域面积做对比验证误差在 1% 以内才算通过。5.4 汇总面积重复跨地市图斑被每个地市各算一次现象按地级市汇总土壤面积把十三个市的结果加起来比全省土壤总面积多了几千平方公里。原因sjoin是一对多空间连接一个横跨南京和镇江边界的图斑会同时匹配到两个市生成两行记录面积被重复计入。如果你用的是按边界切分过的数据这没问题但很多人拿的是原始未切分图斑直接 sjoin重复不可避免。解决需要的是先切分再汇总。用gpd.overlay(soil, city, howintersection)把跨市图斑沿市界线切成独立多边形每个市只保留自己范围内那块然后再 groupby 汇总pieces gpd.overlay(soil, city, howintersection) pieces[area_km2] pieces.geometry.area / 1e6 table pieces.groupby([city_name, type_name])[area_km2].sum().reset_index()注意 overlay 结果会保留双方属性字段出现city_name与土壤字段的_1后缀不奇怪先打印columns确认再使用。如果只是做分布展示不做精确统计用 sjoin 也能接受但报告里必须注明统计口径是「按图斑归属市」否则别人重复你的结果时会对不上数字。5.5 边界碎图斑成片出现数据精度不匹配与无效几何现象裁剪或叠加后江苏沿海和市界附近出现大量面积只有几十平方米的细长碎多边形一眼看出是噪声。严重的甚至在图斑内部出现重叠空洞。原因土壤图比例尺只有 1:100 万行政边界精度远高于它clip 时边界处图斑被切成大量窄条源数据里还可能存在无效几何——自相交多边形、重复要素、空几何这些在叠加时会被放大。解决先修几何再过滤碎图斑。# 修复无效几何buffer(0) 是常见修法 if not soil.geometry.is_valid.all(): soil.geometry soil.geometry.buffer(0) # 删除碎图斑面积小于 1 平方公里的直接去掉阈值按制图比例尺定 soil_clean soil[soil.geometry.area / 1e6 1.0]代码逻辑is_valid是几何拓扑合法性检查返回布尔序列buffer(0)能让自相交和窄缝自动修正这是 GIS 界的经典做法。面积阈值选 1 平方公里对省级制图合适如果你做的是县域精细分析阈值应降到 0.01 平方公里甚至更低否则会误删真实小图斑。这一步做完看着清爽但统计口径也随之变了报告里写清楚「已剔除小于阈值碎图斑」即可。6. 进阶用 Python 批量校验省级土壤 shapefile 的完整性与一致性手工检查一份数据可以交付十份不同来源的数据时就需要自动化。我会在数据整理完成后跑一遍批量校验脚本把坐标范围、字段完整度、几何有效性一次性查完import geopandas as gpd from pathlib import Path base Path(F:/soil_product) for shp in base.glob(*.shp): try: gdf gpd.read_file(shp, encodingutf-8) except Exception: print(f{shp.name}: 读取失败可能是编码问题改用 gbk 试试) continue issues [] if gdf.crs is None: issues.append(缺坐标参考系) # 统一转经纬度验证范围避免投影坐标数值干扰判断 if gdf.crs is not None: wgs gdf.to_crs(EPSG:4490) xmin, ymin, xmax, ymax wgs.total_bounds if not (116 xmin 116.5 and 30 ymin 31 and xmax 122.5 and ymax 35.5): issues.append(f坐标范围超出江苏预期{xmin:.2f},{ymin:.2f},{xmax:.2f},{ymax:.2f}) if not gdf.geometry.is_valid.all(): issues.append(存在无效几何) for col in [type_code, type_name, area_km2]: if col not in gdf.columns: issues.append(f缺字段 {col}) if issues: print(f{shp.name}: 不通过 - ; .join(issues)) else: print(f{shp.name}: 通过)这段脚本的作用不是检查数据质量是检查交付状态。坐标范围、字段、几何有效性三关过了至少说明数据可以安全进入分析流程不会在半路炸掉。to_crs(EPSG:4490)转回经纬度判断范围比直接看投影坐标数字更直观也不受各地投影参数差异影响。我现在的习惯是任何一版省域土壤数据不管来自哪个渠道先放进这个脚本里跑一遍再决定要不要用。坐标、编码、拓扑这三件事做扎实shapefile 这步棋基本不会走错反之省下十分钟检查后面花两个小时查错位的图斑和算不对的面积。希望这套处理路径能帮你在江苏土壤数据上少走一段弯路把时间花在真正的地理分析上。本文还有配套的精品资源点击获取
返回列表