ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

西安公交矢量数据处理:从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 坐标系先看数值范围再用已知点位校验别直接套WGS842020西安公交数据在传播过程中坐标系经常被改来改去。判断方法很简单看经纬度的量级和范围。西安的经度在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 DataX字段填经度Y字段填纬度坐标系选WGS84或对应坐标系点确定就能生成一个临时事件层。但要注意它只是“事件”不是真正的shp文件必须右键事件层选择Export Data才能写出shp。import arcpy arcpy.env.workspace rD:\xian_bus in_table rD:\xian_bus\bus_stops.xlsx out_feature_class rD:\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 用站点顺序构造LineStringPoints to Path是绕不开的工具公交线路的矢量化比站点要麻烦一截因为它不是简单的“点转线”而是要按站点顺序把折线连起来并且区分上下行方向。2020西安公交数据的线路表里方向字段在这里就派上了大用场——同样是600路上行和下行是两条完全不同的几何线。在QGIS里最常用的工具是“Points to Path”输入是包含站点顺序的表格Order field选站点序号或站点顺序值Group field选线路名称加方向组合字段。先用表达式把“线路名称”和“方向”拼接成一个新字段例如|||作为连接符然后按这个字段分组就能一次生成所有线路的上下行两条线。-- 在QGIS字段计算器里 线路名称 || _ || 方向其实意思是把两条线路记录变成唯一的组ID。如果是纯Python脚本方式可以用GeoPandas按组排序坐标点再构造LineStringimport 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, geometrygeometry, crsEPSG:4326) lines_gdf.to_file(bus_lines.shp, driverESRI 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.522小时的线宽4自动做线性插值。方向字段的配色直接用Categorized分类选择预设的颜色渐变不用手调。5.2 一个值得养的长期习惯导出shp之前先写prj和编码说明很多数据在交换时出问题原因不在几何而在Sidecar文件。shp文件不是一个单独的文件而是至少三个.shp存几何.dbf存属性.shx存索引缺了.prj文件坐标系信息就丢了别人打开时只能猜坐标。更麻烦的是.dbf的编码2020西安公交数据的字段名是中文如果编码指定不对在ArcMap里打开全是乱码。我现在的做法是在导出shp之前手动检查三个文件的完整性同时额外写一个.txt伴随文件记录坐标系统、字段含义、数据来源和采集时间。这样一来即便数据传到别人手里也不会因为少了坐标系信息而产生歧义。另外一个更有长远价值的做法是直接跳过shp用GeoPackage格式交付——它把几何、坐标系、属性表打包成一个文件编码问题天然规避。如果合作方必须用shp再手工转出并在元数据文档里标注原点。数据交付的自律归根结底是为了让2020西安公交矢量数据在一年、两年以后仍然能被重新打开、拼接、分析而不会在解释坐标系和字段含义上消耗无谓的沟通成本。本文还有配套的精品资源点击获取
返回列表