R中使用geosphere计算距离及骑行非直线实际距离求解问题
计算结果确认
你所使用的geosphere包distHaversine函数计算的确实是两点之间的最短大圆距离:该算法将地球近似为标准球体,输出的是球面上两点间的最短弧长,和实际道路的通行距离没有关联。
骑行场景实际通行距离的实现方法
目前在R环境下有两种成熟的本地化实现方案:
- 方案1:基于OSM路网的轻量计算
适合小范围、中小批量的距离计算需求,无需额外部署服务,直接通过R包完成全流程计算,示例代码如下:library(osmdata) library(dodgr) # 定义研究区域边界,替换为你所需计算的区域经纬度范围 bbox <- c(min_lon, min_lat, max_lon, max_lat) # 拉取区域内的道路路网数据 osm_road_net <- opq(bbox) %>% add_osm_feature(key = "highway") %>% osmdata_sf() # 构建适配骑行规则的路网权重,自动过滤机动车专用道等骑行禁行路段 bike_weight_net <- weight_streetnet(osm_road_net$osm_lines, wt_profile = "bicycle") # 计算两点间骑行的实际通行距离,单位为米 ride_distance <- dodgr_dists(bike_weight_net, from = c(lon1, lat1), to = c(lon2, lat2)) - 方案2:基于离线路由引擎的高精度计算
适合大规模批量计算、需要适配更复杂骑行规则(如坡度避让、非机动车道优先)的场景,可本地部署OSRM、Valhalla等开源路由引擎,再通过osrm等R接口包直接调用计算,输出的距离精度和路径匹配度更高。
内容的提问来源于stack exchange,提问作者Albertus Alexander
相关产品推荐
相关产品推荐

