简介这份资源是面向ArcGIS用户的南京市矢量地理数据集适合从事城市规划、交通分析、环境评估等工作的GIS学习者与从业者使用。数据以Shapefile格式组织涵盖建筑、道路网、水系、绿地、地铁、铁路、各级公路及行政边界等要素可直接在ArcGIS中编辑、查询与制图用于空间建模、路径规划和土地分析等任务。压缩包共106个文件约43.19MB包含shp几何数据、dbf属性表、shx索引、prj投影定义以及sbn、sbx空间索引和cpg编码文件另附一个xml元数据结构完整便于直接加载使用。目前已有2804人学习下载说明该数据在城市地理研究中具有一定参考价值。读者可借助这份数据快速搭建南京本地分析底图完成建筑与路网提取、水系绿地统计、投影转换等操作为课程作业、论文研究或项目实践提供可靠的空间数据支撑。1. 南京市shp数据在ArcGIS里到底怎么用从拿到文件到出第一张图很多人第一次拿到「南京市shp数据」这类资源时会下意识双击打开结果要么是 ArcGIS 报「缺少 .prj 文件」要么是图层叠上去位置偏到太平洋。这不是数据坏了而是 Shapefile 这个格式本身的特性决定的——它从来不是「一个文件」而是一组同名文件的集合。南京作为长三角核心城市行政区划、路网、水系、POI 这些矢量数据在规划、选址、通勤分析里被反复调用而 ArcGIS 又是这类工作最主流的桌面工具。这篇笔记面向的是手上已经有一份南京 shp 数据、想把它在 ArcGIS 里跑通并做出实际分析的人不管你是刚接触 GIS 的学生还是需要快速出图的从业者下面从文件结构、坐标系、加载、属性处理到空间分析一步步拆开讲重点放在参数怎么设、坑在哪。2. 先搞懂 Shapefile 的文件结构和南京数据的常见组织方式2.1 一个 shp 其实是六个文件在配合Shapefile 是 Esri 早年定的一套开放格式核心特点是「一个图层拆成多个物理文件」。你看到的nanjing.shp只是几何图形真正让 ArcGIS 能正确读取的是同一目录下同名的一整套文件。缺任何一个轻则属性丢失重则直接打不开。扩展名作用缺失后果.shp存储几何形状点/线/面图层无法显示.shx几何索引加速定位ArcGIS 报错或读取极慢.dbf属性表字段、记录有图形无属性属性表为空.prj坐标系定义WKT 文本坐标未知叠加错位.cpg.dbf 的字符编码说明中文属性乱码.sbn/.sbx空间索引可选不影响打开只影响查询速度南京数据里最常见的组织方式是按行政区划分层nanjing_district.shp区县面、nanjing_road.shp路网线、nanjing_water.shp水系面、nanjing_poi.shp兴趣点。有些来源会把全市和分区混在一个目录文件名带拼音或英文缩写这时候先别急着加载用文件管理器按扩展名排序看一眼确认每组同名文件是否齐全。2.2 坐标系南京数据最容易翻车的地方南京地处东经 118°~119°、北纬 31°~32°这个位置决定了它常用的坐标系有两类地理坐标系 WGS84经纬度单位度和投影坐标系 CGCS2000 3 度带单位米。ArcGIS 里如果 .prj 缺失或写错图层会以「未知坐标系」加载此时它按经纬度数值直接当平面坐标画位置必然错。判断方法很直接打开图层属性看范围。如果 X 范围在 118 附近、Y 在 31 附近那是地理坐标系如果 X 是 6 位数如 400000 左右、Y 是 7 位数如 3500000 左右那是投影坐标系。南京常用的 CGCS2000 3 度带中央经线为 117°E 或 120°E对应带号 39 或 40EPSG 分别是 4547 和 4548 这一类。实际项目里我一般会先统一到 CGCS2000 投影坐标再做面积、距离计算因为地理坐标系下算出来的「度」没有物理意义。提示如果 .prj 缺失但你确定数据是 WGS84 经纬度可以用 ArcGIS 的「定义投影」工具补上注意是「定义」不是「投影」——前者只写元数据不改坐标后者会真正做坐标转换用错工具会把数据彻底搞偏。2.3 加载前的目录整理习惯我习惯在加载前把数据整理成一个干净的工作目录避免 ArcGIS 在中文路径或超长路径下出问题。南京数据文件多建议这样组织# 建议的目录结构在资源管理器里手动建也行 nanjing_gis/ ├── raw/ # 原始数据只读不改 │ ├── district/ │ │ ├── nanjing_district.shp │ │ ├── nanjing_district.shx │ │ ├── nanjing_district.dbf │ │ ├── nanjing_district.prj │ │ └── nanjing_district.cpg │ ├── road/ │ └── water/ ├── work/ # 处理后的中间数据 └── output/ # 出图、导出结果这段不是代码是目录约定。逻辑很简单raw 目录只读任何裁剪、投影转换的结果都写到 work最终成果放 output。这样做的好处是一旦某步操作把数据改坏了直接回 raw 重来不用重新找数据。参数上唯一要注意的是路径不要有空格和特殊字符ArcGIS 对这类路径的兼容性时好时坏血泪经验是能用英文短路径就别用中文长路径。3. 在 ArcGIS 里加载南京 shp 并做第一轮检查3.1 加载与坐标系确认的具体操作打开 ArcGIS Pro 或 ArcMap用「添加数据」把nanjing_district.shp加进来。加载后第一件事不是急着符号化而是右键图层 → 属性 → 源看「空间参考」这一栏。如果显示的是具体坐标系名称说明 .prj 被正确读取如果显示「未知」就得回到 2.2 的方法处理。确认坐标系后做一个快速验证把南京的区县面和路网线叠在一起看路网是否落在面的范围内。如果路网整体偏移到面外八成是两个图层的坐标系不一致。这时候不要手动挪用「投影」工具把其中一个转到另一个的坐标系。# ArcPy 批量检查目录下所有 shp 的坐标系在 ArcGIS 的 Python 窗口运行 import arcpy import os workspace rD:\nanjing_gis\raw arcpy.env.workspace workspace # 遍历所有 shp打印其空间参考名称 for shp in arcpy.ListFeatureClasses(*.shp): desc arcpy.Describe(shp) sr desc.spatialReference print(f{shp}: {sr.name} | 类型: {sr.type})这段脚本的作用是批量摸清每个图层的坐标系避免逐个右键查看。arcpy.env.workspace设定工作目录后ListFeatureClasses只返回该目录下的 shp。Describe拿到图层的元数据spatialReference.name给出坐标系名称type区分是地理坐标系还是投影坐标系。参数上把workspace换成你自己的 raw 目录即可。如果打印出「Unknown」说明该图层 .prj 缺失需要单独处理。3.2 属性表的中文乱码与字段检查南京数据的属性表里通常有「区县名称」「道路名称」这类中文字段。如果打开属性表看到乱码问题出在 .cpg 文件缺失或编码声明不对。Shapefile 的 .dbf 默认用系统编码中文环境下常见的是 GBK 或 UTF-8。解决办法是手动建一个同名 .cpg 文件里面写UTF-8或GBK保存后重新加载。# 为缺失 cpg 的 shp 批量补写 UTF-8 编码声明 import os folder rD:\nanjing_gis\raw\district for f in os.listdir(folder): if f.endswith(.dbf): cpg_path os.path.join(folder, f.replace(.dbf, .cpg)) if not os.path.exists(cpg_path): with open(cpg_path, w, encodingutf-8) as fp: fp.write(UTF-8) print(f已补写: {cpg_path})逻辑说明遍历目录下所有 .dbf检查对应 .cpg 是否存在不存在就写一个内容为UTF-8的文本文件。参数上如果你的数据实际是 GBK 编码把UTF-8改成GBK。判断依据是补写后重新加载属性表中文正常显示即为正确如果还是乱码换另一种编码再试。这一步看似小但不做的话后续按名称筛选、做标注都会受影响。3.3 用「按位置选择」快速验证数据可用性加载完区县面和路网后做一个简单验证选中某个区比如鼓楼区看落在它范围内的道路有多少条。操作是「选择」→「按位置选择」目标图层选路网源图层选区县面空间关系选「相交」。如果选出来的道路数量合理不是 0 也不是全部说明两个图层的坐标系和空间位置是对齐的。这一步的价值在于它用一次交互就同时验证了坐标系一致性、几何完整性和属性可用性。如果选出来是 0先查坐标系如果是全部说明路网可能是一个覆盖全市的大图层需要进一步用「裁剪」工具按区提取。参数上「按位置选择」的空间关系有十几种最常用的是「相交」「包含」「完全包含」做区县筛选时用「相交」即可。4. 南京 shp 数据的常见处理裁剪、投影转换与字段计算4.1 按行政区裁剪出子区域数据拿到全市数据后实际分析往往只关心某个区。用「裁剪」工具输入要素选路网或水系裁剪要素选区县面输出到 work 目录。裁剪后的数据只保留落在该区范围内的几何。# 按指定区县名称裁剪路网数据 import arcpy arcpy.env.workspace rD:\nanjing_gis\raw out_folder rD:\nanjing_gis\work # 从区县面中筛选出目标区 district_lyr arcpy.management.MakeFeatureLayer( nanjing_district.shp, district_lyr ) arcpy.management.SelectLayerByAttribute( district_lyr, NEW_SELECTION, NAME 鼓楼区 ) # 用选中的面裁剪路网 arcpy.analysis.Clip( nanjing_road.shp, district_lyr, out_folder r\road_gulou.shp ) print(裁剪完成)逻辑说明先用MakeFeatureLayer建一个临时图层再用SelectLayerByAttribute按属性选出目标区最后用Clip裁剪。参数上NAME 鼓楼区里的字段名和值要换成你数据里实际的字段和区名字段名大小写敏感。如果属性表里区名带「区」字就写全如果只有「鼓楼」就去掉「区」。裁剪结果的坐标系默认跟随输入要素这里跟随路网所以裁剪前最好确保路网和区县面坐标系一致。4.2 投影转换从经纬度到米制坐标如果原始数据是 WGS84 经纬度做面积统计或距离计算前要转成投影坐标。用「投影」工具输出坐标系选 CGCS2000 3 度带对应的 EPSG。南京跨 117°E 和 120°E 两个中央经线具体用哪个取决于你的数据范围偏西的区用 117°E偏东的用 120°E全市范围建议统一用一个带或者用 CGCS2000 的全市通用投影。# 将经纬度数据投影为 CGCS2000 3 度带中央经线 120E import arcpy arcpy.env.workspace rD:\nanjing_gis\raw out_coor arcpy.SpatialReference(4548) # CGCS2000 3-degree Gauss-Kruger CM 120E arcpy.management.Project( nanjing_district.shp, rD:\nanjing_gis\work\district_projected.shp, out_coor ) print(投影完成)逻辑说明SpatialReference(4548)用 EPSG 码直接构造目标坐标系避免手动填参数出错。Project工具做真正的坐标转换几何坐标会从度变成米。参数上4548 对应中央经线 120°E如果你的数据偏西换成 4547117°E。转换后检查图层范围X 应该在 6 位数、Y 在 7 位数且数值量级和南京实际地理位置吻合。这一步做完后续算面积、算长度才是可信的。4.3 字段计算面积、长度与人口密度投影转换后给区县面加一个面积字段用「计算几何」算平方米再换算成平方公里。给路网加长度字段同理。如果属性表里有人口数据还能算人口密度。# 为投影后的区县面添加面积字段并计算单位平方公里 import arcpy fc rD:\nanjing_gis\work\district_projected.shp # 添加字段 arcpy.management.AddField(fc, Area_km2, DOUBLE) # 计算面积先算平方米再除以 1e6 with arcpy.da.UpdateCursor(fc, [SHAPEAREA, Area_km2]) as cursor: for row in cursor: row[1] row[0] / 1e6 cursor.updateRow(row) print(面积计算完成)逻辑说明AddField加一个双精度字段UpdateCursor逐行读取几何面积SHAPEAREA单位是投影坐标系的平方即平方米除以 1e6 得到平方公里。参数上字段类型用DOUBLE保证精度字段名避免用中文以防兼容问题。这一步的前提是数据已经投影到米制坐标系如果还是经纬度SHAPEAREA算出来的是平方度没有意义。算完可以按面积排序快速看出哪个区最大和常识对照一下能发现数据是否有问题。5. 避坑与排查南京 shp 在 ArcGIS 里最常遇到的五个问题5.1 图层加载后位置偏移到国外现象南京的数据加载后图形跑到经度 0 附近或纬度 0 附近。原因.prj 缺失ArcGIS 按未知坐标系处理把经纬度数值当平面坐标画。解决确认数据实际坐标系后用「定义投影」补上正确的 .prj不要用「投影」工具后者会做坐标转换导致二次偏移。5.2 属性表中文全是问号或乱码现象属性表里中文字段显示为???或方块。原因.dbf 的编码和 ArcGIS 读取时用的编码不一致通常是 .cpg 缺失。解决按 3.2 的方法补写 .cpg内容试UTF-8或GBK重新加载。如果补写后仍乱码用「转换表格」导出为 CSV在外部工具里确认实际编码再回填。5.3 裁剪结果为空或只有零星几个要素现象用区县面裁剪路网输出图层没有要素。原因两个图层坐标系不一致空间上根本不重叠或者选区时属性值写错没选中任何面。解决先用 3.1 的脚本确认两个图层坐标系一致再用 3.3 的按位置选择验证空间关系最后检查属性查询语句里的字段名和值是否和数据完全匹配。5.4 面积或长度算出来数量级离谱现象区县面积算出几万甚至几百万或者小到 0.00 几。原因数据还是地理坐标系SHAPEAREA算的是平方度或者投影时选错了带号导致比例失真。解决先确认数据已投影到米制坐标系检查图层范围的数值量级南京的区面积一般在几十到几百平方公里超出这个范围就要回头查投影。5.5 大数据量下 ArcGIS 卡死或崩溃现象加载全市精细路网后缩放、选择操作极慢甚至无响应。原因Shapefile 没有空间索引或者 .shx 缺失ArcGIS 每次操作都要全表扫描。解决用「添加空间索引」工具补建索引或者把数据导入文件地理数据库.gdb后者在 ArcGIS 里的读写效率明显高于 shp。参数上索引建好后查询速度会有肉眼可见的提升这是处理南京这种大城市数据时的常规操作。6. 进阶技巧用 ArcGIS 做南京数据的批量出图与成果校验前面几步跑通后真正提效的地方在批量处理和成果校验。南京有十几个区如果每个区都要单独出一张图手动操作一遍要半天。用 ArcPy 的DataDrivenPages或者循环导出可以把这个过程压到几分钟。下面这段是循环按区导出地图的简化写法核心思路是遍历区县属性逐个设置定义查询再导出。# 按区县批量导出地图需先在 ArcGIS Pro 里配好布局 import arcpy aprx arcpy.mp.ArcGISProject(rD:\nanjing_gis\project.aprx) layout aprx.listLayouts(南京出图)[0] map_frame layout.listElements(MAPFRAME_ELEMENT, 主图框)[0] lyr map_frame.map.listLayers(nanjing_district)[0] districts [r[0] for r in arcpy.da.SearchCursor( rD:\nanjing_gis\work\district_projected.shp, NAME )] for d in districts: lyr.definitionQuery fNAME {d} layout.exportToPDF( rfD:\nanjing_gis\output\{d}.pdf, resolution300 ) print(f已导出: {d})逻辑说明先拿到工程、布局、地图框和区县图层用SearchCursor读出所有区名循环设置图层的定义查询只显示当前区再导出 PDF。参数上resolution300是打印级精度屏幕浏览用 150 就够。定义查询的字段名和值同样要和你数据匹配。这段脚本的前提是布局已经配好包括图例、比例尺、指北针脚本只负责换区和导出。成果校验我一般做两件事一是把导出的 PDF 抽几张和原始数据对照看区界、路网是否完整二是用「要素统计」核对每个区的要素数量和裁剪前的总数做加和比对差太多说明裁剪或筛选有遗漏。这个习惯是从一次翻车经历来的——当时批量出图忘了重置定义查询结果所有图都是同一个区交出去才发现。从那以后凡是循环操作我都会在循环结束后加一句重置查询或者用独立的图层副本避免状态残留。另一个值得养成的习惯是所有中间数据都保留坐标系和来源信息。可以在属性表里加一个Source字段记录数据来源和投影参数过几个月回头看还能说清楚这份南京数据是怎么来的。ArcGIS 的元数据功能也能做这件事但手动加字段更直接。做到这一步南京 shp 数据在 ArcGIS 里的整套流程就算闭环了从文件结构、坐标系、加载检查到裁剪投影、字段计算再到批量出图和校验每一步都有可复现的操作和明确的排错方向。希望帮到你。本文还有配套的精品资源点击获取