简介:这份西藏路网矢量数据面向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 = r"D:\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 = r"D:\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 = r"D:\xizang_roads\gis_osm_roads_free_1.shp" output_shp = r"D:\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 = r"D:\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 = r"D:\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 = r"D:\xizang_roads\gis_osm_roads_free_1.shp" gdb = r"D:\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 = r"D:\xizang_roads\gis_osm_roads_free_1.shp" kml = r"D:\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 而数据是 WGS84,QGIS 会自动做动态投影,显示上没问题,但量算时要注意单位。
提示:QGIS 里做长度量算时,用 Field Calculator 的
$length函数,返回的单位取决于图层坐标系。WGS84 下返回度,投影坐标系下返回米。量算前先确认坐标系。
5.5 数据更新与版本对比
如果你手上有不同年份的西藏路网数据,可以用「Symmetrical Difference」工具找出新增和消失的路段。操作:把两年数据都投影成同一坐标系,然后做对称差。结果里就能看到哪些路是新建的、哪些路消失了。这个分析对交通规划很有参考价值。
# 对比两个年份的路网差异 import arcpy roads_2020 = r"D:\xizang_roads\roads_2020_albers.shp" roads_2021 = r"D:\xizang_roads\roads_2021_albers.shp" diff_output = r"D:\xizang_roads\roads_diff.shp" arcpy.SymmetricalDifference_analysis(roads_2020, roads_2021, diff_output) print("差异分析完成:", diff_output)SymmetricalDifference_analysis输出的是两个图层不重叠的部分,也就是新增和消失的路段。前提是两个图层坐标系一致、几何类型相同。如果数据量很大,这个操作会比较耗时,建议先按区域裁剪再对比。
5.6 一个我每次都会做的检查习惯
拿到任何一份路网数据,我第一件事不是急着做分析,而是先跑一遍「三查」:查坐标系定义是否正确、查要素数量是否合理、查属性表字段是否完整。这三步跑完,后面基本不会出大问题。尤其是坐标系,一旦搞错,后面所有分析都是白做。从那以后我每次加载新数据都强制走一遍这个检查流程,宁可多花五分钟,也不愿意在出图前发现坐标对不上再返工。希望这份西藏路网数据和上面的操作思路能帮到你,少走一些我当年走过的弯路。
本文还有配套的精品资源,点击获取