离线 OSM 和 R
Offline OSM and R
我想要具有离线功能的 openstreetmap。具体来说,我想知道是否有可能(我认为是)在不使用 API 的情况下对某个地址进行地理编码。原因很简单,如果我有数十万个地址要进行地理编码,那将花费很长时间。我已经有了 shapefile,我知道你可以下载 OSM 后端,但我不知道如何 "make" R 调用离线版本的 OSM...
如有任何帮助,我们将不胜感激。
对于离线 OSM 地理编码器,您可以 install Nominatim or one of the other OSM-based search engines 取决于您的 R 包使用的地理编码器。
我找到了我的问题的解决方案,主要在 R 中工作:
首先,您需要克隆 https://github.com/Project-OSRM/osrm-backend. Then you will need to install and launch docker https://www.docker.com/community-edition
country <- "germany"
# Download new maps - NOTE, this is a large download (more than 3GB)
download.file(url = paste0("http://download.geofabrik.de/europe/", country, "-latest.osm.pbf"),
destfile = paste0("./Data/POIs/", country, "/latest.osm.pbf"))
# Download dictionary
download.file(url = "https://raw.githubusercontent.com/MorbZ/OsmPoisPbf/master/doc/poi_types.csv",
destfile = paste0("./Data/POIs/", country, "/poi_types_dict.csv"))
pois_dict <- read.csv(paste0("./Data/POIs/", country, "/poi_types_dict.csv", sep = ","))
pois_dict <- pois_dict[!is.na(pois_dict$CODE), ]
# Create local version of search engine car + foot
cmd1 <- paste0("cd ",getwd(),"/Data/POIs/", country)
cmd2 <- paste0("docker run -t -v $(pwd):/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/latest.osm.pbf")
cmd3 <- paste0("docker run -t -v $(pwd):/data osrm/osrm-backend osrm-contract /data/latest.osrm")
cmd4 <- paste0("docker run -t -i -p 5000:5000 -v $(pwd):/data osrm/osrm-backend osrm-routed /data/latest.osrm")
system(paste(cmd1, cmd2, cmd3, cmd4, sep = "; "))
然后您可以调用以下行(根据需要更新经纬度)
txt <- getURL("http://127.0.0.1:5000/route/v1/driving/13.388860,53.517037;13.385983,52.496891?overview=false")
一些额外的注意事项:
1) 这显然适用于 OSRM,但类似的技术也可用于 OSM。
2) 文件大小可能太大,docker默认只分配1000Mb,您需要根据自己的需要进行更改。
3) 最终得到的结果需要格式化(用正则表达式)才能得到你需要的。
我想要具有离线功能的 openstreetmap。具体来说,我想知道是否有可能(我认为是)在不使用 API 的情况下对某个地址进行地理编码。原因很简单,如果我有数十万个地址要进行地理编码,那将花费很长时间。我已经有了 shapefile,我知道你可以下载 OSM 后端,但我不知道如何 "make" R 调用离线版本的 OSM...
如有任何帮助,我们将不胜感激。
对于离线 OSM 地理编码器,您可以 install Nominatim or one of the other OSM-based search engines 取决于您的 R 包使用的地理编码器。
我找到了我的问题的解决方案,主要在 R 中工作:
首先,您需要克隆 https://github.com/Project-OSRM/osrm-backend. Then you will need to install and launch docker https://www.docker.com/community-edition
country <- "germany"
# Download new maps - NOTE, this is a large download (more than 3GB)
download.file(url = paste0("http://download.geofabrik.de/europe/", country, "-latest.osm.pbf"),
destfile = paste0("./Data/POIs/", country, "/latest.osm.pbf"))
# Download dictionary
download.file(url = "https://raw.githubusercontent.com/MorbZ/OsmPoisPbf/master/doc/poi_types.csv",
destfile = paste0("./Data/POIs/", country, "/poi_types_dict.csv"))
pois_dict <- read.csv(paste0("./Data/POIs/", country, "/poi_types_dict.csv", sep = ","))
pois_dict <- pois_dict[!is.na(pois_dict$CODE), ]
# Create local version of search engine car + foot
cmd1 <- paste0("cd ",getwd(),"/Data/POIs/", country)
cmd2 <- paste0("docker run -t -v $(pwd):/data osrm/osrm-backend osrm-extract -p /opt/car.lua /data/latest.osm.pbf")
cmd3 <- paste0("docker run -t -v $(pwd):/data osrm/osrm-backend osrm-contract /data/latest.osrm")
cmd4 <- paste0("docker run -t -i -p 5000:5000 -v $(pwd):/data osrm/osrm-backend osrm-routed /data/latest.osrm")
system(paste(cmd1, cmd2, cmd3, cmd4, sep = "; "))
然后您可以调用以下行(根据需要更新经纬度)
txt <- getURL("http://127.0.0.1:5000/route/v1/driving/13.388860,53.517037;13.385983,52.496891?overview=false")
一些额外的注意事项:
1) 这显然适用于 OSRM,但类似的技术也可用于 OSM。
2) 文件大小可能太大,docker默认只分配1000Mb,您需要根据自己的需要进行更改。
3) 最终得到的结果需要格式化(用正则表达式)才能得到你需要的。