
简介这份西藏路网矢量数据面向GIS从业者、交通规划人员及地理信息相关专业师生提供2021年西藏地区城市道路、国道、省道与高速公路的完整空间数据可直接用于地图可视化、空间查询、网络分析与叠加分析等场景。压缩包共5个文件约16.14MB以shapefile核心格式为主shp存储道路几何形状dbf保存道路名称、类型、等级等属性shx提供索引加速检索prj明确采用WGS84坐标系xml记录元数据与来源信息各文件配合构成一套可直接加载的完整数据集。目前已有347人学习下载。借助ArcGIS等软件读者可快速生成高精度路网地图计算最短路径与交通可达性对比不同年份分析路网演变或与人口、地形等数据叠加研究交通与社会经济关系是开展西藏交通规划、灾害响应与旅游研究的实用基础资料。1. 西藏路网矢量数据一份能直接进 ArcGIS 的 WGS84 底图如果你正在找一份能直接拖进 ArcGIS 或 QGIS 就能用的西藏路网底图又不想花半天时间去处理坐标系偏移、字段乱码、几何自相交这些破事那这份 2021 年的西藏路网矢量数据值得先看一眼。它是一套标准的 Esri Shapefile坐标系是 WGS84 地理坐标系覆盖城市道路、国道、省道、高速公路等类型属性表里带着道路等级、名称这些字段。拿到手解压就是六个文件不用装插件、不用转格式双击 .shp 就能加载。适合做交通规划、可达性分析、专题制图也适合拿来做 ArcSWAT 小流域分析时的道路底图。但要注意它是 WGS84 经纬度坐标不是投影坐标直接量算长度会得到度数而不是米这是新手最容易翻车的地方。2. 拆开压缩包六个文件各管什么为什么少一个都不行2.1 Shapefile 不是单个文件是一组文件的集合很多人第一次接触 shp 会以为它就是一个文件其实 Shapefile 是一种多文件格式至少需要 .shp、.shx、.dbf 三个文件同时存在才能正常打开。这份数据里六个文件的分工是这样的文件作用缺失后果gis_osm_roads_free_1.shp存储道路几何线要素没有图形打不开gis_osm_roads_free_1.shx几何索引加速定位能打开但查询变慢部分软件报错gis_osm_roads_free_1.dbf属性表存道路名称、类型、等级有图形但没属性无法分类渲染gis_osm_roads_free_1.prj坐标系定义声明为 WGS84坐标系未定义叠加时对不上gis_osm_roads_free_1.shp.xml元数据记录来源、创建信息不影响加载但丢失溯源信息.prj 文件尤其关键。它里面通常只有一行文本类似GEOGCS[GCS_WGS_1984,DATUM[D_WGS_1984,SPHEROID[WGS_1984,6378137.0,298.257223563]],PRIMEM[Greenwich,0.0],UNIT[Degree,0.0174532925199433]]。这行东西决定了 ArcGIS 怎么理解你的坐标。如果这个文件丢了ArcGIS 会提示「坐标系未定义」你叠加其他图层时就会看到路网飘到海里去了。2.2 在 ArcGIS 里加载并确认坐标系加载步骤不复杂但确认坐标系这一步不能省。打开 ArcGIS Pro 或 ArcMap用 Add Data 把 .shp 加进来然后右键图层 → Properties → Source看 Spatial Reference 那一栏是不是 GCS_WGS_1984。如果是 Unknown说明 .prj 没被识别需要手动定义。# ArcPy 快速检查 shp 坐标系与要素数量 import arcpy shp rD:\xizang_roads\gis_osm_roads_free_1.shp # 读取坐标系信息 desc arcpy.Describe(shp) print(坐标系:, desc.spatialReference.name) print(坐标系类型:, desc.spatialReference.type) # Geographic 表示地理坐标系 # 统计要素数量 count int(arcpy.GetCount_management(shp).getOutput(0)) print(道路要素总数:, count) # 列出属性表字段 fields [f.name for f in arcpy.ListFields(shp)] print(字段列表:, fields)这段代码做了三件事读坐标系名称、数要素总数、列字段名。desc.spatialReference.type返回 Geographic 就说明是经纬度坐标不是投影坐标。字段列表里一般能看到fclass道路类型、name道路名称、oneway单行道这些 OSM 标准字段。跑完这一步你对数据的底细就有数了。2.3 按道路等级分类渲染属性表里的fclass字段是分类的关键。常见取值包括 motorway高速公路、trunk国道、primary省道、secondary、tertiary、residential城市道路等。在 ArcGIS 里做分级渲染右键图层 → Symbology → Unique Values → 选 fclass 字段 → 给每类配不同颜色和线宽。高速公路用红色粗线国道用橙色省道用黄色城市道路用灰色细线这样出图层次感就出来了。# 按 fclass 字段统计各类道路数量 import arcpy from collections import Counter shp rD:\xizang_roads\gis_osm_roads_free_1.shp fclass_counts Counter() with arcpy.da.SearchCursor(shp, [fclass]) as cursor: for row in cursor: fclass_counts[row[0]] 1 for k, v in fclass_counts.most_common(): print(f{k}: {v})arcpy.da.SearchCursor比老式 SearchCursor 快很多处理大图层时差别明显。Counter用来快速汇总。跑完你就能知道这份数据里高速公路有多少条、城市道路有多少条心里有底再决定怎么分层。3. 坐标系这件事WGS84 能直接用但不能直接量3.1 地理坐标系和投影坐标系的本质区别WGS84 是地理坐标系单位是度。你看到的坐标值大概是经度 78° 到 99°、纬度 26° 到 36° 这个范围。这种坐标适合存储和交换但不适合量算。因为经纬度不是等距的同样一度经度在赤道和在高纬度对应的实际距离完全不同。西藏纬度跨度大直接用经纬度算长度误差能到百分之几十。常见做法是保留原始 WGS84 数据不动另存一份投影后的数据专门用来量算。投影选 UTM 或者 Albers 等积投影。西藏跨 UTM 43N 到 46N 几个带如果做全区分析用 Albers 更合适设中央经线 87°E双标准纬线 27°N 和 36°N。# 把 WGS84 地理坐标投影为 Albers 等积投影用于面积和长度量算 import arcpy input_shp rD:\xizang_roads\gis_osm_roads_free_1.shp output_shp rD:\xizang_roads\roads_albers.shp # 自定义 Albers 投影中央经线 87E标准纬线 27N/36N albers arcpy.SpatialReference() albers.loadFromString( PROJCS[Xizang_Albers, GEOGCS[GCS_WGS_1984,DATUM[D_WGS_1984, SPHEROID[WGS_1984,6378137.0,298.257223563]], PRIMEM[Greenwich,0.0],UNIT[Degree,0.0174532925199433]], PROJECTION[Albers], PARAMETER[False_Easting,0.0], PARAMETER[False_Northing,0.0], PARAMETER[Central_Meridian,87.0], PARAMETER[Standard_Parallel_1,27.0], PARAMETER[Standard_Parallel_2,36.0], PARAMETER[Latitude_Of_Origin,0.0], UNIT[Meter,1.0]] ) arcpy.Project_management(input_shp, output_shp, albers) print(投影完成:, output_shp)Project_management是 ArcGIS 里做投影变换的标准工具。loadFromString里定义的 Albers 参数是针对西藏范围调的中央经线取 87°E 基本在西藏中间双标准纬线 27°N 和 36°N 覆盖了主要区域这样投影变形最小。投影后单位变成米再去算道路长度、做缓冲区分析就准了。3.2 为什么不能直接在 ArcGIS 里改坐标系热搜里有人问「arcgis 无法更改坐标系」这其实是个常见误解。在 ArcGIS 里右键图层 → Properties → 改坐标系那个操作叫「定义投影」不是「投影变换」。定义投影只是给数据贴个标签不改变坐标值。如果你给一份 WGS84 数据硬贴上投影坐标系的标签坐标值还是经纬度但软件以为它是米结果就是数据飞到天边去了。正确做法是两步走先确认原始坐标系定义正确.prj 文件在不在、内容对不对再用 Project 工具做真正的投影变换。顺序不能反反了就是血泪经验。提示如果 .prj 丢失先用 Define Projection 工具补上 WGS84 定义再用 Project 做变换。两步分开执行不要合并。3.3 叠加分析前的坐标系对齐检查做叠加分析之前所有图层的坐标系必须一致。比如你有一份人口分布数据是投影坐标路网是 WGS84直接叠加要么报错要么结果错位。检查方法在 ArcGIS 里把两个图层都加进来看它们是否重合。如果不重合用 Project 把其中一个转成和另一个一致。# 批量检查文件夹内所有 shp 的坐标系 import arcpy, os folder rD:\xizang_roads for f in os.listdir(folder): if f.endswith(.shp): desc arcpy.Describe(os.path.join(folder, f)) print(f{f} - {desc.spatialReference.name})这段脚本遍历文件夹里所有 shp打印坐标系名称。做多源数据整合之前跑一遍能省掉很多「为什么叠不上」的排查时间。4. 避坑与排查路网数据加载中最容易翻车的五个点4.1 中文属性乱码现象打开属性表道路名称字段显示成乱码或者问号。原因.dbf 文件的字符编码和 ArcGIS 默认编码不匹配。OSM 导出的 dbf 常见是 UTF-8但 ArcGIS 在某些系统环境下默认按 GBK 读。解决在 ArcGIS Pro 里用「Convert Encoding」工具把 dbf 转成 UTF-8或者在注册表里改 dbf 默认编码。QGIS 用户一般不会遇到这个问题因为 QGIS 会自动检测编码。4.2 坐标系显示为 Unknown现象图层加载后 Properties 里 Spatial Reference 显示 Unknown。原因.prj 文件缺失或内容为空。解决如果确认数据本身是 WGS84用 Define Projection 工具手动指定 GCS_WGS_1984。注意这一步只是补定义不做变换。补完之后再检查坐标值范围是否合理经度 78-99纬度 26-36如果超出这个范围说明数据本身有问题。4.3 道路线要素断裂、不连续现象放大看路网发现本该连续的道路中间断了。原因OSM 数据本身按路段存储交叉口处会打断这是正常现象。解决如果做网络分析需要连续路网用「Integrate」工具配合合适的容差把端点吸附到一起或者用「Unsplit Line」按道路名称合并。但要注意Integrate 会修改原始数据操作前先备份。4.4 投影变换后位置偏移现象投影之后路网整体偏移了几百米。原因投影参数选错了比如中央经线设成了 0 或者标准纬线设成了赤道。解决西藏范围用 Albers 时中央经线设 87°E 左右UTM 的话确认带号是 43N-46N。参数改对之后重新投影不要在原结果上反复投影每次投影都会引入微小误差。4.5 大数据量下 ArcGIS 卡顿现象加载全区路网后缩放、平移明显卡顿。原因西藏路网要素数量可能上万ArcGIS 默认渲染全部要素。解决建金字塔Pyramid和空间索引或者在图层属性里设置比例尺范围小比例尺下只显示高速公路和国道放大到一定级别再显示城市道路。另一个办法是按区域裁剪只加载你实际需要的范围。# 为 shp 建立空间索引提升查询和渲染速度 import arcpy shp rD:\xizang_roads\gis_osm_roads_free_1.shp arcpy.AddSpatialIndex_management(shp) print(空间索引已建立)AddSpatialIndex_management会给 shp 生成 .sbn 和 .sbx 索引文件查询和渲染速度会有明显提升。数据量越大效果越明显。5. 从路网到分析结果几个能直接套用的进阶操作5.1 用 Network Analyst 做最短路径ArcGIS 的 Network Analyst 模块可以直接基于路网数据建网络数据集。步骤把 shp 导入地理数据库File Geodatabase在要素数据集上右键 → New → Network Dataset按向导走完。建好之后就可以做最短路径、服务区分析、OD 成本矩阵。注意 shp 格式不支持网络数据集必须先转成地理数据库要素类。# 把 shp 导入文件地理数据库为网络分析做准备 import arcpy shp rD:\xizang_roads\gis_osm_roads_free_1.shp gdb rD:\xizang_roads\xizang.gdb fc_name roads # 创建文件地理数据库如果不存在 import os if not arcpy.Exists(gdb): arcpy.CreateFileGDB_management(os.path.dirname(gdb), os.path.basename(gdb)) # 导入 shp arcpy.FeatureClassToFeatureClass_conversion(shp, gdb, fc_name) print(已导入:, os.path.join(gdb, fc_name))FeatureClassToFeatureClass_conversion是最常用的 shp 转 gdb 工具。转完之后字段类型、编码都会更规范也支持更多 ArcGIS 高级功能。网络数据集、拓扑、子类型这些只能在 gdb 里用shp 不支持。5.2 按道路等级做缓冲区分析缓冲区分析常用来评估道路影响范围。比如做高速公路 500 米缓冲区看周边有多少村庄。操作Analysis Tools → Proximity → Buffer选路网图层距离设 500 米。注意如果数据还是 WGS84 经纬度Buffer 工具的距离单位是度不是米。必须先投影再缓冲否则结果完全不对。5.3 导出为 KML 在 Google Earth 里查看有时候需要把路网发给非 GIS 同事看导出 KML 是最省事的办法。ArcGIS 里用「Layer to KML」工具QGIS 里右键图层 → Export → Save Features As → KML。注意 KML 只支持 WGS84 经纬度如果你的数据已经投影成米了导出前先转回 WGS84。# 导出路网为 KML import arcpy shp rD:\xizang_roads\gis_osm_roads_free_1.shp kml rD:\xizang_roads\roads.kml arcpy.LayerToKML_conversion(shp, kml) print(KML 已导出:, kml)LayerToKML_conversion要求输入是 WGS84 坐标。如果数据已经投影过先用 Project 转回 GCS_WGS_1984 再导出。导出的 KML 可以直接在 Google Earth 里打开线宽和颜色会保留基本样式。5.4 用 QGIS 快速预览和出图不是所有人都有 ArcGIS 授权QGIS 是免费的替代方案。加载 shp 后QGIS 会自动识别 .prj 里的坐标系。用「Layer Styling」面板做分类渲染用「Print Layout」出图。QGIS 的 XYZ Tiles 可以加载在线底图但要注意底图坐标系和你的数据是否一致。如果底图是 Web Mercator 而数据是 WGS84QGIS 会自动做动态投影显示上没问题但量算时要注意单位。提示QGIS 里做长度量算时用 Field Calculator 的$length函数返回的单位取决于图层坐标系。WGS84 下返回度投影坐标系下返回米。量算前先确认坐标系。5.5 数据更新与版本对比如果你手上有不同年份的西藏路网数据可以用「Symmetrical Difference」工具找出新增和消失的路段。操作把两年数据都投影成同一坐标系然后做对称差。结果里就能看到哪些路是新建的、哪些路消失了。这个分析对交通规划很有参考价值。# 对比两个年份的路网差异 import arcpy roads_2020 rD:\xizang_roads\roads_2020_albers.shp roads_2021 rD:\xizang_roads\roads_2021_albers.shp diff_output rD:\xizang_roads\roads_diff.shp arcpy.SymmetricalDifference_analysis(roads_2020, roads_2021, diff_output) print(差异分析完成:, diff_output)SymmetricalDifference_analysis输出的是两个图层不重叠的部分也就是新增和消失的路段。前提是两个图层坐标系一致、几何类型相同。如果数据量很大这个操作会比较耗时建议先按区域裁剪再对比。5.6 一个我每次都会做的检查习惯拿到任何一份路网数据我第一件事不是急着做分析而是先跑一遍「三查」查坐标系定义是否正确、查要素数量是否合理、查属性表字段是否完整。这三步跑完后面基本不会出大问题。尤其是坐标系一旦搞错后面所有分析都是白做。从那以后我每次加载新数据都强制走一遍这个检查流程宁可多花五分钟也不愿意在出图前发现坐标对不上再返工。希望这份西藏路网数据和上面的操作思路能帮到你少走一些我当年走过的弯路。本文还有配套的精品资源点击获取