简介:一份面向ArcGIS使用者与地图二次开发者的多尺度地图数据包,内含城市级、洲级和世界级三个图层体系,可满足城市规划、交通管理、区域分析及全球研究等不同场景的底图需求,也是mxd文档操作和图层管理的理想练习数据。包体共24个文件,以mxd地图文档、shp/shx/dbf矢量数据、lyr图层文件及sdc/sdi辅助文件为主,整体约899KB,结构紧凑便于下载和直接加载至ArcMap或ArcGIS Pro中使用。数据既包含街道、建筑等城市细节,也覆盖自然分区和全球范围信息,配合ArcObjects、ArcPy等二次开发接口,可实践动态加载、筛选与空间分析流程;借助ArcGIS Online或Desktop还能继续更新维护,保持数据时效性。已有1593人学习下载,适合GIS初学者熟悉图层组织方式,也适合开发者快速获取基础地理数据用于功能验证与项目原型搭建。
1. ArcGIS地图数据的核心不是“图”,而是那张属性表
很多人第一次接触 ArcGIS 地图数据时,下意识以为它就是把一张图片放进软件里显示。真正上手才发现,ArcGIS 里那份数据之所以能查询、分析、出图,是因为它由“几何图形 + 属性表”两部分组成,缺了属性表,图就是个空壳;缺了坐标系,图就会飘到不该在的位置。所以处理 ArcGIS 地图数据,第一课不是学画图,而是学怎么组织一堆散装 shp、tif、表格,让它们变成结构清晰、位置可信、风格统一的标准数据。这篇笔记适合刚接手 GIS 数据整理任务、准备搭建内部数据规范、或者频繁被“坐标对不上、字段乱码、出图变白”折磨的朋友。
2. 数据格式选型:矢量、栅格与地理数据库的边界在哪
2.1 矢量与栅格:先分清两种基本形态再动手
ArcGIS 地图数据最上层的分叉是矢量与栅格。矢量数据用点、线、面表达离散要素,每个要素背后都挂着一行属性记录,比如道路是线,它对应的字段里写着道路等级、宽度、铺设年份;栅格数据用规则的像元矩阵表达连续表面,比如卫星影像、DEM 高程模型,每个像元的数值代表该位置的亮度或高度。
我接手数据时第一件事不是打开地图看效果,而是先确认这批数据到底是矢量还是栅格,因为后续所有操作路径都不同。矢量数据的编辑、拓扑检查、属性的 SQL 查询、符号化都基于要素和记录,适合做业务数据;栅格数据适合做底图、做表面分析和影像分类,但直接进属性表查询就很不顺手。
选型的常见判断标准:要素边界要精确、字段要参与筛选统计、数据要被人反复编辑,选矢量;要素本身是连续的物理量、只有波段数值没有业务属性、做地表覆盖或坡度分析,选栅格。实际项目里往往两种混着用——业务要素用矢量存到地理数据库,影像和地形用栅格存成独立目录,两边通过同一套坐标系对位,互不干扰。
2.2 Shapefile 与 File Geodatabase:为什么新项目我更推荐 gdb
在矢量格式这个层级,碰到最多的选择题是“用 Shapefile 还是 File Geodatabase”。Shapefile 是行业里流传最广的交换格式,但它的缺点非常具体:一个要素类拆成 .shp、.shx、.dbf、.prj 等多个散文件,拷贝时漏掉任何一个小文件,数据就可能打不开或没有坐标系;字段名被限制在 10 个字节以内,建字段时稍微写长一点就被静默截断;单文件超过 2GB 后行为不可控。老项目里还有一堆由于缺 .prj 文件导致坐标错乱的 shp,处理起来非常费劲。
File Geodatabase(gdb)是 ArcGIS 的原生容器,本质上是一个文件夹,内部可以放多个要素类、栅格数据集、拓扑、域、子类型和关系类。字段名支持到 64 字符,单要素类能到 TB 级,支持版本管理和压缩,而且在 ArcGIS 里预览、检索、复制都比 shp 稳。我一般把 gdb 当作“生产库”,把 shp 当作“出厂交换格式”——对外提供数据时转一份 shp,内部生产、存档、分析全走 gdb。
两者的选型取舍整理成一张表:
| 对比项 | Shapefile | File Geodatabase |
|---|---|---|
| 物理形态 | 多个散文件,容易漏拷 | 单个文件夹,结构整体移动 |
| 字段名限制 | 10 字节,容易被截断 | 64 字符,命名从容 |
| 体积上限 | 单文件约 2GB | 单要素类可到 TB 级 |
| 拓扑/域/子类型 | 不支持 | 原生支持 |
| 适用场景 | 对外交换、跨软件互操作 | 内部生产、长期存档、多人协作 |
| 常见坑 | 缺 .prj 导致坐标丢失 | 版本不兼容:低版本打不开高版本 gdb |
2.3 用 arcpy 批量灌库:从一堆散文件到结构化 gdb
当手头的 shp 数量超过几十个,在界面里一个个导入是在浪费时间。常用做法是用 arcpy 写一个批量导入脚本,把散装 shp 统一收进新的 gdb,顺便完成一次“原始数据入库”。脚本逻辑并不复杂,核心是三个点:先建库,再遍历工作空间里的要素类,最后用 FeatureClassToFeatureClass 转进去。
import arcpy import os # 把工作空间指到存放 shapefile 的原始文件夹 arcpy.env.workspace = r"D:\data_src\shp" # 目标 gdb 的完整路径 target_gdb = r"D:\data_prj\project.gdb" # 目标 gdb 不存在时先创建,避免后续步骤报错 if not arcpy.Exists(target_gdb): arcpy.CreateFileGDB_management( os.path.dirname(target_gdb), os.path.basename(target_gdb) ) # 列出工作空间内所有 shapefile shp_list = arcpy.ListFeatureClasses() for shp in shp_list: out_name = shp.replace(".shp", "") print("正在导入:", shp, "->", out_name) # 第一个参数是源数据,第二个是目标容器,第三个是输出要素类名 arcpy.FeatureClassToFeatureClass_conversion(shp, target_gdb, out_name)这里arcpy.env.workspace决定了 ListFeatureClasses 的扫描范围,也影响后面输出路径的相对解析,建议一律写绝对路径。CreateFileGDB_management的第一个参数是 gdb 要放到的父目录,第二个参数是 gdb 的名字,脚本里用os.path.basename把路径尾段拆出来当名字,避免路径重复。FeatureClassToFeatureClass_conversion的三个关键参数分别是源、目标容器、输出名,输出名和现有要素类重名时默认直接报错,脚本里可以先检查arcpy.Exists(target_gdb + os.sep + out_name)再决定跳过或删除重建。
另一个容易忽略的细节是 shp 文件名里如果有空格、括号、中文,转进 gdb 后名称会原样保留,后续在 SQL 查询和 URL 引用里容易踩坑。我一般会在脚本里顺手做一次名称清洗,把空格替换成下划线。入库之后顺手执行一次arcpy.AddFieldIndex_management给常用关联字段加索引,属性查询速度能明显提升。
3. 坐标参考系:让 ArcGIS 地图数据“对得上”的关键
3.1 地理坐标系与投影坐标系:动态投影的底层逻辑
坐标参考系是 ArcGIS 地图数据里最容易被忽视又最能制造翻车现场的部分。很多人遇到“数据加载到底图上位置出国了”“距离量出来差几十公里”,根子都在坐标系设置上。坐标系分两大类:地理坐标系用经纬度表达位置,是一个球面系统,常见的有 WGS84 和 CGCS2000 的地理坐标形式;投影坐标系把球面展开成平面,单位变成米,常见的有 Web Mercator、高斯-克吕格投影。
ArcGIS 在显示地图时默认执行动态投影:如果源数据的坐标系和地图坐标系的定义都完备,软件在屏幕绘制阶段实时把几何换算到当前坐标框架下显示,源数据本身并未被修改。这一点很多人理解反了,以为在地图里看到的位置正确就代表数据没问题,实际上只要某个数据缺定义、或者定义错了,动态投影会把错的东西“将错就错”地显示出来。
所以处理坐标问题的第一原则:不要在显示层面猜对错,去数据源属性里查坐标系定义。右键要素类打开图层属性,查看源选项卡,能看到完整的地理坐标系或投影坐标系定义以及地理变换信息。拿到数据后先确认这一栏,再谈后续操作。
3.2 常用坐标系怎么选:一张参数对照表
坐标系没有绝对好坏,只有适合场景。给一个我常用的选择依据:
| 数据用途 | 推荐坐标系 | 单位 | 备注 |
|---|---|---|---|
| 在线底图切片、Web 应用 | WGS 1984 Web Mercator (Auxiliary Sphere) | 米 | 全球范围显示友好,但面积变形大 |
| GPS 采集原始数据 | GCS_WGS_1984 | 度 | 记录经纬度,不直接用于精确量算 |
| 省级以下大比例尺制图与分析 | CGCS2000 / 3-degree Gauss-Kruger 对应中央经线 | 米 | 国内标准成果首选,按带选取中央经线 |
| 全国范围小比例尺分析 | CGCS2000 地理坐标 | 度 | 避免跨带投影的拼接问题 |
| 行业历史数据 | 西安80 / 北京54 对应投影 | 米 | 需要先确认转换参数和地理变换 |
这里最容易选错的是高斯-克吕格投影的中央经线。三度带按经度每 3 度分带,中央经线取带的中央位置,比如 120°E 这条中央经线覆盖 118.5°E 到 121.5°E。选错中央经线最典型的现象是数据落在带外,y 坐标异常偏大或偏小,X 坐标出现负值。跨带数据如果直接拼在一起不重投影,图面上会出现不自然的错位和变形。
3.3 坐标错位后的正确纠正顺序
坐标数据错位时,最常见的误操作是一上来就执行投影工具,结果越转越远。正确顺序永远是:先确认源数据实际携带的坐标值是什么坐标系,再确认它定义的坐标系是什么;如果定义错误或缺失,先用“定义投影”修复元数据,之后再执行“投影”做几何换算。
import arcpy arcpy.env.workspace = r"D:\data_prj\project.gdb" # 第一步:给缺失定义的要素类补上正确的坐标系 # 源数据坐标值本身是 WGS84 经纬度,只是缺少 .prj 定义,用 DefineProjection 纠正元数据 sr_wgs84 = arcpy.SpatialReference("WGS 1984") arcpy.DefineProjection_management("road", sr_wgs84) # 第二步:把 WGS84 经纬度换算到 CGCS2000 三度带中央经线 120E 投影 projected_sr = ( 'PROJCS["CGCS2000 / 3-degree Gauss-Kruger CM 120E",' 'GEOGCS["China Geodetic Coordinate System 2000",' 'DATUM["China_2000",SPHEROID["CGCS2000",6378137.0,298.257222101]],' 'PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],' 'PROJECTION["Gauss_Kruger"],' 'PARAMETER["False_Easting",500000.0],' 'PARAMETER["False_Northing",0.0],' 'PARAMETER["Central_Meridian",120.0],' 'PARAMETER["Scale_Factor",1.0],' 'PARAMETER["Latitude_Of_Origin",0.0],' 'UNIT["Meter",1.0]]' ) arcpy.Project_management("road", "road_cgcs2000", projected_sr)SpatialReference("WGS 1984")是通过名称构造坐标系统对象,也可以直接传入 WKID 数字;需要高精度时建议用 WKID,例如 4326 代表 WGS84。DefineProjection_management只重写数据集的坐标系定义,不改变任何坐标数值,所以它只用于“坐标值本来就是某种坐标系但定义缺失”的情况。Project_management才是真正执行几何坐标换算的工具,前两个参数是输入和输出要素类,第三个参数是目标坐标系对象或字符串。
如果源数据是 WGS84 经纬度、目标是中国 2000 坐标系,中间通常还需要一个地理变换参数,因为两者参考椭球不完全重合。不同区域的转换参数不一样,这一点在批量处理时最容易踩坑:一张表的数据用一套参数转了,另一张表参数不同,结果两套数据拼接时出现几十厘米到几米的错位。遇到这种情况,先查看两个坐标系的大地水准面信息,再在 Project 工具里指定合适的地理变换。
4. 符号化与标注:把原始数据变成能交付的地图
4.1 图层符号化:分级渲染和唯一值渲染怎么选
数据入库、坐标正确,这只是完成了“能看的底稿”。到交付前的制图环节,符号化是最耗时间的部分。符号化本质上就是给属性数据“上色”,但选错渲染方式会让整张图失去可读性。唯一值渲染适合类别型字段,比如地类代码、权属单位、道路等级,每个值一种颜色,图例直接对应属性表里的类别;分级渲染适合数值型连续字段,比如人口密度、海拔、地价,把数值范围切成若干等级,用颜色深浅表达高低。
分级数一般控制在 5 到 7 级,太少区分度不够,太多图面被切成花斑。分级方法的选择比很多人想的更重要:
| 分级方法 | 适用场景 | 注意点 |
|---|---|---|
| 自然断点 | 数据分布不均匀、存在明显聚集区间 | 分级边界是数据驱动的,不同数据间图例不可比 |
| 等间距 | 有统一规范标准、数值范围稳定 | 数据集中时大部分区域落在同一级里 |
| 分位数 | 强调每个等级内要素数量均衡 | 个别极端值会被分到不自然的位置 |
4.2 标注与注记:动态标注为什么在出图时翻车
标注是 ArcGIS 地图数据出图时的高频坑。动态标注是实时生成的,随缩放级别自动改变密度和位置,平时浏览很舒服,但一到出图就原形毕露:字压字、字压线、要素重叠时标签互相遮挡。更麻烦的是,动态标注在打印和导出时,不同机器上由于字体和渲染引擎差异,显示结果会走样。
常见做法是出图前把标注转成注记。注记是实际存储在图库里的图形要素,可以逐个调整位置、旋转、字号,排版完全可控,不依赖原数据是否加载。在 ArcGIS Pro 里选中标注图层后,用“将标注转换为注记”功能,选择存入当前地图所在的地理数据库;ArcMap 老项目里也可以在图层右键里找到同类操作。转换后要素类里多出一个注记类,它和原始要素的联动关系断裂,数据一旦改了需要重新转换。
所以我一般建议大家把标注转换当成“出图归档”的一个步骤,不要在日常编辑阶段就转。编辑过程中用动态标注随时看图,正式交付前再转注记并做人工微调,这才是稳妥的流程。
4.3 图层文件与地图文档:配图和数据分离的工作流
配图方案应该和数据分离,这是很多团队没做到的。图层文件(.lyrx 或 .lyr)保存的是符号化方式、透明度、标注设置等显示规则,不保存几何数据;地图文档(.mxd 或 .aprx)保存整个页面的图层组织、范围、布局。如果符号规则被直接做进地图文档里,换个数据源就得重新配一遍,非常低效。
我更推荐的做法是建立一套“符号库”图层文件:不同业务类型各存一份标准 .lyrx,数据更新后直接套用。arcpy 里对应的是套用符号系统工具:
import arcpy # 目标图层数据 target_layer = "road_cgcs2000" # 复用一个已经配好符号的图层文件 symbology_layer = r"D:\data_prj\symbology\road_style.lyrx" arcpy.ApplySymbologyFromLayer_management(target_layer, symbology_layer)ApplySymbologyFromLayer_management会把第二个参数里的符号化规则整体套到第一个参数上,前提是两个图层的字段结构能对应上。字段名不一致时会根据字段名做匹配,如果目标图层缺少源图层符号用到的字段,工具会报错或者丢弃部分规则。因此维护符号库时字段命名要稳定,改字段名会导致一批历史配图失效。这种工作流的好处是换风格只改一个 .lyrx,全项目地图同步更新,不再需要逐张改图。
5. ArcGIS 地图数据常见问题排查:四条血泪经验
5.1 乱码:中文路径与字段编码
现象:数据加载后属性表里的中文变成问号或乱码,导出到 Excel 后文字错乱。
原因:Shapefile 的属性表基于 dBase 格式,代码页信息存在 .cpg 文件或 .dbf 头部的 LDID 字段里。不同 GIS 软件导出 shp 时写入的编码不一致,有的写 GBK,有的写 UTF-8,ArcGIS 读取时按文件头推断失败,就会按默认编码解析导致乱码。中文路径也会触发类似问题,尤其是数据放在带中文名且层级很深的目录里,部分工具链解析失败。
解决:先确认源数据来自哪个软件,用文本编辑器打开 .cpg 文件查看声明的编码;然后统一经由 gdb 中转,把原始 shp 导入 File Geodatabase 后再做字段赋值和导出,避免在散文件阶段反复读 dbf。这个过程中不要直接在原 shp 上另存,否则编码信息会一路带下去。
5.2 坐标偏移:数据“在图上”但“不在该在的位置”
现象:数据加载后和底图大体能对上,但整体偏了上百米甚至几公里,或者局部区域错位明显。
原因:最常见的是数据本来采集自 GPS,坐标值是真经纬度,但定义坐标系时错选成投影坐标系,ArcGIS 把经纬度数值当成平面坐标显示;另一种是投影中央经线选错,导致带外的区域被强行展平,出现系统性偏移。还有一种情况是两个数据源用了不同地理坐标系,ArcGIS 没有自动套用合适的地理变换,只做无变换显示,误差在几十米量级。
解决:按前一章的纠正顺序执行“定义投影 + 投影”,重点核对数据值的量级和范围。经纬度数据的 X 值一般在 70 到 140 之间,而投影坐标的 X 值动辄几十万到上百万,通过这个特征可以快速判断源数据本质。遇到跨带问题,先确认数据落在哪个经度区间,再选择对应的中央经线重新投影。
5.3 字段内容丢失:类型和长度被静默截断
现象:数据导入后,某些字段的小数位消失、长文本内容被截短、ID 前导零丢失。
原因:Shapefile 的 dbf 字段对类型和长度很敏感,浮点字段如果被建成了 float 类型,双精度的小数位会被截断;文本字段建得太短,超过长度的内容直接丢弃;数值型字段存类似“0012”的编号时,前导零被当作纯数字处理,导入后变成 12。这些截断在操作过程里往往毫无提示。
解决:在 gdb 里建字段前明确设置字段类型,金额、面积、坐标等需要精度的字段用 double,短文本要预估长度并多留余量,编号类字段尽量存成文本类型并在输入时就保留前导零。导入外部表数据后加一步字段校验:对比源表与目标表的记录数、非空值数量、关键字段长度,不一致就停下来检查,不要直接进汇编流程。
5.4 换机器后符号化丢失
现象:地图文档在同事电脑上打开,所有图层变成默认样式,或符号颜色全部变样。
原因:地图文档和图层文件里记录的是数据源的绝对路径,换机器后如果目录结构不一致,ArcGIS 找不到数据源,图层显示为空。另外自定义符号库没有一并拷贝,打开时字体和符号缺失,运行环境自动用默认样式替代。
解决:地图文档保存前勾选“存储相对路径”选项,把文档、数据、符号库放在同一个根目录打包拷贝;符号库文件也要随数据一起走。开图发现数据源丢失时,打开图层属性重新指定数据源,不要用“修复数据源”一路点到底,那会把所有图层指到同一个文件上。
6. 进阶:用字段计算与数据验证给地图数据做最终的质检
数据交付之前,我习惯加一道程序化质检,而不是靠肉眼肉眼把地图放大缩小看一圈。质检内容一般包括:字段值域是否合理、是否存在空几何或者无效几何、要素数量与业务台账是否一致、连续面是否有重叠缝隙等。用 arcpy 的数据访问游标可以快速统计这些基础指标。
import arcpy from collections import Counter fc = r"D:\data_prj\project.gdb\road" code_field = "FEATURE_CODE" # 统计字段值分布、无效几何数量、几何总长度 counts = Counter() invalid_geo = 0 total_length = 0.0 with arcpy.da.SearchCursor(fc, [code_field, "SHAPE@"]) as cursor: for row in cursor: counts[row[0]] += 1 shape = row[1] # 空几何在部分数据源里可能出现,单独统计 if shape is None or shape.isNull or not shape.isValid: invalid_geo += 1 continue total_length += shape.length print("字段值统计:", dict(counts)) print("空/无效几何数量:", invalid_geo) print("要素总长度(米):", total_length)这段代码里SearchCursor按字段顺序返回元组,第二项取SHAPE@拿到几何对象;isNull判断几何是否为空,isValid判断拓扑上的有效性。实际项目里无效几何出现最多的地方是手工编辑过的面图层,所以这类质检对成百上千个要素特别有用,跑完直接暴露有问题的要素 FID 范围。
字段计算是质检后的下一步修补动作。要给要素填充面积或周长时,用字段计算器配合 Python 表达式即可,表达式里的!SHAPE.area!会读取当前要素几何的投影面积,必须先确保坐标系是投影坐标系,地理坐标系的面积单位是度,算出来没有业务意义。我更推荐把这类计算写在脚本里闭环执行,和质检一起跑,形成一份“入库 → 质检 → 补算 → 出图”的标准流程。
这些年处理不同来源的数据,最大的教训是:所有问题几乎都是上游数据规范缺失的连锁反应,等到了出图阶段再逐一救火已经来不及。所以现在的习惯是每接手一批数据,先建统一 gdb,再查坐标系,再定符号模板,最后用脚本跑一遍质检再放行。这套流程看着前期费事,但比后期一张张图返工要省得多,希望帮到你。
本文还有配套的精品资源,点击获取