我想拥有具有离线功能的openstreetmap。具体来说,我想知道是否有可能(我认为是)可以在不使用API的情况下对某个地址进行地理编码。原因很简单,如果我有数十万个地址来进行地理编码,那将需要永远。我已经有了shapefile,我知道你可以下载OSM后端,但我不知道怎么做#34; R调用OSM的离线版本......
任何帮助都将不胜感激。
答案 0 :(得分:1)
对于离线OSM地理编码器,您可以install Nominatim或其中一个OSM-based search engines,具体取决于R套件使用的地理编码器。
答案 1 :(得分:0)
我找到了解决问题的方法,主要在R:
工作首先,您需要克隆https://github.com/Project-OSRM/osrm-backend。然后,您需要安装并启动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)获得的最终结果需要格式化(使用正则表达式)以获得所需的结果。