
简介全国一比五万接图表是地理信息系统领域常用的基础数据能在该比例尺下呈现地形、水系、道路与行政区域等要素广泛用于城市规划、环境评估与土地利用调查。这份打包资料将标准接图表整理为矢量文件格式共包含七个文件主要有空间几何文件、属性数据文件、投影定义文件以及索引文件可在主流桌面版地理信息软件中直接加载无需额外转换。压缩包仅一点一四兆字节体量很小适合快速下载并作为项目底图。目前已有七百九十八人浏览学习。相比逐幅申请原始数据该分包提供了全国统一的分幅格网与投影参数省去格式整理与坐标对齐环节便于开展图幅查询、要素编辑、叠加分析和专题制图也适合作为课程实验或科研示例数据。1. 全国1:5万接图表别再来回找图幅号自己用ArcGIS生成一份做数据汇交时两个单位拿着同一片区域的1:5万数据图幅范围怎么都对不上最后翻规范、查编号、问前辈折腾半天才搞明白是接图表用错了版本。所谓全国1:5万接图表就是把1:5万标准地形图逐幅的经纬度范围和图幅编号列成一张索引表在ArcGIS里它可以是点、是线、是面但核心价值只有一个让你点到一处、看图幅号、按号找数据。网上流传的接图表不少但坐标系旧、编号新旧混用的也很多与其碰运气不如按国标分幅规则自己生成一份干净、可控、随时能更新。这篇就讲清楚规则、ArcGIS操作和那些让我踩过不止一次的坑。2. 先把分幅规则吃透1:5万接图表的经纬度骨架与编号规则2.1 一张1:5万图幅到底占多大地方从1:100万往下切国家标准分幅地形图从1:100万开始往下逐级划分每一级都有固定的经差和纬差不按行政边界、不按图廓美观只按经纬度切。1:5万的图幅经差15分、纬差10分换算成度分别是0.25度和0.1666667度。这个数看起来简单却是后面生成格网、计算图幅号的全部基础。分幅的源头是1:100万经差6度、纬差4度。以1:100万图幅为底图1:50万分为2行乘2列1:25万分为4行乘4列1:10万分为12行乘12列到了1:5万这一级一个1:100万图幅内正好分成24行乘24列共576幅。各级比例尺的对应关系如下比例尺经差纬差在1:100万图幅内的行列划分1:100万6°4°1幅1:50万3°2°2行×2列4幅1:25万1°30′1°4行×4列16幅1:10万30′20′12行×12列144幅1:5万15′10′24行×24列576幅1:2.5万7′30″5′48行×48列2304幅1:1万3′45″2′30″96行×96列9216幅全国范围的1:5万图幅总量大约在两万七千余幅覆盖陆地岛屿和近海。数值看起来吓人但你要理解的是规则而不是数量只要知道某点的经纬度就能算出它落在哪个1:5万图幅里反过来给出图幅号就能算出该图幅的经纬度范围。接图表本质上就是这套一一对应关系的空间化表达。边界归属有个约定要注意相邻图幅的边界上通常按“含左下角不含右上角”处理避免两个图幅都算自己。算图幅号和生成格网时如果不遵守这个约定容易出现一个点同时被两幅图命中的情况。后面写脚本时我会在代码里加容差处理。2.2 新旧两套编号规则接图表里最常见的“对不上号”图幅编号看着像个黑匣子其实解码规则非常机械。国内从1991年前后推行新编号体系之前的老图用旧编号之后的新图用新编号两套规则并存这是接图表使用中最常见的翻车点。旧编号的典型形式是J-50-55-AJ-50代表1:100万图幅55代表1:10万图幅序号最后的A代表1:5万图幅在1:10万图幅内的四分之一位置。新编号则把1:100万、比例尺代码、行号、列号拼在一起比如J50E001002J50是1:100万图幅E是1:5万比例尺代码001是纬度方向的行号002是经度方向的列号。新编号里1:5万的比例尺代码是E不要和1:10万的D搞混。编号体系典型格式组成部分旧编号J-50-55-A1:100万图号-1:10万序号-四分之一方位码新编号J50E0010021:100万图号比例尺代码3位行号3位列号新旧编号的对应关系是可以直接换算的但实际数据里经常两边混着用老数据成果写旧号新汇交成果写新号Excel表格里又是一套接图表和属性表一连接就大量空值。我的建议是接图表里同时保留SHEET_NO新编号和SHEET_NO_OLD旧编号两个字段平时用新号做主键遇到老数据再走旧号挂接别做二选一。2.3 在ArcGIS里用Create Fishnet生成全国1:5万格网明白了分幅规则生成接图表就顺理成章把全国范围的经纬度范围按经差15分、纬差10分切成面网格每个面就是一张1:5万图幅。ArcGIS里最直接的工具有两个名字工具箱里的创建渔网以及对应的arcpy.management.CreateFishnet。注意生成格网这一步坐标系选地理坐标系直接输出经纬度不要在投影坐标系下生成否则所有维度单位都会变成米。常见做法是先建一个文件地理数据库把格网放到里面。要素类用GDB格式比shapefile省心字段长度、中文支持、编辑效率都好不少。以下是最小可运行脚本在ArcGIS Pro的Python窗口或任何装了ArcPy的环境里都能跑import arcpy out_gdb rD:\workspace\GB50000.gdb out_fc out_gdb r\grid_50000 # 全国1:5万分幅的大致覆盖范围单位度 origin 73 3 # 渔网起点左下角经纬度 y_axis 73 4 # Y轴方向点保证格网正南正北 cell_w 0.25 # 经差15分 0.25度 cell_h 0.16666666666666666 # 纬差10分 opposite 136 54 # 对边角右上角经纬度决定格网范围 arcpy.management.CreateFishnet( out_fc, origin, y_axis, cell_w, cell_h, 0, 0, # 行列数填0由对边角自动推导 opposite, NO_LABELS, #, POLYGON ) arcpy.management.AddField(out_fc, SHEET_NO, TEXT, field_length20) print(格网已生成, arcpy.management.GetCount(out_fc)[0])逻辑说明CreateFishnet以Origin为起点按给定的单元格宽度和高度向对边角方向铺满生成规则整齐的矩形面。这里用经纬度地理坐标系单元宽高直接填度0.25度就是15经分0.16666666666666666度等于10纬分。行列数参数填0工具会根据起点到对边角的距离自动计算需要多少行多少列省去手动数的麻烦。输出POLYGON面要素每个面后续会对应一个图幅号。参数说明Origin务必是左下角Y轴坐标点只决定格网的方向填正北方向经度相同、纬度略高即可Opposite的经纬度范围要略大于全国覆盖范围否则边缘图幅会被截掉如果不需要创建标注点Labels填NO_LABELS。生成后建议用GetCount看一眼要素数量全国范围算上海域格网会有数万个如果只想留陆地图幅后续可以叠加陆地或已有图幅目录做筛选这也是后面章节要处理的事。3. 给格网写入图幅号字段设计与ArcPy批量计算3.1 接图表字段怎么设计才不乱格网建好后只是一堆矩形面真正值钱的是每个面对应的图幅号、图名和位置信息。字段设计在第一步就做对后面能少踩很多坑。我把常用字段列成下表其中SHEET_NO作为唯一标识建议设置成文本类型并限制长度避免数字型字段丢失前导零。字段名类型长度说明SHEET_NOTEXT20新编号图幅号主键如J50E001002SHEET_NO_OLDTEXT30旧编号图幅号兼容老数据MAP_NAMETEXT30图名需从正式图幅目录中填入LON_MINDOUBLE-图幅左下角经度LAT_MINDOUBLE-图幅左下角纬度LON_MAXDOUBLE-图幅右上角经度LAT_MAXDOUBLE-图幅右上角纬度BELT_6SHORT-所在6度分带带号用于投影转换注意图名不是程序能直接算出来的它取自图幅内重要的居民地或自然地名必须从国家正式出版的图幅目录或已有的标准分幅数据元数据里拷贝别指望脚本凭空生成。SHEET_NO_OLD同理需按新旧编号规则从新号换算或从元数据中提取。我的习惯是先用脚本计算新号再批量生成旧号字段两次结果对比校验。字段名一律用英文大写中文含义写在别名里。shapefile的字段名长度限制和编码兼容性都差GDB要素类要宽松得多这也是我坚持把接图表放GDB的原因。先留好字段免得后悔后面再补字段、改字段类型才是真的折磨。3.2 ArcPy批量计算1:5万图幅号核心脚本图幅号的计算逻辑分三步先算1:100万图幅的行列号再算该点在1:100万图幅内的1:5万行列号最后拼装成完整编号。1:100万行号从赤道向北每4度一行用字母A到V表示列号从西经180度起每6度一列用两位数字表示。1:5万行号列号各三位范围001到024。下面这段脚本遍历上一步生成的格网取每个格网范围左下角的经纬度计算图幅号直接回写到SHEET_NO字段。我在边界处理上加了小容差避免浮点误差导致经纬度刚好落在分幅线上时算错行。import arcpy fc rD:\workspace\GB50000.gdb\grid_50000 field SHEET_NO def get_sheet_no(lon, lat): # 1:100万行号纬度0-4度为A每4度递增一字母 row100 int(lat // 4.0) 1 # 1:100万列号从西经180度起每6度一列 col100 int((lon 180.0) // 6.0) 1 # 该1:100万图幅左下角的经纬度 lon_min (col100 - 1) * 6.0 - 180.0 lat_min (row100 - 1) * 4.0 # 容差浮点误差会导致整分边界判断错位 eps 1e-6 # 1:5万纬差10分行号范围001-024 row5 int((lat - lat_min) / (10.0 / 60.0) eps) 1 # 1:5万经差15分列号范围001-024 col5 int((lon - lon_min) / (15.0 / 60.0) eps) 1 # 行号字母A对应1B对应2依此类推 row_char chr(ord(A) row100 - 1) return {}{:02d}E{:03d}{:03d}.format(row_char, col100, row5, col5) with arcpy.da.UpdateCursor(fc, [SHAPE, field]) as cursor: for i, (shape, _) in enumerate(cursor, 1): ext shape.extent cursor.updateRow([shape, get_sheet_no(ext.XMin, ext.YMin)]) if i % 5000 0: arcpy.AddMessage(已处理 {0} 个图幅.format(i))逻辑说明UpdateCursor遍历要素时SHAPE返回几何对象extent取到的是当前面的最小外包矩形XMin和YMin恰好是该图幅左下角的经纬度。每个图幅格网本身就是按经纬度切出来的规则矩形左下角作为定位点不会受质心偏移影响这也是不采样面中心的原因。字符串拼装时行号字母用ASCII码转换列号用两位补零比例尺代码E写死后面三位行号三位列号分别补零最终得到规范的12位新编号。参数说明row100和col100的“1”是因为编号从1开始而非从0开始eps容差的量级定在1e-6度约等于0.0036秒只消化浮点误差不会吞掉真实边界如果遇到复杂面要素比如跨越两个图幅的合并面必须先在前面保证格网要素不与分幅线交叉这正是Create Fishnet按经纬度切格网的天然优势。脚本跑完后用属性表检查几个已知坐标点的图幅号是否和规范一致再往下走。3.3 计算完怎么验证标注样式与SQL查重图幅号写进属性表并不代表万事大吉我吃过一次亏全批量算完后发现某一行公式里把比例尺代码写成了D整个图层看起来没问题实际没有一幅是1:5万的。所以验证步骤不能省。第一步做标注。在图层面板打开标注字段选SHEET_NO用“图幅号”做显示表达式缩放到局部窗口肉眼判断图幅号是否随经纬度递增有序。第二步用SQL查重复理论上每个格网的图幅号必须唯一SELECT SHEET_NO, COUNT(*) AS CNT FROM grid_50000 GROUP BY SHEET_NO HAVING COUNT(*) 1如果查出的CNT大于0说明有边界归属或格网重叠问题重点检查Create Fishnet的对边角范围和容差设置。第三步抽样比对随机挑几个图幅号按经纬度范围手算一遍或者和国家正式发布的1:5万图幅表核对。最后检查字段的左右值范围LON_MIN应该全部落在东经73度到135度之间LAT_MIN落在北纬3度到54度之间出现越界值说明原始格网范围设大了或坐标系回写错了。4. 接图表应用的排查与避坑坐标系、字段和编码4.1 接图表与标准分幅数据叠不上坐标系的锅现象接图表在ArcMap里加载后和已有的1:5万标准分幅影像叠加整体偏移几十米到几百米放大看错位明显缩小看又像对上了让人以为是数据本身的问题其实是坐标系没统一。原因接图表生成时用的是WGS84地理坐标系而多数国内1:5万生产数据用的是CGCS2000或1980西安坐标系的高斯投影。ArcMap的动态投影只是即时显示变换缺基准面转换参数时地理坐标系之间会默认按无偏移处理投影坐标系和地理坐标系叠在一起自然错位。这种问题最迷惑人经常被当成玄学处理。解决把接图表投影转换到和目标数据一致的坐标系而不是依赖动态投影。用投影工具输入接图表要素类选择目标坐标系如CGCS2000 3 Degree GK Zone或6度带高斯投影输出新要素类后重新加载。如果目标区域跨了好几个6度带就按3.1里的BELT_6字段分带处理每带单独投影或者干脆用Albers等积投影做全国统一索引标注时再去查带号。4.2 新旧图幅号混用导致连接失败现象把Excel里的图幅清单和接图表做属性连接结果大量记录显示为空或者匹配上的只有一半仔细看发现Excel里写的是J-50-55-A这种旧编号而接图表里全是J50E001002这样的新编号格式不同连接自然失败。原因新旧编号规则差异不是简单的加字符两个体系的排列方式、比例尺代码、行列号位数都不同直接文本匹配必然失效。更隐蔽的是同一片区域有些数据源用旧号归档有些用新号归档汇总时没人统一。解决给接图表增加SHEET_NO_OLD字段写一段换算逻辑生成旧编号或者写个辅助函数在新旧编号之间互相转换再把Excel数据统一转成新编号后再做连接。我的习惯是保留原始编号字段不动新生成一个标准化字段用于挂接这样既能看到原始值又能稳定连接算是一份后悔药。老旧数据务必在字段备注里标明编号体系来源避免下次汇交又踩一遍。4.3 中文图名乱码与字段长度问题现象接图表属性表里MAP_NAME字段打开一看中文图名全变成“??”或一段乱码有的字段只显示前面两个字后半截被截断。这个现象在shapefile格式里尤其常见GDB里偶尔也会出现。原因shapefile的dbf属性表对字符编码的支持比较弱老版本ArcMap默认按系统代码页读取中文很容易变成乱码字段长度不够则是图名超过设定长度被截断比如字段设了10个字符遇到“某某县某某乡”这种长图名就装不下。解决接图表优先用GDB要素类而不是shapefileGDB内部存储对UTF-8支持好很多字段长度给足MAP_NAME建议至少30个字符如果确实要输出shapefile在导出时把代码页设置成UTF-8并在加载时确认编码识别正确。还有一个排查小技巧乱码往往只在显示层用字段计算器转成Unicode或重新读取一遍有时能修复但最稳妥还是源头就存对。4.4 生成格网“图幅数不对”单位与范围设置翻车现象按前面脚本创建渔网结果出来图幅总数差得离谱要么只有几百个要么密密麻麻几百万个缩放到图面上一看格网要么大得离谱要么小得看不见明显不是1:5万应有的尺度。原因大多数情况是坐标系没选对。Create Fishnet工具界面上如果当前地图或环境坐标系是投影坐标系Cell Width和Cell Height的单位就变成米此时填0.25产生的不是0.25度而是0.25米格网自然完全错乱。另一种情况是对边角范围填错比如原点填了(73, 3)对边角填了(73.5, 4)生成的就只有一个格网。解决生成渔网前把环境坐标系设置成GCS_WGS_1984或者干脆在图层属性里把地图坐标系切到WGS84再运行工具对边角范围要比全国实际覆盖范围略大建议填(136, 54)生成后第一时间检查要素总数和范围全国含海域的1:5万格网数量应该在数万个量级如果差太多直接取消重新生成。这个坑几乎每个做过接图表的人都会踩一次花两分钟检查环境设置能省两小时排错。5. 接图表真正的用武之地批量裁剪与图幅检索5.1 按图幅号批量裁剪数据接图表最大的价值不是画出来好看而是作为工作清单驱动批量处理。最常见的需求是手头有一整块DOM或DEM要按1:5万图幅裁成标准分幅成果输出文件名直接带图幅号后续入库、分发、质检全部按图幅走。用接图表遍历每个图幅的坐标范围执行裁剪比手工一个个画范围框快一个数量级。import arcpy grid_fc rD:\workspace\GB50000.gdb\grid_50000 in_raster rD:\raw\DOM.img out_gdb rD:\clip\ClipResult.gdb arcpy.env.workspace out_gdb with arcpy.da.SearchCursor(grid_fc, [SHEET_NO, SHAPE]) as cursor: for sheet_no, shape in cursor: ext shape.extent extent_str {} {} {} {}.format(ext.XMin, ext.YMin, ext.XMax, ext.YMax) out_name clip_{}.format(sheet_no) try: # 栅格裁剪范围字符串依次为左、下、右、上 arcpy.Clip_management(in_raster, extent_str, out_name, #, #, NONE) arcpy.AddMessage(完成: {}.format(out_name)) except Exception as e: arcpy.AddWarning(图幅 {} 裁剪失败: {}.format(sheet_no, e))逻辑说明SearchCursor逐行读取接图表取出SHEET_NO和几何范围extent拼成“最小经度 最小纬度 最大经度 最大纬度”的字符串传给Clip_management。输出文件名直接使用图幅号保证和接图表一一对应。try块把失败图幅单独记录为警告而不是中断整个循环方便跑完后统计失败清单一次处理完所有图幅。裁剪参数最后的NONE表示不执行NoData值掩膜具体要不要掩膜按源数据情况调整。参数说明Clip_management第一个参数是输入栅格第二个是四角范围字符串顺序一定不能换输出名只写要素类名会自动创建在out_gdb里如果裁剪矢量用arcpy.Clip_analysis并传入面要素作为裁剪范围。每幅数据裁完后建议顺手生成一张覆盖统计表记录图幅号、像元数、空值率作为成果质量检查的辅助材料。这样接图表就从“一张索引图”变成了“一个可执行的工作流”整个分幅入库流程能节省大量手工操作时间。5.2 图幅检索小工具与制图索引日常用图幅号定位也离不开接图表。以前找幅图要在纸质接图表上数格子现在直接在ArcGIS里写一句属性查询选中即缩放定位非常快。给接图表图层配好这个交互逻辑基本就是半个图幅检索小工具了不用额外开发。我平时最常用的操作import arcpy arcpy.SelectLayerByAttribute_management(grid_50000, NEW_SELECTION, SHEET_NO J50E001002) arcpy.ZoomToSelected(grid_50000)SELECT语句里的图幅号可以从Excel、定位点或其他系统传入配合一个简单的输入框就能做成随手可用的检索功能。如果想把接图表放进挂图或图集可以直接把SHEET_NO和MAP_NAME字段做标注按图幅号排序后就是标准索引页。发布成服务后前端点击图幅面即可高亮显示图幅信息这套思路不需要额外插件只要把接图表作为基础图层发布即可。做了这么多年分幅数据我最大的教训是接图表这种基础资料越早自己建一份越省心。网上拿来的数据版本不明用起来心里没底按规则自己生成图幅号逻辑完全在掌控之中坐标系、字段、编号体系都清楚出问题也能快速定位。希望这份踩坑记录帮你在做接图表时少绕几个弯一次做成顺手能用的好工具。本文还有配套的精品资源点击获取