Geopandas计算德国高速公路长度为何远超官方数据?
近期基于OpenStreetMap开展统计工作,使用Overpass导出德国高速公路(Autobahnen)数据,通过geopandas计算长度时,结果与德国联邦交通及数字基础设施部(BMVI)公布的官方数据不符。
按常理,因高速公路双向路段单独映射,计算总长度应约为官方数据的两倍,且Overpass查询已排除连接匝道、出口等路段。但对比最长的十余条高速公路,多数计算结果明显高估,比官方数据高出50%-60%(见附图)。

差异原因分析
重复路段导致重复计算:OSM是众包数据,部分高速公路路段可能被多次绘制(不同用户重复添加、历史版本残留等),即使是同一方向的路段,也可能存在多个重复的way对象,求和时会重复计算长度。
投影坐标系的失真问题:计算时使用了
epsg=3857(Web墨卡托投影),该投影在中高纬度地区会产生显著的距离失真。德国地处中高纬度,用此投影计算出的长度会比实际地理长度偏长,这是高估结果的核心因素之一。建议更换为德国专用的等距投影,如epsg=25832(UTM 32N,覆盖德国大部分区域)或epsg=3035(欧洲等距圆柱投影)。非主线路段的混入:尽管查询时过滤了
highway="motorway",但部分并行的非主线路段(如施工临时便道、单独映射的应急车道、服务区内部连接路)可能被误标记为motorway,这些路段不属于官方统计的主线长度范畴,却被计入了计算结果。统计口径的差异:BMVI的官方数据通常统计的是单向主线的设计长度,而OSM数据可能包含实际建设中的延伸段、未正式通车的路段;另外,官方数据可能按行政归属合并或去重统计,而OSM是按道路物理分段存储,两者统计逻辑本身存在差异。
使用的代码
Overpass 查询代码
[out:json][timeout:100]; {{geocodeArea:Deutschland}}->.searchArea; way["highway"="motorway"]["ref"="A 7"](area.searchArea); out body; >;; out skel qt;
Python 计算代码
import geopandas as gpd import pandas as pd autobahn = "A7" columns = ["ref", "length_m"] df_total = pd.DataFrame(columns=columns) gdf = gpd.read_file(f"https://fliessbaden.de/wp-content/uploads/A7.geojson") gdf = gdf.to_crs(epsg=3857) gdf["length_m"] = gdf.geometry.length total_m = gdf['length_m'].sum() total_km = total_m / 1000 print(autobahn + ": " + str(round(total_km, 2)) + " km")
内容的提问来源于stack exchange,提问作者Mathias Ellpunkt

