中国高程标准地图底图模板:SHP/TIF/MXD一体化GIS出图指南
简介:面向地理研究、教育教学与区域规划等场景,这份中国高程标准地图数据集整合了全国高分辨率高程TIF、全球矢量SHP、全国多级行政区划SHP、南海诸岛SHP及标准成图MXD模板,可满足从精细化地形分析到跨区域对比、南海专题制图的完整需求。压缩包内含71个文件,主要涵盖TIF高程栅格、SHP矢量要素、MXD工程模板以及配套的PRJ投影、DBF属性表等辅助文件,合计约190.68MB,结构清晰便于直接调用。目前已有744人学习浏览,适用于需要快速构建中国高程专题图或进行地理空间分析的GIS使用者。借助预设的图例、比例尺和方向指示,用户可基于MXD模板直接生成规范地图,同时结合全球行政边界与九段线数据,为国际对比和南海区域展示提供可靠底图,是一套兼顾数据完整性与制图效率的实用地理资源。
1. “中国高程标准地图”不是给你下载,是给你少踩一遍底图的坑
很多人第一次做GIS项目,不是倒在模型精度上,而是倒在最基础的“底图不统一”上:省界SHP下载下来投影五花八门,高程TIF只当普通影像在看,南海诸岛在图上几乎永远是空缺,最后要交图时才发现版式还得从头排。所谓“中国高程标准地图”这套数据,是把全球SHP、全国行政区划SHP、南海诸岛SHP、全国高程TIF和标准出图MXD打包成一套可直接开工的底图模板。它解决的是坐标系不统一、要素不完整、出图样式没有基准这三个最耽搁事的点。拿到手以后你只需要往工程里加业务图层,不必从头为了底图消耗工期。适合刚入门ArcGIS的从业者,也适合每个项目都要重复配置底图的老手。
2. 先拆包:SHP、TIF、MXD各自是什么,为什么要凑成一套
标题里列出的几种格式不是随意堆在一起。SHP管边界矢量,TIF管地表形态,MXD管成图样式,三者各司其职,缺一个,后面的出图流程就会多出不少手工作业。先弄清楚每个文件的本质,再谈怎么用。
2.1 SHP不是“一个文件”:从dwg转shp到shp转txt都要知道的事
SHP的全称是Shapefile,1998年由ESRI公开的矢量数据交换格式。它最大的特点是“多文件组成”而不是单文件,最少包含三个:.shp保存几何坐标,.shx保存几何索引,.dbf保存属性表。工程里经常出现只拷贝了.shp,换台电脑打开后图斑全部消失的情况,就是因为.shx和.dbf没有一起拷贝。比这三个文件更重要的是.prj和.cpg:.prj写坐标系,.cpg写字符编码。缺少.prj时,ArcMap会把它当未知坐标系加载,当前数据框如果是WGS84,它就会被拉到经纬度零点附近,和行政边界完全错开。所以拿到任何SHP数据,第一件事是看同一目录里有没有完整的.shp、.shx、.dbf、.prj四个文件,这是最基本的数据体检。
再说一个实操中非常高频的转换需求:dwg转shp。很多规划、地籍和交通设计的原始资料还在CAD里,而GIS项目要求把DWG要素导入到SHP中才能做空间分析。我用过ArcMap快速导入和FME两种路线,翻车点大体相同。第一,CAD里的多段线转成SHP后往往不闭合,后续算面积时要么用“面转线”结果相加,要么直接算不出准确面积,口径全乱。第二,CAD属性基本带不过来,实体在转出前最好先在CAD里按图层分好,或给每个实体附加扩展属性,否则到SHP里只剩几何。想省事,可以在CAD里先使用PEDIT把所有多段线批量闭合,再把图层按用途命名好,然后一次性导入ArcMap。这套中国高程数据最常被拿来配合作业的场景之一,就是和CAD原始图叠合检查地类变化。
反向的shp转txt也经常遇到,主要是给外部系统做数据交换。常见做法是用ogr2ogr导出CSV,或者用Python的Fiona遍历Feature,把几何转成GeoJSON或WKT写到文本。注意Shapefile的字段名中文通常会被截断,导出前建议先在属性表里把中文字段名改成英文别名。
2.2 高程TIF不是图片:里面的像素值是海拔而不是颜色
全国高程TIF,本质上是一个栅格DEM。表面上看后缀是.tif,但它和平时处理的照片完全是两类数据。照片记录每个像素的RGB颜色,而DEM记录每个像素的地理位置和高度。ArcMap中打开一个正确的DEM,内容列表里显示的拉伸类型通常是“标准差”或“最小-最大值”,而不是RGB复合。加载时如果发现它自动按RGB显示了,或者看上去像一张灰白图像,十有八九是软件没识别出它是单波段浮点数据,需要手动去“符号系统”里改成拉伸渲染。
判断一个TIF是不是DEM,可以在图层属性 → 源标签里看波段数和像素类型。DEM通常是单波段,16位整型或32位浮点;影像底图通常是3个或4个波段,8位无符号整型。全国性DEM常见的来源是SRTM、ASTER GDEM以及国内测绘部门发布的30米或90米高程数据。分辨率决定了后面坡度、坡向的计算精度,30米和90米在山区地形的细节差异明显,用的时候要根据项目需求选,不要盲目追求高分辨率,因为存储和计算开销会翻几倍。我处理省域范围时一般用30米,全国范围或大流域分析用90米就够。把全国范围的90米数据硬换成30米,栅格数量会让后续任何操作都变得极其漫长,这是花钱买罪受。
2.3 MXD是“成图”的关键:图层关系和版面都是提前排好的
MXD是ArcMap的工程文档,后缀.mxd。它本身不存数据,只存图层引用、符号化配置、数据框坐标系、页面布局和比例尺图例。这套中国高程标准地图里带一个标准成图MXD,等于把制图规范的常规动作先跑了一遍:行政区划用什么边界线宽、公里网怎么显示、南海诸岛的小图框放在哪个位置、标题栏和比例尺摆在哪,都已经落在版面上。你打开MXD后的第一感觉应该是“所见即所得”,所有底图要素加载完、符号化完,可以直接往上加业务图层,调整顺序就能出图。
但要注意,MXD是ArcMap时代的工程格式,ArcGIS Pro主推的是.aprx,两者不能直接相互打开。如果你用的是ArcGIS Pro,可以用工具箱里的“导入ArcMap文档”工具,或者干脆忽略MXD,按它的版面布局手动建一次APRX。从这套数据的角度说,MXD更大的价值在于提供布局参考:它告诉你一张规范的中国地图应该包含哪些图层、南海诸岛小图框在哪个位置、指北针和图例默认放在哪。即使你换了软件,照着这个版式把图层组合出来,出的图纸也不会太走样。
3. 把四个核心数据放进ArcMap:加载顺序、符号化和模板整理
数据打包得再整齐,也得在软件里正确加载才能用。这里按我实际项目经验,给出最稳妥的一遍操作。
3.1 先加载全国行政SHP,再叠加业务图层;南海诸岛要单独开数据框
加载顺序不是随手拖拽,它决定图层绘制优先级和默认范围。我一般先加载“全国行政SHP”作为底图,让数据框自动缩放到全国范围,再叠加载“全球SHP”作为外围参考,最后裁入业务图层。这样打开工程时默认视野就是全国,不会出现只显示一个角落的情况。全国行政SHP通常按省、市、县三级分图层,如果只要县域边界,可以直接双击图层打开符号系统 → 类别 → 唯一值,把省名或县名作为值展示,快速切换行政级别。县域行政区划边界SHP是热搜里很常见的词,实际上就是同一套数据的县界图层,很多项目用它做抽样、分级统计或生态区划。
南海诸岛SHP在全中国范围出图时,永远是小图框里的独立数据框,也就是ArcMap里的“系列小图框”。不要把它和大图数据放在同一个数据框里,否则出图时南海诸岛会出现在大陆旁边,或者被挤到图幅外。正确做法是在布局视图里安排一个专门的数据框,把南海诸岛SHP放进去,设好比例尺和投影,再放到底图的右下方或预留位置。类似的,还要单独检查图中其他敏感岛屿要素是否与行政SHP边界对应,避免缩放时出现缺口。
3.2 高程TIF的符号化:分级数和色带直接决定图的观感
DEM加载进来通常默认是灰色渐变,没法直接用。要调成看得惯的地形效果,右键图层 → 属性 → 符号系统 → 分类,选“分类”渲染,分类数我一般设在6到8类之间。分类方法优先选“自然间断点分级”或“相等间隔”。自然间断点更适合山区多、高程差异明显的地形;如果只是做一个全国范围的示意底图,用相等间隔更平滑。色带方面,从低海拔到高海拔可以用从深绿到浅绿、黄、棕、白,或者经典的高程从蓝到绿到棕到白。参数上要留意“类别数”和“颜色带”之间的对应关系,类别太少会丢失地形层次,太多地图上会显得斑驳。另一个常用的设置是“拉伸”,对32位浮点DEM用标准差拉伸,可以自动避开NoData和极值带来的突兀色块。
全国高程TIF往往覆盖范围很大,开了栅格符号化后会卡顿。解决方式是先把“高质量”模式关掉,或者生成概览视图金字塔。在图层属性 → 高级 → 构建金字塔里可以设置重采样方式,一般选“双线性”或“三次卷积”以保证显示平滑。数据量太大时,还可以用定义查询按经纬度范围只显示当前视野,但定义查询对栅格不直接生效,所以更常用的是构建金字塔和概览,让ArcMap自己抽稀显示。
3.3 把MXD当成模板:图层组、命名和出图样式只做好一次
标准MXD文件里通常会创建图层组,把“边界”“高程”“注记”分开管理。拿到手的MXD如果已按组排好,我建议不要真接往里塞原始数据,先复制出一个工作版本,只改数据源路径,保留图层组结构。打开MXD后如果底图层显示感叹号,说明数据源路径断了,右键图层 → 数据 → 设置数据源,指向实际存放SHP或TIF的目录即可。这里有个很容易被忽略的点:MXD记录的是绝对路径,换目录后稍有不慎就是一连串感叹号。我每次更换项目目录都会用“数据驱动页面”重新定位一遍数据源,或者干脆用Python脚本批量改图层连接,避免手工点十几次。
图层命名也要遵循可读性。我习惯的命名格式是“类型_区域_分辨率_日期”,例如“SHP_全国_县级_20240101”和“DEM_全国_30m_20240101”。这样做的好处是两个月之后再打开工程,不用逐个点图层属性就能知道数据口径和时效。出图样式方面,行政边界线宽默认用0.4磅到0.6磅,县级边界比省级边界细一档;公里网用“格网”功能生成,间隔按比例尺设置,比如1:100万时用1度格网。这套东西在MXD里都定义好,你就不用再对着白纸去调参考线。
4. 用面图层裁剪DEM:掩膜提取与栅格裁剪两种做法的取舍
高程TIF是全国范围,但实际项目几乎都是拿到某个县或某个流域去分析。这就一定要“用面图层裁剪DEM”。ArcMap里主要有两个工具:按掩膜提取(Extract by Mask)和栅格裁剪(Clip Raster)。工具名称相近,得到的结果表面也类似,但底层行为差别很大。
4.1 按掩膜提取:边界精确,但注意NoData的扩展
按掩膜提取在工具箱里的路径是Spatial Analyst工具 → 提取分析 → 按掩膜提取。输入栅格选全国DEM,输入掩膜数据选行政边界面图层,输出路径自己写一个合理的栅格存储位置。它的工作原理是:以面实体的边界为裁剪范围,将范围以外的像元直接置为NoData,范围内的像元保留原值。因此输出的栅格范围就是面的形状。
我平时给它加一个环境设置:在“环境”选项卡里把“掩膜”设置为面图层,并勾选“将NoData指定为背景值”。这个勾选项会影响后续分析——如果你裁剪完直接做坡度或等高线,NoData区域会扩展到面边界向外半个像元,导致边缘产生一圈无效值。更好的做法是裁剪后先重分类,把NoData重分类为0或其他固定值,再做表面分析。实际项目里,很多初学者不知道这两步差异,裁完的DEM边界看起来锯齿状很重,然后以为是数据问题,其实是NoData在渲染时被显示成了背景色。
一个可以复用的批量操作是,在ArcMap里写一小段Python脚本,对多个面文件循环执行掩膜提取。脚本中用arcpy.env.snapRaster把输出对齐到原始DEM的像元网格,避免不同面文件裁剪结果之间出现半个像元的偏移。代码如下:
import arcpy from arcpy.sa import ExtractByMask arcpy.env.workspace = r"D:\gis_data" arcpy.env.snapRaster = r"D:\gis_data\dem_30m.tif" # 对齐到DEM格网 arcpy.env.extent = r"D:\gis_data\dem_30m.tif" arcpy.env.mask = r"D:\gis_data\city_500m.shp" out_dir = r"D:\delivery" fields = ["county", "name"] # 按县域面裁剪DEM with arcpy.da.SearchCursor(r"D:\data\county.shp", fields) as cursor: for row in cursor: county = row[0] where_clause = f"{fields[0]} = '{county}'" arcpy.Select_analysis(r"D:\data\county.shp", f"memory\\{county}", where_clause) out_raster = f"{out_dir}\\dem_{county}.tif" ExtractByMask(r"D:\data\dem_30m.tif", f"memory\\{county}", out_raster) print(f"完成: {county}")这里的核心参数有三个:env.snapRaster强制输出栅格像元对齐到全球DEM的网格,env.extent限制分析范围避免内存溢出,env.mask则给所有后续空间分析统一套上一层裁剪。county字段名在实际数据里一般是“县区”或“NAME”,用之前先在ArcMap属性表看一眼,避免字段名不匹配报错。
4.2 栅格裁剪:矩形裁剪的“所见即所得”,配合作业更高效
栅格裁剪工具的路径是数据管理工具 → 栅格 → 栅格处理 → 裁剪。它的默认行为是对矩形范围进行裁剪,并不按面的形状收缩。使用时有三个参数很关键:输入栅格、输出范围、以及“使用输入要素作为裁剪几何”复选框。如果只是快速取一个矩形范围的DEM,比如编一个城市建成区周边矩形高程图,直接指定输出范围即可,工具会用一个矩形框去切。
如果想用面图层形状裁剪,必须勾选“使用输入要素作为裁剪几何”,并且把面的要素类选入,否则即便选了面图层,输出还是会保持那个面的最小外接矩形。另外还有一个容易误导人的选项“保持裁剪范围外部的NoData”:默认勾选时矩形边框外的区域会保留原DEM数据,栅格边缘就不会出现黑洞;但如果你是想做“保留边界内部数据”的分析,就要取消勾选,让框外数据全部被删除。这两种行为差异和4.1里的NoData扩展是同一个底层逻辑,很多人习惯性保留NoData,导致后面统计面积时多出来一大圈无效像元。
栅格裁剪的批量处理比4.1更高效,因为它不用逐个选面,只要在批处理对话框里把多个面文件输入进去即可。但缺点是和掩膜提取相比,栅格裁剪生成的NoData边界不够精确,在山区县界交界处容易出现拉丝效应。所以我实际项目里的判断标准是:如果裁完只做底图显示或报告配图,用栅格裁剪就够了;如果裁完还要做坡度、坡向、汇水面积计算,那就老老实实使用按掩膜提取。
4.3 到底怎么选:一个“按需求挑工具”的决策规则
很多搜索“arcmap中依靠面图层裁剪dem栅格tif文件”的人,最后都卡在“用哪个工具”上面。我总结过一套实际可用的判断规则:
如果是做展示底图,目标是把DEM裁成某个行政区显示,用栅格裁剪并把“使用输入要素作为裁剪几何”勾上,速度最快,文件也小。只考虑一个输出,不考虑后面分析。
如果要做定量分析,比如计算各县平均海拔、坡度分级面积、日照时数,那就用按掩膜提取。它可以保证输出栅格像元对齐、边界完整,还能通过环境设置把NoData一起带入后续工具,分析结果一致性好。
如果是对几十个县域批量处理,比如把全国DEM切到各县,我建议优先用掩膜提取写循环脚本,而不是逐一手工框选,因为手工框选容易让不同县的文件之间出现重叠边界,而脚本里设置snapRaster能保证每个县文件的像元网格完全对齐,后续做数据合并时不用再纠正。
5. 这套数据最容易翻车的5个坑:坐标系、编码、性能和成图细节
数据包本身可能整理好了,但到具体项目里仍然可能翻车。这5条是我实际遇到过、如果能提前知道就不用折腾的事情。
5.1 坑一:全国SHP和高程TIF坐标系不是一个体系
拿到数据包,先不要急着拖进ArcMap。打开图层的属性 → 源 → 空间参考,把SHP和TIF各自的坐标系记下来。很多自带“全球SHP”的包用的是WGS_1984地理坐标系,国内测绘部门发布的行政SHP可能使用CGCS2000或Krasovsky_1940_Albers,高程TIF则可能是GCS_WGS_1984,也可能是UTM投影。三者混在一个工程里,只要数据框坐标系统一,平移一两百公里是常有的事。
解决办法是在数据框属性里,把坐标系统一设置为你项目需要的那个,比如全国项目常用“CGCS2000_3_Degree_Gauss_Zone_26”,再勾选数据框属性里的“在图层上执行坐标变换”,让ArcMap在渲染时自动做投影转换。如果是要做面积量算,尽量统一到Albers等积投影;如果只要出图,用地理坐标系也无妨。还有一个容易被忽略的环节:当SHP的.prj缺失时,系统会把它当作未知坐标,此时应该在ArcMap里用“定义投影”工具先指派坐标,而不是在数据框属性里强行改坐标系。
5.2 坑二:属性表中文字段乱码
打开省界SHP的属性表,发现字段名和值全是乱码,属于很典型的编码问题。SHP的.dbf属性文件本身没有声明编码标准,.cpg文件才保存编码标识。如果.cpg写的是UTF-8,而ArcMap默认按GBK读取,或者反过来,就会乱码。
解决方法有三种。第一种,用记事本或Notepad++打开.cpg文件,手动把编码改成“UTF-8”,保存后重新加载图层。第二种,在ArcMap的工具 → 选项 → 常规里,设置“对于Shapefile使用系统本地语言环境”,让软件按GBK读取中文。第三种,用GDAL把SHP统一转成UTF-8编码,命令是:
ogr2ogr -lco ENCODING=UTF-8 output.shp input.shp参数里的-lco是“创建选项”的意思,ENCODING=UTF-8告诉GDAL在输出时把属性编码写成UTF-8。这样做的好处是不仅解决ArcMap的显示问题,也能兼容QGIS等软件。不过我强烈建议在拿到数据包的当天就把所有SHP统一转成UTF-8编码,因为.dbf的编码问题会在日后做字段连接操作时扩大成影响几何和面积量的大问题,那时候再来改会比现在麻烦得多。
5.3 坑三:全国SHP和高程TIF加载后ArcMap卡死
全国范围SHP动辄几十万面要素,高程TIF哪怕90米分辨率也有几百万像元,加载后出现“正在等待后台处理”是常态。解决方向有三个:一是右键图层 → 属性 → “显示”里把“比例依赖符号”关闭,只保留“变量”与“简化显示”勾选;二是在要用的图层上添加“定义查询”,按省或区域过滤数据,只显示需要的部分,避免全图参与渲染;三是对于栅格,构建金字塔和概览视图。ArcMap第一次加载时会弹窗提示构建金字塔,选择“是”。如果没有,在数据管理工具 → 栅格 → 金字塔中手工创建。懒一点,也可以用等大的面做“渔网分割”,把一次加载全国变成只加载几个渔网单元格,但终究不如定义查询省心。
实际项目的血泪经验是:不要直接双击打开全国SHP,也别用“数据加载工具”把整个全国幅面一次拖进来。把全国SHP当作基础参照图层,符号系统里只显示省界和主要水系;区县级边界需要再看时,只加定义查询显示当前视野范围内的县。另外一个容易忽略的性能杀手是导出PDF时的印刷分辨率,默认300 DPI已经够用,非要选600 DPI时,ArcMap会把所有图层按矢量重绘,DEM显示时间可能长达十几分钟。这些都算不上数据包的问题,却是使用这套底图时最现实的耗时点。
5.4 坑四:南海诸岛小图框的比例尺和插花
出图时,南海诸岛要有一个独立数据框,并且与主图比例尺协调。常见的问题包括:主图用1:1000万,小图框也用1:1000万,但因为范围太小,放大后看不到关键要素;或者小图框用了不同的坐标系,导致等比例尺下南海诸岛的形状与主图不一致。
我的建议是:在主图和南海诸岛数据框里分别设置相同的地图投影,比如都用“Asia_North_Albers_Equal_Area_Conic”,小图框的比例尺可以再放大到主图的3到5倍,比如主图1:1000万时小图框用1:3000万。这样既不显得突兀,又保持了形状的连贯性。另外在布局视图里,小图框外沿建议加一个细黑边框,放图例注明“南海诸岛”四个字。这是地图制图规范的基本要求,也是很多审图员特别留意的地方。
5.5 坑五:SHP导出WKT时“断线”和“丢失”
有热搜词提到“shp格式矢量数据导出为wkt”,这种导出在给外部系统对接或做数据入库时经常用。常见翻车点是:ArcMap里用“导出数据”选成“仅要素”而不是“带坐标系”,结果WKT字符串里只有坐标没有空间参考;或者SHP里的线要素被显示优化后看起来平滑,一导出就发现被拆成无数条短线。
用ArcGIS工具箱中的“要素转JSON”可以完整保留几何与坐标参考,把JSON转成文本也可靠。Python里的写法:
from osgeo import ogr ds = ogr.Open(r"D:\data\county.shp") layer = ds.GetLayer(0) with open(r"D:\data\county.wkt", "w") as f: for feat in layer: geom = feat.GetGeometryRef().ExportToWkt() f.write(geom + "\n")参数上需要注意:ogr.Open的第一个参数是数据源路径,第二参数0表示只读;ExportToWkt输出的是WKT字符串,默认丢弃坐标系信息,所以如果对方要求带投影,需要沿用.shp的.prj文件再做后处理。还有,如果线要素是MultiLineString,导出的WKT会带括号,接收方如果不支持Multi几何,要在导出前先执行“多部分转单部分”。这一步虽小,但对对接进度的影响真的很大。
6. 再往前走一步:用这套底图提取等高线,或者把SHP转成3D Tiles
底图只是基础。把DEM和SHP联动起来做二次产品,才是这套数据的更大价值所在。
6.1 从DEM提取等高线
ArcToolbox → 3D分析工具 → 栅格表面 → 等高线,是最直接的路线。参数上最关键的是等高线间距:山地地形用50米或100米间距,平原地形用5米或10米间距,全国范围用500米间距才不会让线条糊成一片。还有一个“等高线范围”参数,可以只对某个高程区间提取。生成后如果线条太碎,可以在符号系统中用排除表达式把长度小于某个阈值的线删除,只保留主要山脊和山谷的轮廓,这一步本质上就是“arcgis从dem提分文件提取shp”的常规解法。用GDAL在命令行里也能做,关键参数是-a指定高程字段,-i指定间距:
gdal_contour -a elev -i 100 dem_30m.tif contour_100m.shp6.2 SHP转3D Tiles
要做三维可视化,常见做法是先把SHP转成GeoJSON,再通过CesiumLab或ArcGIS Pro的3D Tiles工具转换。流程不复杂,但要注意在转之前统一SHP坐标系,因为3D Tiles的全球纹理底图通常基于WGS84或CGCS2000,如果原始SHP是Web墨卡托投影,叠加时会整片偏移。转出后我用Cesium的预览页面快速检查两个数据:行政边界的底部是否贴地,DEM的高程是否“浮”在半空。如果贴地不对,最可能是SHP字段缺少高度信息,需要先做属性连接把DEM的高程属性挂到SHP上。转GeoJSON的命令可以这样写:
ogr2ogr -f GeoJSON county.shp county.geojson6.3 我的一点工作习惯
每次拿到这类标准化底图,我现在习惯的第一步不再是把所有图层拖进来。先在QGIS里快速巡检一遍,用图层信息把每个文件的坐标系、要素个数和面积范围过一遍,再用ArcMap打开MXD做正式出图。这样既能在软件之间互检,也能提前判断哪个文件需要做编码或投影修复。我吃过的最痛的一次亏,是用旧MXD直接出图,没有检查数据源路径,结果输出PDF以后才发现省界是上一个项目的残留,数百张图纸全部重导。从那以后,我总会给MXD的数据源设置“相对路径”而不是“绝对路径”,项目从一台电脑挪到另一台时,打开工程再也不会出现断链。希望这点经验也能帮到你。
本文还有配套的精品资源,点击获取