
简介一套覆盖安徽省全域、共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~19SOIL_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清理空几何和重复代码拿到原始矢量后我通常先用CheckGeometry和RepairGeometry跑一遍再对SOIL_CODE做去重检查。这一步不能省19 类图例最怕的是属性表里藏着第 20 种代码。import arcpy arcpy.env.workspace rD:\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 rD:\soil_project\map\base.mxd new_ws rD:\soil_project\data.gdb out_path rD:\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 rD:\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 rD:\soil_project\data.gdb\soil_19 out_dir rD:\soil_project\delivery\shp out_shp rD:\soil_project\delivery\shp\anhui_soil_19.shp sr arcpy.SpatialReference(rD:\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( rD:\soil_project\map\soil_19class_edit.mxd ) df arcpy.mapping.ListDataFrames(mxd)[0] out_tif rD:\soil_project\delivery\tif\anhui_soil_19_print.tif arcpy.mapping.ExportToTIFF( mxd, out_tif, df, df_export_width6000, df_export_height4500, resolution300, world_fileFalse, color_mode24-BIT_TRUE_COLOR, background_color255,255,255 )注意这里的world_fileFalse表示不生成.tfw适合打印报告。如果要把成图放进 CAD 或叠加到在线底图改成world_fileTrue旁边会多一个世界文件。resolution300是我做验收图的固定值图面放大到 150% 边缘不发虚如果只是网页预览150 dpi 就足够。GeoTIFF 路线out_geo_tif rD:\soil_project\delivery\tif\anhui_soil_19_raster.tif arcpy.PolygonToRaster_conversion( rD:\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, rD:\soil_project\delivery\tif\soil_main_300.tif, df, resolution300, world_fileFalse ) elif df.name 索引图: arcpy.mapping.ExportToTIFF( mxd, rD:\soil_project\delivery\tif\soil_index_150.tif, df, resolution150, world_fileFalse )这个循环里每个数据框单独控制分辨率。索引图分辨率没必要和主图一样高省下的空间可以留给主图细节。如果某个数据框区域超出安徽省范围记得在数据框属性里打开“裁剪到形状”用安徽边界面去切否则成图边缘会出现大量空白。5. 交付前自检几何、字段、图例数量与TIF影像在CAD里的自动定位5.1 三件套一致性检查脚本交付前我会用 GDAL 的 OGR 跑一个独立于 ArcGIS 的检查确保 Shapefile 不依赖 ArcGIS 环境也能被下游打开。检查项包括坐标系名称、图例代码数量、面积字段总和。from osgeo import ogr ds ogr.Open(rD:\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 旁边有同名.tfwCAD 桌面端就能按坐标坐标把影像图落到实际位置也就是两个文件必须同名后缀分别是.tif和.tfw。导出时如果world_file参数没有明确打开很多成图会默认不生成世界文件。CAD 无法识别无定位信息的 TIF只能当普通图块插入。另一个关键点是 TIF 在处理过程里不能做旋转一旦影像旋转.tfw记录的是外接矩形坐标套合误差会变得非常明显。我在脚本里最后加一行print(os.path.exists(tfw_path))来确认世界文件存在再交付给 CAD 组。这样三件套里的 TIF 既可以是打印用的标准成图也能直接喂给 CAD 做叠加定位。本文还有配套的精品资源点击获取