
简介这份广州市2020年户外徒步轨迹数据集以ESRI Shapefile标准格式存储面向GIS研究人员、城市规划者及运动健康研究者。数据收录了当地徒步活动的多条轨迹每条记录包含轨迹ID、徒步距离、徒步速度、日期等关键属性可用于识别热门徒步路线、分析参与者行为模式或结合天气与人口数据进行多因素研究。资源包为7z压缩格式共7个文件涵盖.shp几何文件、.dbf属性表、.prj投影定义、.shx/.sbn/.sbx索引文件及.shp.xml元数据确保数据可被ArcGIS、QGIS等主流GIS软件直接读取。整包大小约649.82MB目前已有265人浏览学习。借助该数据集用户可直接开展空间可视化、户外运动轨迹密度分析或城市规划辅助决策无需从零采集大幅缩短研究数据准备时间。1. 广州2020年徒步轨迹shp不是一份文件是一套GIS数据拿到一个名为 GuangzhouTracks2020_walking 的压缩包解压后看到的是一串扩展名不同的同名文件。很多人会误以为只有 .shp 是数据其余都是多余的结果把 .shp 单独拷走后GIS 软件不是提示缺少文件就是属性表乱码。这个数据集实际上记录的是广州市2020年全年户外徒步者的 GPS 轨迹每条轨迹带有轨迹ID、徒步距离、速度和日期信息。这种线类型的矢量数据在很多场景都有用户外路线规划、城市绿道评估、运动健康研究甚至结合天气数据做多因素分析。对 GIS 从业者来说更重要的是掌握这类轨迹数据的标准处理流程——从文件识别、坐标系确认到字段清洗、空间分析再到格式转换。下面按这条链路逐层拆解可以直接照着操作。2. Shapefile不是“单文件”拆解.shp/.shx/.dbf/.prj与索引文件2.1 文件家族每个扩展名的真实职责Shapefile 是 ESRI 推出的一种矢量数据存储格式它的关键特征是“一个数据多个文件”。GuangzhouTracks2020_walking 压缩包里出现 .shp、.shx、.dbf、.prj、.sbn、.sbx、.shp.xml缺一不可或影响功能。下面按优先级列出各自的职责扩展名作用缺失后果.shp保存线要素的几何坐标包括节点和路径没有数据主体无法读取.shx几何索引记录每条要素在.shp中的偏移量读取变慢部分工具直接报错.dbf属性表保存轨迹ID、距离、速度、日期等字段属性数据全部丢失.prj坐标系统文本用WKT描述地理/投影坐标系QGIS/ArcGIS会提示“未知CRS”.sbn / .sbx空间索引用于加速空间查询和连接缺失时软件会重建不影响数据本身.shp.xml可选的元数据包含创建时间、数据描述等不影响加载但可读性降低常见的一个困惑是“GIS中复制了不能粘贴为什么”。很多情况下是因为你在文件管理器中只复制了一个 .shp 文件粘贴到新文件夹时没有带上旁边的 .dbf、.shx、.prj。GIS 软件看到的是隐式依赖组不是单文件所以会认为数据不完整。正确做法是把这组同名文件整体复制或者使用 QGIS 的图层另存为来生成一套完整的 Shapefile。2.2 用ogrinfo与Python快速验明身份拿到数据后我通常先用 GDAL 自带的 ogrinfo 命令扫一眼比直接拖进 GIS 更快。在命令行里进入解压目录执行ogrinfo -so GuangzhouTracks2020_walking.shp GuangzhouTracks2020_walking-so表示“summary only”只输出概要信息。命令会返回要素类型LineString、要素数量、图层范围extent以及属性字段名和类型。如果 .prj 存在还会看到PROJCRS或GEOGCRS的描述。比如常见的 WGS 84 经纬度坐标系会显示GEOGCS[WGS 84,...]。再看一下 .prj 文件里的完整 WKT 定义可以用 Python 直接读with open(GuangzhouTracks2020_walking.prj, r) as f: print(f.read())这段代码输出的是标准 OGC WKT 文本。如果是 GCJ-02 或地方坐标系WKT 里会有TOWGS84等参数如果是标准 WGS84则只有基准面和椭球定义。理解 .prj 的内容很关键因为后面在 QGIS 里叠加在线底图时如果项目坐标系是 CGCS2000 或 Web Mercator轨迹的经纬度会自动做重投影。若坐标系定义缺失叠加“天地图”等在线图层时会出现几十到几百米的偏移。2.3 文件缺漏导致的“不识别”问题实际工作中经常遇到的情况有三种。第一种是缺少 .dbf几何能画出来但你会看到属性表是空的无法读取轨迹ID和速度字段。第二种是缺少 .shxQGIS 通常还能打开但 ArcGIS 会报“空间索引文件无效”且执行空间查询时性能退化。第三种是 .prj 与 .shp 实际数据不匹配容易出现“无投影”提示叠加广东省行政边界或广州市路网时轨迹落在南海海域或火星位置。这种问题很隐蔽不能被 .prj 文件名骗了。最稳妥的验证方式是用 QGIS 加载一层已知的广州市行政边界 shp再加载轨迹图层目测轨迹是否落在正确区域内。如果明显偏移需要回到坐标转换环节重新定义图层 CRS。3. 在QGIS中加载轨迹坐标系识别与速度符号化3.1 加载矢量图层编码与几何类型检查打开 QGIS选择“图层 → 添加图层 → 添加矢量图层”源类型选“文件”找到 GuangzhouTracks2020_walking.shp。QGIS 会自动读取同名的 .dbf 和 .shx但如果 .dbf 里的字符串字段不是 UTF-8 编码可能会在属性表中显示乱码。我的习惯是先加载一次打开属性表看看“日期”这类字段如果是乱码就把图层移除重新按“图层 → 添加矢量图层 → 文件”选择时在“文件过滤器”旁的“编码”下拉里改为 GBK 或 GB2312。Shapefile 的属性编码取决于生成时的设置国内很多历史数据用 GBK 导出先试 UTF-8不行再试 GBK。加载成功后重点检查图层类型它应该是 LineString线要素不是 Point 或 Polygon。如果打开后发现轨迹断成很多段不要紧这是 GPS 轨迹的正常现象因为步行记录经常因为信号丢失而被拆分成多条记录。每条记录都有自己的轨迹ID字段后面可以按 ID 重新合并成完整的徒步路线。3.2 坐标系正确姿势读prj、设置项目CRS与天地图底图轨迹数据的 .prj 决定了它的原始坐标系。我的建议是不要在“图层属性 → 信息”里只看“CRS”那一行而是点“数据源”对应的按钮查看详细定义。如果它显示为EPSG:4326 - WGS 84那经纬度坐标是标准的。需要在 QGIS 中叠加在线底图时先打开“设置 → 选项 → CRS”勾选“自动选择投影像素化”或手动指定项目 CRS 为EPSG:3857这样轨迹线会自动从 EPSG:4326 转换到 Web Mercator不会出现错位。这里分享一个让轨迹“落位”更准的验证方法使用 QuickMapServices 插件加载 OpenStreetMap 或对比天地图。注意“天地图”的在线服务在 QGIS 中可以通过 XYZ Tiles 添加URL 模板如https://t0.tianditu.gov.cn/vec_w/wmts?SERVICEWMTS...。加载后把轨迹图层的透明度调成 70%配合符号化线宽 2 像素观察轨迹是否贴在山径和绿道上。如果完全偏离且像是坐标平移了几百米很可能原始数据用了 GCJ-02 加密坐标系而 .prj 里却写着 WGS84。这时要用“处理 → 工具箱 → 纠正”或第三方插件做坐标偏移校正不能直接依赖 QGIS 的重投影。3.3 按速度分级渲染一眼看出徒步节奏轨迹属性表里通常有速度字段。我们可以在图层样式里选择“分级”按速度把轨迹分成“慢速 3 km/h”“中速3-6”“快速6”三类。具体操作双击图层打开“图层属性 → 符号化”渲染类型选“分级”值选“速度”或类似字段点击“分类”按钮然后手动修改阈值。如果你更喜欢用代码控制可以用 PyQGIS 在 Python 控制台直接调整渲染器layer iface.activeLayer() target_field speed_kmh range_list [ (0, 3, slow, blue), (3, 6, middle, orange), (6, 99, fast, red), ] category_list [] for lower, upper, label, color in range_list: symbol QgsSymbol.defaultSymbol(layer.geometryType()) symbol.setColor(QColor(color)) symbol.setWidth(1.6) category QgsRendererRange(lower, upper, symbol, label) category_list.append(category) renderer QgsGraduatedSymbolRenderer(target_field, category_list) layer.setRenderer(renderer) layer.triggerRepaint()参数说明QgsGraduatedSymbolRenderer需要指定字段名和范围列表每个QgsRendererRange的上下界是左开右闭区间所以(0, 3)包含 3symbol.setWidth(1.6)让减速段和提速段在视觉上能分辨出来。渲染后把图例导出成图片整年的徒步热区一目了然。4. 属性字段清洗轨迹ID、距离、速度、日期怎么变成可分析变量4.1 字段初检类型、缺失值与单位打开属性表后先检查字段类型。常见情况是“距离”和“速度”被存成字符串因为原始数据由设备导出时可能是带单位的文本比如 5.3 km 或 3.6 km/h。这种情况下参与计算前必须先转成浮点数。另一个要验证的是“日期”字段可能是 2020-05-01 08:30:00 或 2020/5/1 这种不同格式需要统一成标准时间类型。我用 GeoPandas 做的初检脚本是这样的import geopandas as gpd gdf gpd.read_file(GuangzhouTracks2020_walking.shp, encodingutf-8) print(gdf.dtypes) print(gdf.head()) print(gdf.isnull().sum())read_file会基于 .prj 自动设置 CRSencodingutf-8是给 .dbf 属性编码用的。dtypes输出里能看到哪些对象列需要转换。如果距离字段里混入了单位字符需要清理。这里我一般用 pandas 的字符串替换gdf[distance_km] gdf[distance].astype(str).str.replace( km, ).astype(float) gdf[speed_kmh] gdf[speed_kmh].str.replace( km/h, ).astype(float) gdf[date] pd.to_datetime(gdf[date], format%Y-%m-%d, errorscoerce) gdf gdf.dropna(subset[distance_km, speed_kmh])这段代码的关键是先用astype(str)保证对象能处理再剥离单位字符串最后强转 float。日期用pd.to_datetime并指定格式errorscoerce是为了让无法解析的日期变成 NaT后面统一丢弃或回溯原始值。4.2 使用GeoPandas清洗日期并计算配速清洗后的 dataframe 可以直接计算配速。配速pace的单位通常是 min/km速度和配速的关系是pace 60 / speed_kmh。如果轨迹数据里只有平均速度字段那就直接用这个关系。如果同时给了持续时间和距离更准确地应该用pace duration_minutes / distance_km。gdf[pace_min_km] 60 / gdf[speed_kmh] gdf[month] gdf[date].dt.month gdf[weekday] gdf[date].dt.weekday加上月份和星期后就能统计每个月的徒步次数和总里程。比如按轨迹ID分组聚合stats gdf.groupby(track_id).agg( total_km(distance_km, sum), total_speed(speed_kmh, mean), max_speed(speed_kmh, max), first_date(date, min), ).reset_index()groupby(track_id)假设每条线段都有唯一轨迹IDtotal_speed是简单平均但如果每条线段的距离不同这里建议加权平均total_km / (线段总时长)。不过很多情况下我们手里是“一段一段的轨迹记录”每条记录都有独立的距离和平均速度按 ID 聚合时要注意距离要累计速度要看字段定义——有些字段是整条轨迹的平均有些是片段的瞬时值要读元数据确认。4.3 常见字段误读与修正这里有两个容易踩的坑。第一速度字段是字符型且带逗号例如 4,200 表示 4.2在转换时要先去掉逗号。第二同一条路径的轨迹ID在不同日期文件中可能重复如果直接按ID合并会把不同日期的数据串在一起最好用date track_id联合分组。还有一个容易忽略的编码问题分隔符是逗号还是分号在小数点用英文还是中文。以上这些清洗动作建议统一用脚本完成并把清洗后的数据导出为新的 Shapefile 或 GeoPackage这样后续做空间分析时不用反复处理原始数据。5. 轨迹空间分析按日期过滤、行政区连接与密度核渲染5.1 按日期范围选择轨迹段在 QGIS 中选中属性表打开“选择要素”表达式。如果字段名是date想选出2020年5月到9月的徒步记录表达式是date to_date(2020-05-01) AND date to_date(2020-09-30)注意这里的to_date是 QGIS 函数会按照 ISO 格式解析字符串。选择后右键图层“导出 → 保存所选要素”即可得到该时间范围的轨迹子集。如果想用代码在 PyQGIS 里用表达式过滤layer QgsProject.instance().mapLayersByName(GuangzhouTracks2020_walking)[0] exp QgsExpression(date to_date(2020-05-01) AND date to_date(2020-09-30)) it layer.getSelectedFeatures(QgsFeatureRequest(exp))使用表达式过滤的好处是可以避免在 Python 里做字符串日期比较。如果你的日期字段已经清洗成QDateTime可以用to_datetime(..., yyyy-MM-dd)之类的写法但 QGIS 内置的to_date往往更快。5.2 叠加广州市行政边界统计各区徒步里程把轨迹和“广东省各地市行政边界GIS”或“广州市区级边界shp”叠放在一起用“矢量 → 分析工具 → 按位置连接属性”来实现空间连接。操作参数如下连接要素目标要素输出字段轨迹线图层广州行政区多边形区名、区代码使用几何谓词相交每个轨迹线段落在哪个区内轨迹ID、距离注意“相交”会使得跨区的轨迹被拆分到所经过的每个区。如果只想把整条轨迹归属到“起点所在区”需要先用多节点提取端点。比如用“处理 → 工具箱 → Extract vertices”提取每条轨迹的首节点然后与区界多边形做空间连接再把区名连接回原始轨迹线。这属于常见误用场景直接做线与面相交得到的里程总和会大于全广州总里程因为一条轨迹可能计算两次。正确做法是“分割线在边界处打断”这要用“拆分线”工具先执行。5.3 用核密度分析生成热门路线热力图要找到广州哪些山野步道在2020年最受欢迎核密度分析比纯线叠加更直观。先把线转成点处理 → 工具箱 → “线转点”Line to Points每个线段至少生成一个点。然后用“处理 → 工具箱 → 核密度分析Kernel Density Estimation”设置如下参数名推荐值说明点图层转换后的轨迹点原始线转点权重字段无每条记录权重相同若考虑距离可填距离字段半径500 - 1000 m影响热力图的平滑程度越小越精细像素大小10 m输出栅格分辨率10m对应大范围略粗但显示效果好生成栅格后在 QGIS 中拉伸渲染设置为“单波段伪彩色”色带选“Turbo”不透明度70%。这样就能看到白云山、火炉山、帽峰山等热门徒步区域的红色高亮条带。如果觉得热力图平滑度过高可以把半径改小到300米但要接受更明显的噪声。反之如果只想看大区域趋势用2000米半径。这个方法同样适用于“渔网分割shp”后的网格统计——用渔网网格计算每个格子内的轨迹长度生成按网格统计的徒步频次图。还可以把热力图导出为 GeoTIFF叠加到三维地形上用 Qgis2threejs 插件做 3D 可视化效果类似“三维GIS科幻效果”本质上是通过高度和颜色同时编码轨迹密度。这类展示对户外运动报告很有冲击力但注意不要过度依赖渲染分析结论还是要落在数值统计上。6. 数据转换shp转GeoJSON/KML/CSV并保留轨迹字段6.1 用QGIS导出与ogr2ogr命令最后一步往往是把清洗后的轨迹数据派发给没有 GIS 经验的同事。推荐两种方式QGIS 右键图层“导出 → 另存为”或者用 ogr2ogr 命令行。比如把轨迹完整转换为 GeoJSONogr2ogr -f GeoJSON GuangzhouTracks2020_walking.geojson GuangzhouTracks2020_walking.shp -lco COORDINATE_PRECISION6-lco COORDINATE_PRECISION6控制经纬度小数位数6位约等于0.1米精度足够用于轨迹展示同时让文件体积更小。如果要转换到 KML 给 Google Earth 用ogr2ogr -f KML GuangzhouTracks2020_walking.kml GuangzhouTracks2020_walking.shp -dsco NameFieldtrack_idNameFieldtrack_id会把轨迹ID写入 KML 名称字段这样在 Google Earth 里点选某条轨迹就能看到 ID。注意 KML 默认使用 WGS84 坐标系如果你的项目坐标系是 CGCS2000需要先在 QGIS 中另存为 EPSG:4326 再转换。批量转 KML 时在 bash 里写个 for 循环遍历一个目录下的 shp 即可ogr2ogr每次处理一个文件。6.2 导出CSV/TXT时的编码与分隔符技巧许多人想用“shp转txt”查看轨迹坐标最直接的方式是导出 CSV。QGIS 右键导出 CSV 时勾选“功能显示”选项并选择分隔符为制表符。但要注意 Shapefile 的 .dbf 字段名有限长导出 CSV 时可能被截断或用特殊字符。用 ogr2ogr 导出时可以用-lco SEPARATORTAB同时指定编码ogr2ogr -f CSV point_export.csv GuangzhouTracks2020_walking.shp -lco GEOMETRYAS_XY -lco SEPARATORTAB -lco WRITE_BOMYES -lco ENCODINGUTF-8GEOMETRYAS_XY会把几何点坐标输出成 X 和 Y 两列如果是线要素它只输出中心点而不是所有顶点这时需要先在 QGIS 里用“提取顶点”工具把线转成点再导出。SEPARATORTAB是制表符WRITE_BOMYES是为了让 Excel 正确识别 UTF-8 编码否则中文列名会乱码。这也解决了“gis复制了不能粘贴为什么”这类文件编码不统一导致数据在 Excel 和 GIS 间传递时丢失字段或乱码的问题。如果你只需要属性表不关心空间坐标直接在 QGIS 属性表中全选复制粘贴到 Excel 是最快的路径。但请注意从属性表复制出来的日期字段有时会变成 CDATE 或数字序列建议先执行“字段计算器”生成一个字符串字段格式化为文本再复制。这样得到的表格既包含轨迹ID也有距离、配速和日期方便后续在 Python、R 或 Excel 中做统计建模。本文还有配套的精品资源点击获取