是的,您可以下载地图并根据这些文件中的道路网络信息计算距离。您已经在使用osrm
R包。这会向远程演示服务器发送请求,执行此操作。但是,docs文档中指出:
OSRM演示服务器不允许大型查询(超过10000个距离或持续时间)。
相反,您可以安装osrm-backend
,这是一个用C++编写的高性能路由引擎。这将允许您基于提供的地图设置自己的路由服务器。然后,您可以从R中向本地服务器发出与上述相同的请求,而没有速率限制。
安装osrm-backend和构建地图
你可能是正确的,普通电脑很难轻松构建整个加拿大地图。如果设置了交换文件,可能可以实现,但可能需要很长时间(几小时到几天)。我使用过较小的地图,即由geofabrik托管的安大略省开放街道地图数据。您可以在这里下载其他地区。
最简单的方法是使用OSRM docker镜像。一旦安装了docker,以下内容将下载安大略省的数据和docker镜像,并启动服务器。以下内容应在终端中输入,而不是R。这应该适用于Windows(在PowerShell中),Mac或Linux。
wget -O ontario-latest.osm.pbf https://download.geofabrik.de/north-america/canada/ontario-latest.osm.pbf
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-extract -p /opt/car.lua /data/ontario-latest.osm.pbf || "osrm-extract failed"
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-partition /data/ontario-latest.osm.pbf || "osrm-partition failed"
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-customize /data/ontario-latest.osm.pbf || "osrm-customize failed"
docker run -t -i -p 5000:5000 -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-routed --algorithm mld /data/ontario-latest.osrm
这将在5000端口启动一个路由引擎HTTP服务器。您应该看到类似以下的输出:
[2023-03-27T18:04:02.703986704] [info] starting up engines, v5.27.1
[2023-03-27T18:04:02.704179704] [info] Threads: 8
[2023-03-27T18:04:02.704216504] [info] IP address: 0.0.0.0
[2023-03-27T18:04:02.704250504] [info] IP port: 5000
[2023-03-27T18:04:07.973464309] [info] http 1.1 compression handled by zlib version 1.2.11
[2023-03-27T18:04:07.973828509] [info] Listening on: 0.0.0.0:5000
[2023-03-27T18:04:07.973957909] [info] running and waiting for requests
然后您可以从 R 中查询此内容。
从 R 查询服务器
重要的是将您的 osrm.server
设置为本地主机:
library(osrm)
options("osrm.server" = "http://127.0.0.1:5000/")
options("osrm.profile" = "car")
使用您问题中的示例坐标,我们可以进行如下操作:
osrmRoute(src = src, dst = dst)
对于多个坐标,您还可以使用osrmTable()
:
osrmTable(src = src, dst = dst)
一旦您停止了osrm服务器Docker容器,您只需要运行最后一行即可重新启动它,即:
docker run -t -i -p 5000:5000 -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-routed --algorithm mld /data/ontario-latest.osrm
如果您有大量的坐标对,可能会遇到
max-table-size
参数的限制。您可以通过将其作为参数传递给
docker run
来增加它,例如:
docker run -t -i -p 5000:5000 -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-routed --algorithm mld --max-table-size 100000 /data/ontario-latest.osrm
你的问题有第二部分,关于将地址反向地理编码为经纬度。这是一个足够不同的问题,我不会在这里尝试回答它。然而,好消息是有一个docker镜像可以用于Nominatim,这就是tmaptools::geocode_OSM()
在幕后查询的内容(同样受到速率限制)。你可以类似地安装它-如果遇到问题,请提出另一个问题。