news 2026/9/17 1:47:04

西安公交矢量数据处理:从Excel经纬度转Shp到线路可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
西安公交矢量数据处理:从Excel经纬度转Shp到线路可视化

简介:2020年西安公交矢量数据是一套面向GIS应用的公共交通地理信息数据集,包含公交线路与公交站点两类要素,适用于城市规划、交通管理、地图服务及移动应用开发。线路数据覆盖649条公交线路,记录线路名称、起止点、首末班时间、方向及距离;站点数据含19000余个站点,提供名称、经纬度(WGS1984)和所属线路等信息。压缩包共12个文件,以shp、dbf、shx、prj等矢量格式为主,整体大小1.71MB,其中shp保存几何要素,dbf存储属性信息,prj记录坐标系参数,可直接在ArcGIS、QGIS等GIS平台加载。已有665人学习下载。凭借精确的空间坐标与完整的属性字段,可用于公交线网覆盖率分析、站点可达性评估、线路优化和公交查询类应用开发,是研究西安公共交通的实用基础数据。

1. 2020西安公交矢量数据到底长什么样,能拿来做什么

拿到一份公交数据,第一反应通常是“不就是一堆点和一堆线嘛”。但真正把2020西安公交矢量数据拆开看,你会发现它其实是一套自带交通语义的基础地理信息资产:公交线路不只是首尾相连的折线,每条线还绑着线路名称、起止点、始发时间、停运时间、行驶方向这些运营属性;公交站点也不只是一个经纬度坐标点,站点名称、所在线路、上下行方向决定了它能不能被准确用于路径规划和空间分析。

这份数据最典型的落地场景有三个:一是把线路和站点叠加到底图上做可视化,直观看出西安主城区的公交覆盖密度和线路走向;二是把站点经纬度作为空间连接键,和人口、POI、房价等业务数据关联,做可达性分析和公交盲区识别;三是为路径规划或线路优化提供路网级的空间基底,比如按方向字段拆分双向线路,计算站间距或线网重复系数。对于GIS开发、交通规划、城市研究和数据可视化从业者来说,这套数据是既能直接出图、又能进分析管线的标准输入。

需要说清楚的是,2020西安公交矢量数据通常是分图层组织的:一个线图层存公交线路,一个点图层存公交站点,两者通过线路名称和站点顺序可以关联。正因为字段相对规范,它也是练习“表格坐标转空间数据”的绝佳素材——尤其是怎么把Excel里的经纬度批量转成shp文件,这是几乎所有GIS从业者都绕不过去的基本功。

2. 数据字段拆解与坐标参考系的判断,处理矢量数据的第一步

2.1 线路表和站点表的字段结构,哪些能直接入库,哪些需要清洗

公交矢量数据的分层逻辑很清晰,拿到手先别急着打开地图看形状,先看属性表。2020西安公交线路图层里,核心字段通常包括线路名称、起始站点、终点站点、始发时间、停运时间、方向,以及承载几何信息的坐标序列;公交站点图层则主要包括站点名称、经度、纬度,必要时还有所属线路和站点序号。

字段名类型示例值处理要点
线路名称字符串600路注意同名不同向,需结合方向字段区分
起止点字符串电视塔—西工大长安校区有的数据拆成“起点”和“终点”两列
始发时间时间或字符串06:00文本类型需要转成time或datetime
停运时间时间或字符串20:30可能存在“末班”“23:00”等非规范写法
方向字符串上行/下行有的用0/1表示,需查看数据字典
站点名称字符串钟楼同名站可能分属不同线路,需关联线路ID
经度浮点108.9423判断是WGS84还是GCJ-02坐标系
纬度浮点34.2675同上,偏差约几百米时需要纠偏

字段清洗最常踩的坑在时间列。Excel里“06:00”如果被识别成小数0.25,导入GIS后就成了数值,必须先在Excel里设置单元格格式为“文本”,或者在导入后用表达式转回。起止点字段如果合并在一列,要用分隔符拆成两列,否则后续做OD分析或线路标签时会很别扭。

2.2 坐标系先看数值范围,再用已知点位校验,别直接套WGS84

2020西安公交数据在传播过程中,坐标系经常被改来改去。判断方法很简单:看经纬度的量级和范围。西安的经度在108.9左右,纬度在34.2左右。如果数值是类似1089423、342675这样的整段数字,那大概率是投影坐标系,需要先找到对应的投影参数。如果小数点后保留多位,更像是地理坐标系——但地理坐标系细看还有WGS84和GCJ-02的区别。

-- 以PostGIS为例,判断数据当前坐标系并转换 SELECT ST_SRID(geom) FROM xian_bus_stops LIMIT 1; -- 返回4326表示WGS84经纬度,返回3857表示Web墨卡托投影 SELECT ST_AsText(geom) FROM xian_bus_stops LIMIT 1; -- 看坐标值,正常经纬度在108/34附近,投影坐标一般值很大

这里是说,拿到数据先在数据库里查一下几何对象的SRID,再看坐标文本。如果发现坐标值在108.94、34.26附近,但叠加在线底图上整体偏移了三四百米,基本可以判断数据是GCJ-02加密坐标,需要转回WGS84再做空间分析。常见的做法是调用开源库coord_convert或GCJ-02转WGS84的算法,在QGIS里也可以直接用TNT插件批量纠偏。

提示:2020年之前的西安公交数据,有相当一部分是采集自高德或百度地图,坐标大概率是GCJ-02。做分析前务必先纠偏,不然站点和路网永远对不上。

3. 把Excel里的经纬度批量导入ArcMap生成shp,站点矢量化的全流程

3.1 从Excel到shp的最小步骤,用Display XY Data还是写脚本

热搜词里“怎么把excel中经纬度数据导入arcmap中,生成shp文件”指向的正是站点矢量化这个动作。ArcMap里最直接的做法是用“Display XY Data”功能:在Table of Contents右键Excel表,选Display XY Data,X字段填经度,Y字段填纬度,坐标系选WGS84或对应坐标系,点确定就能生成一个临时事件层。但要注意它只是“事件”,不是真正的shp文件,必须右键事件层选择Export Data才能写出shp。

import arcpy arcpy.env.workspace = r"D:\xian_bus" in_table = r"D:\xian_bus\bus_stops.xlsx" out_feature_class = r"D:\xian_bus\bus_stops.shp" x_field = "经度" y_field = "纬度" arcpy.MakeXYEventLayer_management( in_table, x_field, y_field, "bus_stops_Layer", arcpy.SpatialReference(4326) ) arcpy.CopyFeatures_management("bus_stops_Layer", out_feature_class) print("shp生成完成")

这段代码把MakeXYEventLayer和CopyFeatures串在一起,第一行读取Excel表,第二行指定X和Y字段,第三行设置空间参考为WGS84。这里要注意,Excel表格的字段名如果是中文,直接传给参数是没问题的;但如果字段名带空格,需要用引号包起来。还有一个更隐蔽的坑是Excel里有些行的经纬度是空值,MakeXYEventLayer会直接跳过并生成警告,但有时候空值是字符串“NULL”而不是真空,这会导致坐标解析失败。

3.2 生成shp后必须检查的3个指标:重复点、空几何、坐标范围

生成shp只是第一步,真正决定数据能不能用的是数据质量检查。我一般会从三个维度检查:一是重复点,同一个站点在同一线路上出现多次,要分清是环线站点还是数据错误;二是空几何,属性表里有记录但几何为空,这种点参与分析时会直接报错;三是坐标范围,把经纬度的最小最大值打印出来,对照西安的真实范围。

SELECT 站点名称, COUNT(*) AS cnt FROM bus_stops GROUP BY 站点名称, 经度, 纬度 HAVING COUNT(*) > 1;

这条SQL查的是完全重复的站点记录,在QGIS里也可以用“Processing → Vector general → Delete duplicate geometries”实现同样效果。值得注意的是,环线公交的起点和终点往往是同一个站点,这不算重复,真正的重复是同一个线路、同一个站点名称、完全一致的坐标出现在两条记录里。

检查坐标范围时,可以用ArcMap的Layer Properties切到Source选项卡直接看,也可以用Python脚本读一遍。如果发现经度出现1089.423这种十位数级别的值,说明坐标被错误拼接成投影坐标或度分格式未转换,唯一的解法是回到源头修复Excel列。

4. 公交线路矢量化:从站点顺序表到连成线路,方向字段的妙用

4.1 用站点顺序构造LineString,Points to Path是绕不开的工具

公交线路的矢量化比站点要麻烦一截,因为它不是简单的“点转线”,而是要按站点顺序把折线连起来,并且区分上下行方向。2020西安公交数据的线路表里,方向字段在这里就派上了大用场——同样是600路,上行和下行是两条完全不同的几何线。

在QGIS里最常用的工具是“Points to Path”,输入是包含站点顺序的表格,Order field选站点序号或站点顺序值,Group field选线路名称加方向组合字段。先用表达式把“线路名称”和“方向”拼接成一个新字段,例如|||作为连接符,然后按这个字段分组,就能一次生成所有线路的上下行两条线。

-- 在QGIS字段计算器里 "线路名称" || '_' || "方向"

其实意思是把两条线路记录变成唯一的组ID。如果是纯Python脚本方式,可以用GeoPandas按组排序坐标点,再构造LineString:

import geopandas as gpd from shapely.geometry import LineString stops = gpd.read_file("bus_stops.shp") stops = stops.sort_values(["线路名称", "方向", "站点序号"]) lines = stops.groupby(["线路名称", "方向"]).apply( lambda df: LineString(df.geometry.tolist()) ).rename("geometry") lines_gdf = gpd.GeoDataFrame(lines, geometry="geometry", crs="EPSG:4326") lines_gdf.to_file("bus_lines.shp", driver="ESRI Shapefile")

这个脚本非常短,但核心逻辑在线路分组和排序上。sort_values里的三列缺一不可:先按线路名称分组,再按方向分上下行,最后按站点序号保证连线顺序正确。如果数据里没有站点序号,就需要通过线路字段和站点名称的先后顺序反推,但那种情况管线会乱,容易画出交叉线或者折返线。

4.2 始发时间与停运时间字段用在哪,不只是地图标注

很多人把始发时间和停运时间当作地图弹窗里的展示字段,这其实浪费了。2020西安公交矢量数据的时间字段,配合方向字段,是做早晚高峰分析和发车频率可视化的关键输入。比如可以筛选出始发时间在06:00前、停运时间在21:00后的线路,这批“早出晚归”的线路通常是城市的骨干公交线。

更实际的做法是把时间字段转成数值,计算“运营时长”,再按运营时长做分级渲染。QGIS里的时间字段如果是字符串格式“06:00”,需要用表达式hour()minute()解析。ArcMap里则可以用“Convert Time Field”工具把文本时间转成日期类型。运营时长的计算逻辑是:停运时间减始发时间,如果跨天则加24小时——西安有的线路末班车是23:30,这个边界情况不处理,运营时长为负,整条线路的渲染会出错。

5. 用2D地图呈现4维信息,在QGIS里做一张不踩坑的公交线网专题图

5.1 按方向配色,按运营时长调整线宽,信息量直接翻倍

到最后这张专题图,我一般会把线路方向、运营时长、站点密度和站点客流量四个维度全部叠进一张图里。方向用颜色区分,上行用暖色,下行用冷色,线宽映射运营时长——运营时间越长的线路线越粗。站点层用密度工具先做一层核密度热力底图,再叠加半透明的站点圆点。

QGIS里的具体操作是:进入图层属性,Line符号选择“Geometry generator”,线宽表达式写scale_linear("运营时长", 10, 22, 0.5, 4),意思是运营时长10小时的线路线宽0.5,22小时的线宽4,自动做线性插值。方向字段的配色直接用Categorized分类,选择预设的颜色渐变,不用手调。

5.2 一个值得养的长期习惯:导出shp之前先写prj和编码说明

很多数据在交换时出问题,原因不在几何,而在Sidecar文件。shp文件不是一个单独的文件,而是至少三个:.shp存几何,.dbf存属性,.shx存索引,缺了.prj文件,坐标系信息就丢了,别人打开时只能猜坐标。更麻烦的是.dbf的编码,2020西安公交数据的字段名是中文,如果编码指定不对,在ArcMap里打开全是乱码。

我现在的做法是,在导出shp之前手动检查三个文件的完整性,同时额外写一个.txt伴随文件,记录坐标系统、字段含义、数据来源和采集时间。这样一来,即便数据传到别人手里,也不会因为少了坐标系信息而产生歧义。另外一个更有长远价值的做法是,直接跳过shp,用GeoPackage格式交付——它把几何、坐标系、属性表打包成一个文件,编码问题天然规避。如果合作方必须用shp,再手工转出并在元数据文档里标注原点。数据交付的自律,归根结底是为了让2020西安公交矢量数据在一年、两年以后,仍然能被重新打开、拼接、分析,而不会在解释坐标系和字段含义上消耗无谓的沟通成本。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 1:45:48

Codejock Xtreme Toolkit Pro VS2017 MFC适配指南

简介:本资源为Codejock Xtreme Toolkit Pro v15.3.1的VS2017适配版开发套件,面向Windows桌面应用开发者,尤其适用于需快速集成专业UI控件(如Ribbon、Docking、Report、Calendar等)的MFC/Win32项目。资源已完成全部.sln…

作者头像 李华
网站建设 2026/9/17 1:45:35

HarmonyOS数学教育应用开发实践

1. 项目概述:HarmonyOS上的数学教育应用开发"竖式计算达人"是一款基于HarmonyOS平台开发的数学教育类应用,专注于100以内加法的竖式计算训练。这个看似简单的应用实际上融合了HarmonyOS的多种核心特性,为开发者提供了一个完整的学习…

作者头像 李华
网站建设 2026/9/17 1:45:23

163邮箱退信550/554排查:SMTP认证与垃圾邮件判定全解析

如果你的程序、脚本或者Outlook/Foxmail之类的客户端,在用163邮箱发信时收到退信,里面出现了550 User has no permission或者554 DT:SPM,那说明你已经碰到了网易邮箱发信场景里最经典的两只“拦路虎”。前者是权限和认证没打通,后…

作者头像 李华
网站建设 2026/9/17 1:44:35

计算机学术会议分类与投稿策略全指南

1. 计算机会议分类概述作为一名在计算机领域摸爬滚打多年的从业者,我深知学术会议对于研究人员和工程师的重要性。计算机会议是学术交流、技术分享和行业趋势的风向标,但面对数量庞大的各类会议,如何快速识别和选择合适的会议投稿或参会&…

作者头像 李华
网站建设 2026/9/17 1:43:37

Matlab光路仿真:PQ向量光线追迹源码与工程实践

简介:这是一份基于PQ分解法的MATLAB潮流计算源码,主要面向电力系统分析初学者、电气工程专业学生以及需要快速掌握潮流计算原理的工程师。源码通过清晰的代码结构展示如何建立电力网络拓扑模型,区分PQ节点(负荷节点)与…

作者头像 李华