【问题标题】:Offline OSM and R离线 OSM 和 R
【发布时间】:2017-05-31 08:58:34
【问题描述】:

我想要具有离线功能的openstreetmap。具体来说,我想知道是否有可能(我认为可以)在不使用 API 的情况下对某个地址进行地理编码。原因很简单,如果我有数十万个地址要进行地理编码,那将需要很长时间。我已经有了 shapefile,我知道你可以下载 OSM 后端,但我不知道如何“制作”R 调用 OSM 的离线版本...

任何帮助将不胜感激。

【问题讨论】:

  • 请记住,“OSM”只是简单的数据。如果您需要地理编码器,则不需要“OSM 的离线版本”,而是需要基于 OSM 的离线地理编码器。尝试了解其中的区别。 OSM 是原始地图数据,而地理编码器、路由器等是一个软件。有很多基于 OSM 的软件可用,但 OSM 仍然只是数据,而不是软件本身。

标签: r openstreetmap offline geocode


【解决方案1】:

对于离线 OSM 地理编码器,您可以install Nominatim 或其他OSM-based search engines 之一,具体取决于您的 R 包使用的地理编码器。

【讨论】:

  • 感谢您的帮助,我对此很陌生,所以如果我下载了 nominatim,如何“连接”R 和 Nominatim?
  • 另外,如果我安装了 Nominatim,如何将我下载的形状文件“链接”到 Nominatim?
  • 理论上您只需更改 URL 以指向您本地的 Nominatim 实例。由于我不是 R 用户,我不知道在哪里设置此配置。 Nominatim 不适用于形状文件,它需要 OSM 数据,通常是 XML 或 PBF。见wiki.openstreetmap.org/wiki/Nominatim/…
  • 好的,那谢谢你的帮助!我也不知道如何设置配置......但我认为这至少让我走上了通往正确解决方案的道路。谢谢!
【解决方案2】:

我找到了解决问题的方法,主要在 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) 需要对得到的最终结果进行格式化(用正则表达式)才能得到你所需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多