
简介亚洲47国行政区划数据包覆盖东亚、东南亚、南亚、中亚、西亚及俄罗斯等47个国家和地区包含国家、省级、地市级、县级四级行政区划边界适合GIS制图、区域对比、城市规划、科研教学等场景使用。数据以标准shapefile格式为主体每条记录对应一个国家或行政区完整保留边界图形、名称、等级等属性字段另附可编辑mxd工程和已配图TIF成图用户可按自身制图习惯修改符号与标注也可直接取用整幅成图。压缩包共784个文件含154组shp/dbf/shx/prj基础文件以及cpg、sbn、sbx、xml等辅助信息文件层级清晰整体大小约643.1MB。目前已有283人学习下载部分国家提供县级数据具体县界层级可提前确认。对需要跨国行政区划底图的地理信息工作者而言这套数据兼顾完整性与易用性可支撑专题制图、统计分析及成果展示。1. 亚洲47国行政区划数据包拿到手先别双击先分清 mxd、shapefile 和 TIF 各自能干什么一个小团队接了个活儿交付一套亚洲47国行政区划制图成果省、市、县三级。移交包里躺着三类文件可编辑的mxd工程、标准的shapefile矢量以及一批带坐标的标准成图TIF。很多人拿到这样的包第一反应是双击mxd结果发现地图文档全是红感叹号或者出图样式陈旧另一些人把shapefile当万能数据导入后却因为坐标系或编码问题翻车。其实这三类文件各自承担不同角色mxd记录的是版面、符号和标注规则shapefile才是可分析的几何和属性本体TIF是已经渲染好的成果图。这个包的正确用法是把它当成三条并行的交付线——编辑、分析、展示——而不是一份能随便改的“数字地图”。下面按我日常做这类数据包的顺序逐层说清楚。2. 打开 mxd 先体检数据源路径、文档版本和相对路径决定你能不能顺利出图2.1 先搞清 mxd 里装的是什么路径引用与文档体检mxd是ArcMap的地图文档本质是一个XML外壳记录了图层列表、每个图层的符号、标注、版面和比例尺并不包含矢量几何和栅格像元。真正干活的数据还是外面的shapefile和TIFmxd只是按一套规则把它们“摆”到地图上。这意味着拿到mxd后第一件事不是急着改符号而是检查数据源路径是否还活着。只要文件夹被移动、磁盘盘符变化mxd里记录的那些绝对路径就全部失效表现就是图层面板冒出一排红色感叹号。这个坑90%以上的人都在搬家后踩过而且不难预防。常见做法是打开文档属性检查引用路径也可以在ArcMap里右键每个图层查看Source。更快的办法是用arcpy脚本把所有图层的真实数据源一次性列出来。下面脚本在ArcMap的Python窗口或安装了ArcPy的环境里运行import arcpy mxd_path rD:\Asia47\Asia47.mxd mxd arcpy.mapping.MapDocument(mxd_path) print(文档路径:, mxd.filePath) print(是否使用相对路径:, 是 if mxd.relativePaths else 否) for lyr in arcpy.mapping.ListLayers(mxd): if lyr.supports(DATASOURCE): print(图层:, lyr.name, -, lyr.dataSource) else: print(组图层或参考图层:, lyr.name) del mxd这段代码做的事很直接打开mxd后先看文档路径和相对路径开关再遍历所有图层找出每个图层的真实数据源。supports(DATASOURCE)用来判断当前图层是不是真正连到文件的图层组图层、空图层会返回False避免脚本中途报错。输出结果里如果出现不存在的路径就知道该重连哪个图层了。如果发现全部红感叹号不要一个个重新指定。推荐的做法是在图层属性里重连第一个shp然后把整个mxd的路径纠正过来也可以在重连后用脚本统一检查一遍。更长远的方法是回到文档属性里勾选“Store relative path names to data sources”这样整个项目文件夹整体搬走时mxd会按相对路径找数据省掉后续所有麻烦。注意这个选项只对“整个文件夹一起搬”有效单把mxd拷走数据不跟着走照样红叹号。2.2 mxd 版本、坐标系和视图比例出图前改哪几个参数mxd文件版本也是很多人的第一个拦路虎。ArcMap 10.2、10.4、10.8生成的mxd向下版本打开一般会有兼容提示ArcGIS Pro用户双击mxd时Pro会走一次导入向导把它转成自己的aprx文档。导入后的符号化大部分能保留但数据驱动页面、自定义符号级别这类特性可能丢需要逐项检查。常见做法是如果团队还停在ArcMap 10.x就固定用10.4以上版本保存并把mxd版本确认作为交接清单的一行如果已经迁到Pro就把mxd当作参考最终交付以aprx为准。坐标系这一步最容易被忽略。标题里写的是亚洲47国但市县级数据往往混合了WGS84地理坐标和各国当地投影直接叠加时差了几十公里甚至更大范围的偏移。打开mxd后应该先看数据框属性里的坐标系如果整份文档统一用WGS84制图范围这么大其实没问题如果要做面积量算或专题制图建议改用亚洲地区常用的Albers等积圆锥投影来展示数据框。切换投影后符号和标注不会变但比例尺的数值会变因为同一段距离在不同投影下对应的图上长度不同出图前要顺手校准比例尺。还有一个参数常在出图阶段造成返工——页面尺寸和分辨率。标准成图TIF如果要求打印或喷绘页面设置建议直接定A3横向分辨率按300dpi导出。ArcMap里在“页面和打印设置”里勾选“使用打印纸张设置”并锁定A3然后通过脚本导出TIF时把分辨率传进去import arcpy mxd arcpy.mapping.MapDocument(rD:\Asia47\Asia47.mxd) out_dir rD:\Asia47\output_tif for page in mxd.dataDrivenPages.pageRange: mxd.dataDrivenPages.currentPageID page out_tif out_dir r\page_ str(page).zfill(2) .tif arcpy.mapping.ExportToTIFF(mxd, out_tif, resolution300) print(已导出:, out_tif) del mxd这段脚本的核心是利用数据驱动页面Data Driven Pages分页输出。上面第一段脚本里已经检查过图层这里的假设是mxd已经配置好索引图层每一页对应一个国家或一个省。currentPageID切换页码ExportToTIFF按300dpi导出zfill(2)保证文件名排序正常。如果不想用数据驱动页面只是单页导出把循环去掉、只调一次ExportToTIFF即可。ArcMap导出时默认会写入世界文件勾选“写入世界文件”后生成的TIF带地理参考可以直接拖进ArcMap叠加。出图参数里还有一个高频调整项是压缩方式。ExportToTIFF默认的压缩可能是LZW或NONE取决于版本交付标准成图时除非对方指定无压缩否则我一般选LZW体积明显小且不损失质量。要是对方还要求配一张预览图可以再导一个JPEG。常见做法是TIF给印刷或存档JPEG给网页预览两套都按同样的页面布局出省得临时再排一遍。3. shapefile 三级行政区字段结构、坐标系与编码是导入前必须过的三道关3.1 shapefile 导入前先做数据体检文件族、字段与 .prj 三件套很多人对shapefile的理解是“一个shp文件”实际它至少由.shp、.shx、.dbf三个文件组成严谨一点的包还会带上.prj、.cpg。.shp存几何.shx是几何索引.dbf存属性表.prj写坐标系描述.cpg写的是dbf的字符编码声明。一个标准shapefile导入依赖整套文件拷给别人时漏了.prj或.cpg后面就会源源不断地冒出坐标系未知、中文乱码的问题。拿到数据包后我一般先做一次体检把文件族、字段、记录数和投影信息一次看清楚。用pyshppip install pyshp即可可以快速做这个体检import shapefile sf shapefile.Reader(rD:\Asia47\shp\asia_adm3.shp, encodingutf-8) print(记录数:, len(sf)) print(几何类型:, sf.shapeTypeName) print(投影文件存在:, sf.prj is not None) print(字段列表:) for f in sf.fields[1:]: # 第一个元素是 DeletionFlag跳过 print( , f[0], f[1], f[2]) rec sf.record(0) for name, val in zip([f[0] for f in sf.fields[1:]], rec): print(name, , val)Reader构造里的encoding参数很关键。dbf里的中文如果按GBK存储而系统默认按UTF-8读打印出来就是乱码这里显式传encodingutf-8保证读取阶段的字符不坏。sf.shapeTypeName可以告诉你这个文件是点、线还是面Polygon对应面sf.prj是pyshp读到同名prj文件后返回的坐标系描述字符串如果为None就要警惕坐标系缺失。记录的遍历方式是把字段名和值zip在一起方便肉眼核对字段内容到底是汉字、拼音还是混合编码。字段名还有一个shapefile的硬限制最多10个字符。数据包里市县级字段如果出现超过10个字符的名字导入时会被dbf规范截断但项目里不会有人帮你修正结果就是你在属性表里看到字段名被砍掉尾巴。遇到这种情况我一般先记录原始字段名然后用ArcMap的字段计算器或Python脚本重命名为不超过10字符的英文名再去做后续分析。不要指望ArcGIS会自动帮你修它只会静默截断等你写查询表达式时才发现字段对不上。3.2 属性表连接与按国家/区域导出从整包数据里切出目标子集亚洲47国数据包里的省市县通常是一个合并好的大文件属性表里通过ISO国家代码、ADM1省份代码、ADM2市级代码来区分级别。做分析时一般不需要每次都加载全部几十万条记录先把目标区域取出来能显著减轻ArcMap的渲染压力。最常见做法是在ArcMap里用Select By Attributes按ISO字段选择然后右键导出导出时勾选保存相对路径这样导出的子集还能独立分发。对应到Python就是读原文件、过滤记录、写出新shapefile顺带把坐标系文件复制过去import shapefile, shutil src shapefile.Reader(rD:\Asia47\shp\asia_adm3.shp, encodingutf-8) w shapefile.Writer(rD:\Asia47\shp\japan_adm3.shp, encodingutf-8) w.fields src.fields[1:] for sr in src.shapeRecords(): if sr.record[ISO_CC] JPN: w.shape(sr.shape) w.record(*sr.record) w.close() shutil.copy(src.prj, rD:\Asia47\shp\japan_adm3.prj) print(完成记录数, len(w))Writer创建时会重新生成.shp、.shx、.dbf三个文件。w.fields src.fields[1:]把原属性表结构带过去后面的record(*)会把record对象展开成与字段对应的多值写入。过滤条件是sr.record[ISO_CC] JPN这里ISO_CC只是示例字段名实际数据包里可能叫ISO_3、CC或CTRY_CODE先查一次属性表字段名再写条件。最后shutil.copy是把.prj复制过去不然导出的子集没有坐标系信息到别的机器上又是坐标系未知。属性连接的场景则不同有时你想给省级面挂上一个人口或GDP统计表而统计表是Excel或CSV没有几何。ArcMap里右键图层选择“连接和关联”按省代码字段把表格连进来。连接后字段名会带上源表前缀比如统计表里的pop_2024会显示成Sheet1_.pop_2024写表达式时注意引用完整字段名。用代码做同样的连接是arcpy.management.JoinField但日常少量操作直接在界面里做更快脚本更适合重复批量的工作。注意连接只是临时视图如果要把结果落到数据里记得导出为新shapefile或要素类否则下次打开连接就没了。再补一条日常高频问题shapefile导入到ArcMap一直失败。常见原因不是数据本身坏了而是路径里有中文或空格过深、文件名以数字开头、或者是把shp直接放进了数据库连接里操作。常见做法是把原始文件放到纯英文路径下文件名用adm3_asia这类的英文导入后再改名也无所谓因为导入后它已经进了地图文档。若是ArcGIS Pro导入Shapefile到工程会自动拷贝原文件路径反而没有那么敏感。4. TIF 标准成图与按行政区裁剪掩膜提取和“裁剪工具”到底差在哪4.1 标准成图 TIF 的组织方式坐标、位深和金字塔标准成图TIF是本数据包里的第三类交付物。它和普通图片TIF的区别在于要么TIF内嵌了GeoTIFF标签要么同目录带着一个.tfw世界文件GIS软件能据此把它摆到正确的经纬度位置上。简单说用系统自带看图软件能打开不代表它有坐标把TIF拖进ArcMap如果自动出现在正确位置才说明带地理参考。用gdalinfo检查是最直接的gdalinfo -stats D:/Asia47/tif/asia47_country.tif输出里重点看三处Coordinate System是不是WGS84或别的投影Origin和Pixel Size是不是有意义的数值Origin不应该是0,0Pixel Size不应该是1,1这种可疑值Size是不是你预想的行列数。如果开头出现“No projection”字样说明这个TIF没有坐标信息需要找同名tfw文件来补。另外stats参数会额外计算每个波段的min、max、mean方便判断成图是否包含背景值或NoData——这是后面裁剪黑边的隐患来源。位深决定了TIF的用途。标准成图TIF一般是8位的RGB三波段文件适合直接查看和打印颜色已经定死不能再做地形分析而DEM、坡度这类数据通常是16位单波段像元值是海拔或角度不带配色。如果数据包里还有这类16位TIF渲染时通常会显示为黑乎乎一片需要做拉伸符号化才能看到灰度层次这不代表数据坏了只是默认符号化方式不适合。判断方法同样看gdalinfo的文件大小和波段数8位RGB文件一般比同样面积16位单波段的大三倍。还有一个影响打开速度的因素是金字塔。ArcMap第一次加载几百MB甚至上GB的TIF时如果旁边没有.ovr金字塔文件加载会非常卡因为软件要从全分辨率开始绘制。常见做法是用ArcToolbox里的“构建金字塔”工具先生成.ovr或者在Catalog里右键栅格数据生成命令行也可以让GDAL生成但ArcGIS自己的.ovr在ArcMap里兼容性最好。数据包里如果附了同名.ovr说明发布方已经帮你预热过移动文件时记得把.ovr一起移动否则又要重新生成。4.2 按面图层裁剪 DEM/TIFClip、ExtractByMask 和边界黑边检索热词里反复出现的一个问题是在ArcMap中依靠面图层裁剪DEM栅格TIF文件和依靠面图层掩码提取有什么区别。这个区别如果没搞清很容易做出一个边界外全是纯黑块的假成功。简单来说Clip工具数据管理工具箱里的“裁剪”是把栅格按面的范围切出一个矩形或沿面边界的外接形状而ExtractByMaskSpatial Analyst的“按掩膜提取”是按面要素的精确几何形状取值面边界外面的像元直接变成NoData。两者对边界外的处理逻辑不同输出结果也不同。如果你只想“把这个国家的地形裁出来看”建议用ExtractByMask如果你想“保留区域内和边界附近的栅格、后续再和其他数据叠加”Clip更合适。还有一个细节Clip工具默认是沿面的外接矩形裁剪而不是沿面边界。要在Clip里沿面边界裁剪必须把最后一个参数clipping_geometry设为ClippingGeometry。这个参数在ArcMap界面里对应“使用输入要素裁剪几何”很多人漏了结果裁出来一个矩形块。下面两个脚本能直观对比差异。import arcpy from arcpy.sa import ExtractByMask arcpy.env.workspace rD:\Asia47 arcpy.env.overwriteOutput True # 让输出与原始DEM严格对齐避免裁剪引起像元偏移 arcpy.env.snapRaster rD:\Asia47\dem\dem_utm.tif mask rD:\Asia47\shp\japan_adm0.shp raster rD:\Asia47\dem\dem_utm.tif out_mask ExtractByMask(raster, mask) out_mask.save(rD:\Asia47\out\japan_mask.tif) print(掩膜提取完成)import arcpy arcpy.env.workspace rD:\Asia47 arcpy.env.overwriteOutput True arcpy.env.snapRaster rD:\Asia47\dem\dem_utm.tif arcpy.Clip_management( in_rasterrD:\Asia47\dem\dem_utm.tif, in_shapefilerD:\Asia47\shp\japan_adm0.shp, rectangle#, out_rasterrD:\Asia47\out\japan_clip.tif, nodata_value-9999, clipping_geometryClippingGeometry ) print(裁剪完成)两段代码的区别集中在工具的调用上。第一段先用ExtractByMask做掩膜提取它在内部把面要素栅格化然后把落在面外的像元标为NoData。处理对象既可以是单波段DEM也可以是多波段影像输出类型和输入一致。第二段用Clip_management沿面几何裁剪nodata_value参数用来把原来可能存在的背景值统一写成-9999方便后面识别如果省略这个参数背景可能保留原值后续统计最小值会变成奇怪的值。关键参数是arcpy.env.snapRaster。裁剪这类操作本质是重采样输出栅格和输入栅格如果不对齐像元网格会错动半格边界出现锯齿或偏移。设了snapRaster后工具会先对齐到指定栅格的网格输出和dem_utm.tif严格逐像元对齐这是保证后续分析例如叠加坡度、坡向不出系统性误差的前提。另一个常被忽略的参数是cell size如果有需要可以用arcpy.env.cellSize指定输出分辨率不传时默认取输入栅格的最小像元。裁剪完成后最常出现的翻车现场是区域内部正常边界外一圈纯黑或纯白。原因是NoData在ArcMap默认符号化下用黑色显示而在RGB影像里0值背景和NoData混在一起看起来像一整块黑。血泪经验是先查NoData显示再怀疑数据坏了。排查顺序是先gdalinfo -stats看影像有没有NaN或-9999再用符号系统把NoData显示为透明。如果背景值不是NoData而是0还需要用“按属性提取”把0值转为NoData后再保存。不要一上来就重做裁剪大多数情况只是显示符号化问题几分钟就解决。5. 常见问题排查mxd 红叹号、shp 乱码、TIF 裁剪黑边的 5 个典型坑5.1 mxd 打开后图层全部红感叹号先查相对路径再重连数据源现象拿到mxd双击打开图层列表里一排红色感叹号地图内容一片空白。 原因mxd存的是数据的引用路径不是数据本身。如果打包分发时mxd记录的是绝对路径比如D:\Asia47\shp\asia_adm3.shp换到E盘或另一台机器自然找不到。ArcMap默认不勾选相对路径所以这个坑非常普遍。 解决打开文档属性勾选“存储相对路径名”。然后右键任一红感叹号图层在源标签里重新指定正确路径ArcMap会自动更新同目录下其他断裂的数据源。更稳的做法是先统一把数据放到固定目录结构如D:\Asia47\shp再从图层属性重连。重连后立即另存mxd并把相对路径选项一起保存下次就不会再犯。5.2 shapefile 中文属性乱码八成是 .cpg 没跟上现象导入shp后属性表里的省份名、县名全是“锟斤拷”或“??”。 原因dbf属性表里的中文字符按GBK或UTF-8编码存储ArcMap靠.cpg文件判断如何解码。数据包分发时丢了.cpg、或.cpg内容写错比如GBK写成了UTF-8解码就错。 解决先查同目录有没有.cpg没有就用记事本新建一个内容按实际编码写UTF-8就写UTF-8GBK就写GBK或默认。如果你用pyshp读乱码通常是Reader构造时encoding传错了sf shapefile.Reader(rD:\Asia47\shp\asia_adm3.shp, encodinggbk) print(sf.record(0))把encoding从utf-8换成gbk再读一次能正常显示就反向确认是编码声明问题。注意Writer时同样要传encoding才不会写出乱码。这个坑和shp本身没有关系数据没有被破坏改完.cpg重新加载即可。5.3 行政区范围对不上先做属性校验再碰几何现象做亚洲47国专题时A国的某个县被画在了B国图例里或者某些区域在相邻两国数据里重复出现。 原因多国数据合并时边界口径、更新年份不同难免出现个别重叠或归属不一致。这不是数据包独有的问题所有跨国行政区数据都可能出现处理时尽量以权威来源为准。 解决处理顺序是先用属性表对账按国家代码分组统计记录数核对每个国家的县级记录是否都在然后用ArcMap的“相交”工具检查重叠把重叠要素挑出来单独看。对账通过后再做几何修正不要直接靠图形判断去改边界。如果只是做专题制图重叠区域可以用图例顺序压盖如果做面积统计重叠会导致重复计算必须二选一或按数据说明取舍。5.4 按行政区裁剪后的TIF全黑或全白NoData和背景值没分开现象用面图层裁剪DEM或影像后输出看起来一片黑或用拉伸符号化后黑白灰对比完全不存在。 原因可能是NoData在默认符号化下显示为黑色也可能是背景0值被当作有效像元参与拉伸计算拉平了整个色阶。 解决先看输出栅格的属性表或gdalinfo -stats确认有没有负值或-9999。有NoData就把显示符号化里的NoData设为透明或用“设置空值”工具反向处理。如果背景值是真的0但想剔除用栅格计算器写SetNull例如SetNull(clip_tif 0, clip_tif)需要Spatial Analyst许可。处理完再重新拉伸符号化图面就干净了。这里最容易犯的错误是反复重跑Clip其实改成符号化的NoData设置就行。5.5 几十上百幅TIF无法一次处理先建 VRT 虚拟栅格现象数据包里每个省一张成图TIF几百个文件堆在一起要在这些文件上做统一裁剪或镶嵌时每步处理要半小时以上。 原因逐个处理太重直接Mosaic成一个大文件又会撑爆磁盘。VRT虚拟栅格只记录各分幅的路径和范围不复制像元加载和处理时自动按需读取体积几乎可以忽略。 解决用GDAL一条命令建VRTgdalbuildvrt D:/Asia47/asia47.vrt D:/Asia47/tif/*.tif生成后把asia47.vrt当成一个普通栅格拖进ArcMap即可。裁剪、统计分析都能直接拿它当输入效果和用一个大TIF几乎一样但省了几十GB磁盘。如果ArcMap加载VRT偶尔卡先为各分幅生成.ovr金字塔速度会明显改善。VRT的唯一缺点是分发时不方便给别人用要么带上原分幅要么导出成真正的GeoTIFF这点记在交付说明里就行。6. 进阶把 47 国出图做成一套可复用的模板工作流前五章把数据包三个部分分别过了一遍最后说一个让后续工作省力的做法把mxd、lyr和数据驱动页面组合成模板。常见做法是先建一个Template.mxd把这个包里的省级、市级、县级三个shapefile全部加载进去按你习惯配好符号、标注、图例和比例尺。等符号配好右击每个图层选择“另存为图层文件”生成.lyr。这样符号规则就被抽离成独立文件下次换数据只更新shp路径不用重建样式。批量应用符号用arcpy的UpdateLayer最顺手import arcpy mxd arcpy.mapping.MapDocument(rD:\Asia47\Template.mxd) ref_lyr arcpy.mapping.Layer(rD:\Asia47\styles\adm3_ref.lyr) for df in arcpy.mapping.ListDataFrames(mxd, Layers): for lyr in arcpy.mapping.ListLayers(mxd, 县界*, df): arcpy.mapping.UpdateLayer(df, lyr, ref_lyr, symbology_onlyTrue) print(更新符号:, lyr.name) mxd.save()UpdateLayer的symbology_onlyTrue表示只替换符号系统不碰字段、查询定义和标注。ListLayers里用了通配符“县界*”要求图层命名时保持“县界_国家代码”这类前缀模板才匹配得上。对应的另一个技巧是把国家代码放到数据驱动页面的索引图层里每个国家自动生成一页再配合第2章的导出脚本就能批量输出47张标准成图。我早期做跨国专题图时每出十几张就手动换一次符号做到二十几个国家就彻底倦了后来改成模板加lyr加数据驱动页面的组合一套配置把所有国家跑完省下的时间足够做完整个专题册。希望这个思路帮到你至少别再像我当年那样一张张手工配出来了。本文还有配套的精品资源点击获取