简介:深圳市道路矢量数据包面向地理信息科学与城乡规划领域的学习者与从业者,适用于道路网络可视化、缓冲区分析、路径规划等典型 GIS 场景,也可作为 shp 矢量格式与属性表操作的入门练习素材。压缩包共 15 个文件,以 shp、dbf、prj、shx 等核心类型为主,其中 shp 存储几何要素,dbf 记录道路属性,prj 保证坐标系信息,sbn/sbx 为空间索引,另有说明文本与示意图辅助理解,整体约 1.22MB,小巧便于下载。目前已有 2147 人浏览学习,数据可直接导入 ArcGIS、QGIS 等平台查看,无需额外配置。这套数据提供完整的深圳市道路矢量样例,能帮助用户快速厘清 shp 文件组的构成机制,并在此基础上开展数据裁剪、字段编辑、风格渲染、出图制表等实务演练,是进行城市道路数据分析和 GIS 技能提升的实用素材。
1. 拿到数据包先别急:先看清zip里到底装了什么
做GIS的朋友应该都有过这种经历:好不容易从某个公开平台或行业群里下到一个“深圳市道路矢量数据shp.zip”,解压完一看,一堆后缀名各异的小文件躺在文件夹里,懒得细看就直接拖进ArcMap,结果要么属性表打不开,要么图形位置跑到非洲去,要么压根儿加载不出来。这篇文章就围绕这类数据包,把从解压到能正常出图、做分析的完整流程捋一遍。
先回答一个最基础的问题:这个zip里到底有什么?叫“shp.zip”只是压缩包的命名习惯,实际上它装的不是单个文件,而是一整套Shapefile文件组。Shapefile是ESRI在90年代推出的矢量数据格式,它有个鲜明的特点——同一份数据必须由多个文件共同构成,缺一个都不行。最常见的文件组包括:
- .shp:几何信息,记录道路线、面或点的坐标位置;
- .shx:几何索引文件,负责让软件快速定位到某条要素;
- .dbf:属性表,存放道路名称、等级、宽度、类型等字段;
- .prj:坐标系描述,记录这份数据用的投影和基准面;
- .cpg:字符编码声明,常见的是UTF-8或GBK;
- .sbn / .sbx / .ain / .aih:空间索引文件,做大数据量查询时会生成。
很多人只看到.zip,习惯性地把里面的.shp单独拷出来发给同事,结果对方打开后提示“文件不支持”或“属性表是空的”。这不是数据坏了,而是你扔掉了它的“身份证”——.dbf和.prj。shp文件必须和它同名的兄弟文件放在同一目录下才能正常工作,拷的时候要么整个文件夹打包,要么把整个文件组一起拷贝,这是新手做GIS数据交接时最容易踩的第一个坑。
那深圳市道路数据具体长什么样?以我接触过的多个公开版本为例,多数数据集至少包含道路中心线(Polyline)类型,部分精细版本还会带道路面(Polygon)、交叉口节点(Point)、匝道连接线等。属性字段一般包括:道路等级(高速、快速、主干、次干、支路)、道路名称、路段长度、车道数、起始点地名等。这些字段决定了你后续做制图符号化、交通分析、路网密度计算时能不能直接用,后面会展开讲。
2. 坐标系:最容易被忽略但影响最大的第一步
很多人在处理这类数据时第一个念头就是“打开看看”,但我的建议是先看**.prj文件**,因为它决定了所有后续操作的正确性。
2.1 怎么判断这份数据是什么坐标系
最简单的办法是用记事本打开.shp同名的.prj文件。如果看到的是“GCS_WGS_1984”或“GCS_China_Geographic_Coordinate_System_2000”这类描述,说明数据是地理坐标系,单位是度;如果看到“CGCS2000_3_Degree_GK_Zone_39”或“WGS_1984_UTM_Zone_50N”这样的字眼,说明是投影坐标系,单位是米。
深圳位于东经113°46′至114°37′、北纬22°27′至22°52′之间。以CGCS2000地理坐标系为基准,按3度分带属于38带或39带(中央经线114°和117°),按6度分带属于20带(中央经线117°);如果按UTM分带则是49N或50N。不同网站、不同来源的数据,坐标系差异非常大,直接用默认设置加载不等于坐标系正确。
2.2 坐标系不对会出现什么怪现象
最典型的两个场景:
- 你加载了一份WGS84地理坐标系的道路数据,又加载了一份CGCS2000投影坐标系的在线影像底图,结果路网整体偏移几百米,甚至跑到了河里;
- 你直接对地理坐标系的线数据做缓冲区分析,生成的结果是“度”为单位的缓冲圈,到了ArcGIS里要么变成异常小的圆圈,要么警告“空间参考不匹配”。
在实际项目中,做深圳市域范围内的分析,我建议优先转成CGCS2000_3_Degree_GK_Zone_39或Zone_38这类投影坐标系,单位是米,后续做面积、长度、缓冲区计算才直观、才准确。转换方法在ArcGIS Pro里是右键图层,选择数据的导出/导出要素,在导出窗口里指定坐标系即可;QGIS里则是右键图层,导出要素另存为,并选择目标CRS。
2.3 坐标偏移排查技巧
如果你发现道路网和底图有几十米的偏移,先别急着用“空间校正”硬调。优先检查坐标系声明:很多数据虽然是CGCS2000坐标数值,但.prj文件写的却是WGS84,或者反过来。只要坐标系声明正确,软件会自动做基准面转换。真正需要手动校正的情况只发生在数据本身没有空间参考、或者历史数据基于地方独立坐标系(比如深圳部分早期测绘数据用深圳独立坐标系)时,那才需要通过同名控制点做仿射变换。
3. shp矢量数据的基本结构与常见处理场景
理解shp的工作原理,不只是为了“能打开”,更是为了在后续处理中少走弯路。下面按处理场景拆开说。
3.1 shp不是单文件:文件组的分工逻辑
我把shp文件组类比成一本“图文并茂的书”:.shp是图片页,.dbf是文字说明页,.shx是目录页,.prj是书的封面(告诉你这本书是中文还是英文,横排还是竖排)。目录页丢了,你虽然能看到每一页图片,但翻页效率极低;封面丢了,内容可能被误读成另一种语言。
理解这层关系后,你就知道为什么导入PostGIS、做kml转shp、dwg转shp之后,总是生成一“串”文件而不是一个文件——因为格式本身就是“一整套”。日常作业时,以下几个操作特别容易遇到文件组缺失问题:
- 直接把.shp文件拖进微信聊天窗口发送——微信只会传单个.shp文件,其余文件没传过去;
- 把shp文件从Windows拷到Mac后,只复制了.shp和.dbf,丢掉了.prj;
- 用代码批量处理时只遍历了.shp后缀,没有把同名的.dbf同步迁移。
3.2 常见处理需求的适用工具与选型
围绕道路矢量数据,最常见的一类需求是格式互转和批量处理。根据我平时使用的习惯,整理一份工具选型对照表:
| 需求场景 | 推荐工具 | 说明 |
|---|---|---|
| shp转GeoJSON | QGIS、ArcGIS Pro、ogr2ogr | QGIS右键导出最快;ogr2ogr适合批量脚本 |
| kml转shp | QGIS、ArcGIS Pro、Google Earth Pro导出 | 注意kml一般自带WGS84坐标系 |
| dwg转shp | ArcMap的CAD转地理数据库工具、FME、QGIS | CAD线要素要处理闭合、断线问题 |
| shp转txt(国土报备) | 特定插件、ArcGIS字段计算器 | 输出格式通常有严格的模板要求 |
| shp转3DTiles | CesiumLab、Bentley ContextCapture、模型转换工具 | 常用于Web端三维可视化 |
| 批量裁剪(shp裁剪影像) | ArcGIS模型构建器、Python+arcpy | 按渔网或行政区边界批量执行 |
3.3 道路数据的典型应用场景
用这份深圳市道路数据能做什么?我列几个真实做过的方向:
- 路网密度分析:按行政区(如福田区、南山区)统计道路里程,单位面积道路长度,适合做城市发展评估报告;
- 现状路网制图:按道路等级符号化(高速红色、快速橙色、主干黄色),叠加行政区界、水系、地名标注,输出标准图幅;
- 交通可达性分析:以某一点为起点,基于路网做网络分析(Network Analyst),算最短路径、服务区范围;
- Web可视化:将shp转为GeoJSON或3D Tiles,部署到Cesium、Mapbox、Leaflet上做在线展示。
有一点需要提醒:如果你拿到的道路数据是“几何+基础属性”类型,里面通常没有实时交通流量、车道方向、限速等高级字段。做简单的规划可视化、路线展示、基础统计没问题;但做导航级分析或交通仿真的话,建议再补充高精度路网数据(如OpenStreetMap路网,或商业级导航路网)。也就是说,这份数据更适合“制图、统计、展示”而非“实时计算”。
4. 从解压到出图的完整实操参考流程
下面以一个“拿到深圳市道路矢量数据shp.zip,最终输出一张道路等级图”的完整流程为例,说明每个环节怎么做。
4.1 数据检查清单
解压后,我习惯先过一遍以下检查项:
- 用QGIS或ArcGIS Pro“添加数据”加载整个文件夹中的.shp文件,确认能正常显示道路线;
- 打开属性表,检查是否有至少一个可用的名称字段和等级字段;
- 在图层属性里查看源信息,确认坐标系是否有.prj声明;
- 双击要素,确认几何与属性对应,没有明显错位;
- 观察数据范围是否在深圳经纬度范围内(可以使用“缩放至图层”快速确认)。
数据范围不对的话,第一反应是坐标系声明错误或叠加了错误底图,第二反应是这份数据是局部路网而非全市路网,第三反应才是数据损坏。
4.2 按道路等级符号化出图
如果属性表里有“道路等级”或“TYPE”字段,常见的处理方式是:
在QGIS中右键图层选择属性——符号化——按分类(Categorized),选择等级字段。如果字段值是中文如“高速、快速、主干、次干、支路”,系统会自动按文本分类。这时需要给每一类道路配置不同颜色和线宽:高速用红色、线宽1.2;快速用橙色、线宽1.0;主干用黄色、线宽0.8;次干用浅黄、线宽0.5;支路用白色或浅灰、线宽0.3。加一个深灰色底图(如在线天地图或基础地图),就能得到一张类似标准路网图的版面。
如果是ArcGIS Pro,操作路径是:图层属性——符号系统——主符号系统——唯一值,字段选“等级”,然后逐个双击符号调整颜色和宽度。注意导出的符号化方案可以保存为图层文件(.lyrx或.lyr),下次用相同字段结构的数据时直接套用。
4.3 按行政区融合与裁剪
在深圳市做分区统计时,需要拿深圳市各区的行政区边界shp来裁剪道路数据。如果你是拿“深圳市道路矢量数据”做全深圳市路网,没问题;但如果你想单独统计南山区的路网里程,就需要做裁剪:
- QGIS中:菜单——矢量——地理处理工具——裁剪,输入要素选道路,叠加要素选南山区边界,运行后生成南山区道路层;
- ArcGIS Pro中:分析工具——提取——裁剪(Clip),同样输入图层和裁剪范围。
这里有个细节:clip出来的结果,如果道路恰好落在边界上,可能产生很短的悬挂线或重复线段,统计里程时最好做一步“删除重复几何”或按道路名分组汇总,避免里程翻倍。
4.4 按渔网或规则格网批量处理
如果你想把全市切成若干个方格、逐个统计路网密度,这就用到了热搜词里的“渔网分割shp”。步骤如下:
- 创建渔网(Create Fishnet):在ArcGIS Pro里使用“创建渔网”工具,设置输出范围等于深圳市行政区范围,像元宽度设为1km,生成一个格网面;
- 用格网面裁剪道路线数据:使用“相交(Intersect)”工具,输入道路和渔网面,生成“道路×格网”的切分结果;
- 计算每个格网内道路总长度:在结果图层的属性表里按格网ID字段汇总长度字段,得到每个格网的密度值;
- 将密度值连接到渔网面图层,用分级色彩渲染,输出路网密度热力图。
这个方法做城市路网均匀性评价、组团分析很好用。要注意点是:格网尺寸的选择要根据分析尺度调整,1km适合城市级,500m适合重点区域,如果太细会导致边缘效应明显、计算量大。
4.5 批量按shp裁剪影像
“arcgis根据shp批量裁剪影像”也是高频需求。实际场景通常是:你有全市的遥感影像或地形图,需要把它按照深圳各区界裁剪成若干个分幅图。在ArcGIS Pro里可以这样:
- 把各区界shp作为“裁剪要素”,影像作为“输入栅格”;
- 使用“按掩膜提取”工具,一次只能输出一个,但可以通过模型构建器(ModelBuilder)设置迭代器,让每个区界分别跑一遍;
- 或者写一段arcpy脚本,循环遍历要素类中的每个行政区,执行“ExtractByMask”,输出命名按区名自动拼接。
import arcpy from arcpy.sa import * arcpy.env.workspace = r"路径\\道路数据.gdb" mask_fc = r"路径\\深圳各区.shp" image = r"路径\\影像.tif" out_dir = r"路径\\output" with arcpy.da.SearchCursor(mask_fc, ["区名", "SHAPE@"]) as cursor: for name, shape in cursor: arcpy.MakeFeatureLayer_management(mask_fc, "mask_lyr", f"区名 = '{name}'") out_raster = ExtractByMask(image, "mask_lyr") out_raster.save(out_dir + "\\\\" + name + ".tif") print(name + " 完成")模型构建器的优势是可视化、不易出错,脚本的优势是处理几百个要素时效率更高。熟练以后,脚本方式推荐优先。
5. 常见问题与排查技巧实录
这章节汇总我在处理shp、zip类数据时反复遇到的典型坑,也比较贴合从网络热搜词里看到的很多真实求助场景。
5.1 zip损坏或解压失败
从热搜词里看到很多“zip解压提示invalid zip archive”或“could not find eocd”的提问。这类问题大部分是文件下载不完整造成的,尤其是从网盘或邮件附件中下载的zip包,下载中断后没有校验文件完整性。排查手段:
- 用7-Zip打开zip,看能否列出目录。如果能列出但解压中途报错,说明压缩文件损坏,可尝试修复(7-Zip的“文件——修复压缩文件”功能);如果是“找不到EOCD记录”,多半是文件尾部缺失,修复成功率不高;
- 重新下载,并对比文件大小是否与网页标注一致;
- 某些浏览器或下载工具会把zip包改名为.rar或其他后缀,检查扩展名是否正确。
另外,我在处理一些超大zip包时,建议不要直接双击用系统自带解压工具解压,用7-Zip的“测试”功能先跑一遍完整性校验,确认无错误再解压。很多时候错误信息会在解压到一半时才出来,提前测试省得浪费时间。
5.2 分卷压缩包解压问题
如果在网盘里下载到“xxx.zip”和“xxx.z01”这种分卷压缩包,需要确保所有分卷都在同一目录,再从第一个“.zip”分卷开始解压。热搜词里提到“zip格式解压提示必须有下列压缩分卷z01”就是典型的漏下载、改名或目录不对问题。建议把文件放到英文路径下再解压,避免某些老版本解压工具在中文路径下读不了分卷。
5.3 中文文件名乱码
如果你收到的zip从【306压缩】等国内压缩软件解压后,里面以韩文或乱码显示的命名文件,多数是编码问题。zip压缩包内部文件名编码并不统一,国内很多软件用的是GBK,而macOS、Linux和部分解压工具默认按UTF-8解读,于是出现乱码。解决方案:
- 在Windows上用Bandizip或7-Zip打开zip文件,右键菜单选择“修改编码”或“以ANSI/GBK编码显示”;
- 在macOS上如果出现乱码,可以先在Windows上把zip重新压缩成UTF-8编码再传;
- 在Linux中可以用
unzip -O gbk参数强制指定中文编码。
unzip -O gbk 深圳市道路数据.zip5.4 shp在ArcMap里显示为一条线或一个点
有时候加载shp后,图形被压缩成一条几乎看不见的线或点,常见原因是数据范围与当前数据框范围差异太大,或者坐标系声明错误导致软件把“米”当成“度”来显示。解决办法:
- 双击图层缩放至图层范围,看能否正常显示;
- 检查.prj文件是否声明了正确的坐标系,必要时在图层属性里重新指定;
- 如果图形还是不正常,试试用QGIS打开,QGIS在错误坐标系处理上通常更宽容。
5.5 “导入失败:invalid zip archive”与代码处理相关的情况
如果在用Python读取shp时遇到zip相关的报错,要注意:pyshp或geopandas读shp时,通常要求给的是.shp文件路径而不是.zip路径。部分GIS库支持直接读取zip包(如geopandas可以配合zipfile解压到临时目录),但稳定性不如先解压再读取。建议先解压到本地,再用geopandas.read_file()加载。
import geopandas as gpd gdf = gpd.read_file("深圳市道路矢量数据/深圳市道路_line.shp") print(gdf.columns.tolist())如果非要直接读zip,也可以这样:
import zipfile, geopandas as gpd with zipfile.ZipFile("深圳市道路数据.zip") as z: z.extractall("temp_dir") gdf = gpd.read_file("temp_dir/深圳市道路_line.shp")5.6 格式转换中的属性丢失问题
在“dwg转shp”“kml转shp”这类操作中,最容易遇到“转完图形变了、属性没了”的情况。dwg线条是由CAD的图层、线型控制的,转shp时一定要确认CAD面的闭合情况:如果CAD里的是多段线(Polyline),转成shp后依然是线要素;如果要的是面要素,必须先做拓扑构面。kml转shp后,kml里的名称和描述字段会映射到Name、Description字段,如果原kml里没有属性字段,转换后属性表自然是空的,这不属于转换失败,而是源数据就没有属性。
6. 进阶:把道路矢量数据用到Web端和三维场景
现在很多项目不满足于ArcMap里看静态图,还想把深圳路网发到Web地图或三维场景里。这里顺带说一下shp转3DTiles的路线,因为这也是近期比较热的搜索方向。
6.1 shp转GeoJSON并发布到Web
如果只是做2D展示,转GeoJSON最快。QGIS里右键图层——导出——要素另存为,格式选择GeoJSON,坐标系通常选择WGS84(EPSG:4326),这样浏览器和Mapbox/Leaflet可以直接用。重点提醒:转换时不要把坐标系选成CGCS2000投影坐标系,Web端底图默认是WGS84经纬度,坐标系不一致会导致图形位置偏移。
6.2 用CesiumLab或Mapbox Tiling Service转3D Tiles
要做三维场景里的道路白模或道路网,可以走“shp——3D Tiles”的路线。CesiumLab提供了专门的数据转换工具,可以把shp面转成带高度信息的3D Tiles;如果是道路线转3D Tiles,通常需要先做缓冲或挤出成面要素,再生成模型。另外,Cesium自带的Cesium ion也支持直接上传shp转3D Tiles,但免费额度有限,多数团队还是本地处理更稳。
我在实际项目里的做法是:先对道路线做缓冲(比如按道路等级设置不同缓冲距离),生成道路面,再对面要素赋予高度或挤出,最后转3D Tiles。这样在Cesium里看到的道路是立体且有等级区分的,比单纯放一层线更加直观。
6.3 R语言或Python中读取shp的备选方案
不少做统计分析或机器学习的朋友会用R语言读取shp,这里多说一句:R的sf包或sp包可以直接读取shp文件组,但需要保证.dbf和.shp在同一目录。如果zip包里有多个shp文件(比如同时有道路、区界、水系),建议用sf::st_read()指定每个shp文件的路径去读,或者在解压后先查看目录结构,不要直接对整个文件夹做st_read。
library(sf) road <- st_read("深圳市道路矢量数据/深圳市道路_line.shp") plot(road$geometry)写在最后的一点实际经验
我拿这类“城市道路shp.zip”数据做过不少项目,最大的体会是:数据本身往往不需要多高深的技术,但每一步“小处理”错了,后面全盘崩。坐标系没看就做缓冲、文件组没拷全就发给同事、zip没校验就解压、格式转换后属性不核查——这些都是很低级但又极其常见的操作失误。
所以我的习惯是:拿到任何一份shp.zip,第一件事永远是“检查.prj、打开属性表、缩放至图层”三步走,花不了两分钟,但能省下后面调半天图的大麻烦。另外,每份数据来源不同,坐标系和字段规范差异巨大,拿到手之后建议先做一份数据说明备忘录,把坐标系、字段含义、数据范围、处理日期写清楚,存在和shp同一目录下。这样即使三个月后你同事接手,也能快速进入状态。
如果你手头正好也有一份城市道路shp数据,不妨按上面这套流程走一遍。先把坐标系搞清楚,再按你的需求做符号化、裁剪、转格式,最后再考虑要不要上三维或Web端。路网数据是GIS里最基础也最有用的数据之一,用好了,后面的分析、制图、发布都会顺很多。
本文还有配套的精品资源,点击获取