安徽19种土壤类型数据:MXD、Shapefile与TIF三件套标准化交付实战
2026/9/13 5:15:45 网站建设 项目流程

简介:一套覆盖安徽省全域、共19种土壤类型的空间分布数据,面向GIS制图、农业区划、环境科学及城乡规划等方向的研究人员与技术工作者,可解决土壤分类数据获取难、制图样式不统一、无法直接编辑使用等问题。包内共18个文件,包含标准shape文件(含dbf、shp、shx、prj等)、可编辑mxd工程文件、标准成图TIF、土壤分类体系xlsx及显示样式修改示意图,压缩包总体积151.48MB。已有237人学习下载。数据采用FAO土壤分类体系,属性表SOIL_ID与编码表中“亚类”一一对应,可准确区分不同土壤类型;配套mxd文件支持在ArcGIS中随意调整图层与配色,TIF图片可直接用于展示和印刷,另有中国行政区shape文件便于叠加分析。整套数据层级完整、工具齐备,既能支撑科研制图,也能满足教学演示与项目出图需要。

1. 一套安徽土壤数据,为什么要同时交出MXD、Shapefile和TIF

“安徽19种土壤类型空间分布”这个需求,表面上是画一张土壤图,实际是三份性质完全不同的交付物:一份可以继续编辑的 MXD 工程文件、一份标准可入库的 Shapefile 矢量数据、一份能直接看图和打印的成图 TIF。我在土壤调查、农业区划和国土空间规划项目里反复做过这种“三件套”,体会最深的是:如果一上来就分别处理三份文件,大概率会在最后对不上号。

反直觉的一点是,真正磨人的不是土壤分类本身,而是让三份成果共享同一套图例编码、同一套配色、同一个坐标系。很多交付看起来都有内容,打开 MXD 符号却全是默认色,Shapefile 里字段名乱写,TIF 只是一张不带坐标的截图。这篇文章不讲大道理,直接按我实际做的顺序走一遍:先定 19 类图例规范,再把 MXD 做成真正可编辑的工程文件,再导出标准 Shapefile 和标准成图 TIF,最后给出一套能复查三件套是否一致的脚本,顺便解决“TIF 影像图在 CAD 里如何自动定位”这种现场高频问题。

2. 先订19类图例规范,MXD和Shapefile才不会中途返工

做安徽 19 种土壤类型空间分布时,我不建议拿到数据就开始拖图层。最优先的是把 19 个类型的代码、标准名称、制图颜色固定成一个 CSV 或 Excel 表,后续所有图例、字段、成图都从这张表派生。Apportioning color as a mere optional step often leads to duplicate labels and mixed names across layers.

2.1 安徽19种土壤类型的图例编码与RGB配色

安徽常见的土壤类型包括水稻土、潮土、砂姜黑土、黄棕壤、黄褐土、红壤、黄壤、石灰土、紫色土、棕壤、暗棕壤、山地草甸土等,具体到省级图鉴一般归并为 19 个类。分类体系可以是发生分类,也可以是系统分类中的土类,但 GIS 端只认“一个代码对应一个名字”。我的习惯是把代码定为两位整数,从 01 排到 19,颜色用 RGB 直接写在配置表里。

SOIL_CODE,SOIL_NAME,RED,GREEN,BLUE 01,水稻土,206,204,112 02,潮土,240,220,130 03,砂姜黑土,180,180,160 04,黄棕壤,150,90,60 05,黄褐土,170,130,80 06,红壤,190,60,50 ...

这段 CSV 不是给人看的,而是让脚本统一读取。逻辑很简单:不管原始数据里叫“水稻土性土”还是“水稻土性水分”,最终落到成果里只能叫“水稻土”。代码表一旦定下来,后面 MXD 的图例、Shapefile 的属性、成图 TIF 的色带都以它为准。

2.2 属性表字段规划:字段名不超过10字符,中文用GBK写入

Shapefile 的 DBF 文件天生有两个限制:字段名最长 10 个字符,而且不能完全依赖中文列名。所以 GDB 里可以写中文别名,但交付出去的 Shapefile 必须用拼音或英文缩写。我一般固定以下字段结构:

字段名类型长度说明
FIDObjectID-系统要素编号
SOIL_CODEShort Integer2土壤类型代码,01~19
SOIL_NAMEString30土壤类型标准名称
AREA_KM2Double15图斑面积平方千米
SOURCEString40数据来源说明
REMARKString60备注

字段名千万别写SOIL19CODE这种 10 字符卡的特别准的;AREA_KM2恰好 8 位,没问题。中文SOIL_NAME在 Shapefile 里需要用arcpy.env.codepage = "UTF-8""GBK"。我这里的做法是:如果下游多是新平台,用 UTF-8;如果还要给老版 ArcMap 用,用 GBK,并且生成.cpg文件。

2.3 用arcpy清理空几何和重复代码

拿到原始矢量后,我通常先用CheckGeometryRepairGeometry跑一遍,再对SOIL_CODE做去重检查。这一步不能省,19 类图例最怕的是属性表里藏着第 20 种代码。

import arcpy arcpy.env.workspace = r"D:\soil_project\data.gdb" fc = "soil_origin" arcpy.management.RepairGeometry(fc) with arcpy.da.SearchCursor(fc, ["SOIL_CODE", "SOIL_NAME"]) as cursor: codes = {} for code, name in cursor: codes.setdefault(code, set()).add(name) bad = {code: names for code, names in codes.items() if len(names) > 1} print("代码重复且名称不一致:", bad)

这段代码先修复几何,再统计每个代码对应哪些名称。如果bad非空,说明同一代码下混了多个名称,需要回到属性表统一。参数上RepairGeometry会重建几何坐标序列,避免后续导 Shapefile 时出现空几何报错。至于“悬空图斑”对多边形意义不大,真正要查的是面积过小的碎图斑,一般用THIN或者外接面积过滤掉。

3. 可编辑MXD:图层组织、替换数据源与符号挂接

MXD 里的图层必须是活的。所谓“可编辑文件”,意思是项目里任何人双击打开,都能直接改范围、改标注、改颜色,而不用从 TIF 底图上抠。换句话说,MXD 里保留的是矢量图层,不能把土壤层转成图片。

3.1 数据框、比例尺与图例框的排版参数

先整理排版,再写代码。MXD 的数据框坐标系我固定为 CGCS2000 的 3 度分带投影,安徽大部分地区落在中央经线 117°E 上。这样做的原因是,19 类土壤图斑要叠地形、叠水系,投影坐标比地理坐标更稳定,标尺和面积字段也能直接对上。

设置项建议值原因
数据框坐标系CGCS2000 3 Degree GK CM 117E安徽范围形变最小,适合 1:10 万到 1:50 万
参考比例尺1:500000标注不随视图缩放乱跑
土壤图层最大显示比例1:100000避免小图斑上堆满文字
底图透明度50%既能看到地形,又突出土壤色块
MXD 相对路径开启工程整体移动后不丢数据源

3.2 用arcpy替换MXD里的原始土壤图层

很多时候项目方给的是一个带所有地貌、水系、行政界的底图 MXD,我们要做的就是把旧的土壤图层替换成规范后的 19 类要素类。用arcpy.mapping.replaceDataSource是最省事的方式,不用删了再加。

import arcpy mxd_path = r"D:\soil_project\map\base.mxd" new_ws = r"D:\soil_project\data.gdb" out_path = r"D:\soil_project\map\soil_19class_edit.mxd" mxd = arcpy.mapping.MapDocument(mxd_path) mxd.relativePaths = True df = arcpy.mapping.ListDataFrames(mxd)[0] for lyr in arcpy.mapping.ListLayers(mxd): if "soil" in lyr.name.lower(): lyr.replaceDataSource( new_ws, "FILEGDB_WORKSPACE", "soil_19", False ) mxd.saveACopy(out_path, "10.4") print("MXD已另存为:", out_path)

replaceDataSource四个参数分别指工作空间路径、工作空间类型、目标要素类名、是否深层验证。这里False表示不强制所有字段一致,速度快很多;但前提是字段结构本身已经对齐。relativePaths必须打开,否则交付的 MXD 在别人电脑上会大面积红源。

3.3 把19类图例固定到图层文件,防止符号漂移

替换数据源后,符号化默认会变成单色。我的做法是提前做一个.lyr图层文件,里面存好 19 类图例和标注规则,然后用ApplySymbologyFromLayer直接套回来。

lyr_file = r"D:\soil_project\style\soil19.lyr" soil_layer = arcpy.mapping.ListLayers(mxd, "soil_19", df)[0] arcpy.ApplySymbologyFromLayer_management(soil_layer, lyr_file) soil_layer.showLabels = True soil_layer.labelClasses[0].expression = "[SOIL_NAME]" mxd.save()

代码里showLabels控制是否显示类型名称,expression把标注字段设为SOIL_NAME。注意.lyr文件路径不要带桌面小箭头那种相对写法,建议放在项目工程目录里,和 MXD 同级;否则换机器后一样找不到符号库。图例框在 ArcMap 排版里绑定这个图层即可,图例名称和颜色都会自动更新。

4. 导出标准Shapefile和标准成图TIF:坐标系、压缩与输出参数

MXD 改好后,才能谈导出。交付部分我习惯拆成两个动作:先导 Shapefile,再导成图 TIF。两者坐标系和参数完全不同,一个面向数据交换,一个面向看图。

4.1 标准Shapefile的硬性要求:坐标系、编码、几何

标准 Shapefile 不是“从图层右键选导出”就完事的。我一般用脚本固定坐标系,避免人工在对话框里选错投影。坐标系从已有的标准.prj文件读取,最稳妥。

import arcpy arcpy.env.overwriteOutput = True arcpy.env.codepage = "UTF-8" src_fc = r"D:\soil_project\data.gdb\soil_19" out_dir = r"D:\soil_project\delivery\shp" out_shp = r"D:\soil_project\delivery\shp\anhui_soil_19.shp" sr = arcpy.SpatialReference(r"D:\soil_project\config\CGCS2000_117E.prj") arcpy.env.outputCoordinateSystem = sr arcpy.FeatureClassToFeatureClass_conversion( src_fc, out_dir, "anhui_soil_19.shp" )

这里outputCoordinateSystem会强制输出坐标投影到目标坐标系,转换完成后还要确认一下.prj文件与目标坐标系一致。编码方面,如果输出的 DBF 在 QGIS 里乱码,把arcpy.env.codepage改成"GBK"重新导出一次即可。Shapefile 这套文件里.prj.dbf.shp.shx需要同名且在同一目录。

成果类型坐标系编码检查重点
ShapefileCGCS2000 3° GK CM 117EUTF-8 优先字段名长度、空几何
分析用TIF与 Shapefile 相同不涉及无值区掩膜
打印成图TIF无严格投影要求不涉及分辨率、配色

4.2 标准成图TIF如何输出:布局导出与GeoTIFF两条路

标准成图 TIF 有两种常见理解:一种是打印用的版面图,一种是可以继续做空间分析或叠加底图的 GeoTIFF。两者不能混。打印图我直接用ExportToTIFF从布局导出,带图例、指北针、比例尺;叠加用的 GeoTIFF 则用PolygonToRaster把矢量转成 100 米分类栅格。

布局导出代码:

import arcpy mxd = arcpy.mapping.MapDocument( r"D:\soil_project\map\soil_19class_edit.mxd" ) df = arcpy.mapping.ListDataFrames(mxd)[0] out_tif = r"D:\soil_project\delivery\tif\anhui_soil_19_print.tif" arcpy.mapping.ExportToTIFF( mxd, out_tif, df, df_export_width=6000, df_export_height=4500, resolution=300, world_file=False, color_mode="24-BIT_TRUE_COLOR", background_color="255,255,255" )

注意这里的world_file=False表示不生成.tfw,适合打印报告。如果要把成图放进 CAD 或叠加到在线底图,改成world_file=True,旁边会多一个世界文件。resolution=300是我做验收图的固定值,图面放大到 150% 边缘不发虚;如果只是网页预览,150 dpi 就足够。

GeoTIFF 路线:

out_geo_tif = r"D:\soil_project\delivery\tif\anhui_soil_19_raster.tif" arcpy.PolygonToRaster_conversion( r"D:\soil_project\data.gdb\soil_19", "SOIL_CODE", out_geo_tif, "MAXIMUM_AREA", "", 100 )

MAXIMUM_AREA表示落在同一个栅格格网里的多个图斑,取面积最大的那个土壤类型作为像元值;100是像元大小,单位是米。这个参数要谨慎:像元太小文件膨胀,太大细碎图斑会消失。安徽省域范围用 100 米栅格,成果体量和清晰度比较均衡。

4.3 多数据框成图与批量导出的参数差异

同一个 MXD 里如果既有土壤详图又有全省概览图,不能只导出一次。多数据框导出时,ExportToTIFF里的data_frame参数可以用通配符循环处理。

for df in arcpy.mapping.ListDataFrames(mxd): if df.name == "主图": arcpy.mapping.ExportToTIFF( mxd, r"D:\soil_project\delivery\tif\soil_main_300.tif", df, resolution=300, world_file=False ) elif df.name == "索引图": arcpy.mapping.ExportToTIFF( mxd, r"D:\soil_project\delivery\tif\soil_index_150.tif", df, resolution=150, world_file=False )

这个循环里每个数据框单独控制分辨率。索引图分辨率没必要和主图一样高,省下的空间可以留给主图细节。如果某个数据框区域超出安徽省范围,记得在数据框属性里打开“裁剪到形状”,用安徽边界面去切,否则成图边缘会出现大量空白。

5. 交付前自检:几何、字段、图例数量与TIF影像在CAD里的自动定位

5.1 三件套一致性检查脚本

交付前我会用 GDAL 的 OGR 跑一个独立于 ArcGIS 的检查,确保 Shapefile 不依赖 ArcGIS 环境也能被下游打开。检查项包括坐标系名称、图例代码数量、面积字段总和。

from osgeo import ogr ds = ogr.Open(r"D:\soil_project\delivery\shp\anhui_soil_19.shp") lyr = ds.GetLayer(0) srs = lyr.GetSpatialRef() print("坐标系:", srs.GetName()) codes = set() for feat in lyr: codes.add(feat.GetField("SOIL_CODE")) print("唯一土壤代码数量:", len(codes)) assert len(codes) == 19, "图例数量必须为19"

如果这段代码抛出断言错误,说明 Shapefile 里多或少了类型,不能继续打包。坐标系打印出来后,还要用文本打开.prj人工确认没有变成 WGS84 之类的坐标,因为很多项目验收方会直接看.prj文件内容。之后再用 ArcGIS 的CheckGeometry对输出 Shapefile 做一次最终检查,确认RepairGeometry没有破坏拓扑。

5.2 带世界文件的TIF在CAD里自动定位的要点

“TIF影像图怎么在CAD中自动定位”是我被问过很多次的真实问题,答案就在.tfw世界文件。CAD 里做工程套合时,只要 TIF 旁边有同名.tfw,CAD 桌面端就能按坐标坐标把影像图落到实际位置,也就是两个文件必须同名,后缀分别是.tif.tfw

导出时如果world_file参数没有明确打开,很多成图会默认不生成世界文件。CAD 无法识别无定位信息的 TIF,只能当普通图块插入。另一个关键点是 TIF 在处理过程里不能做旋转;一旦影像旋转,.tfw记录的是外接矩形坐标,套合误差会变得非常明显。我在脚本里最后加一行print(os.path.exists(tfw_path))来确认世界文件存在,再交付给 CAD 组。这样三件套里的 TIF 既可以是打印用的标准成图,也能直接喂给 CAD 做叠加定位。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询