6

我目前正在寻找不大于墨西哥城市大小的地图文件(最大,大约 3 度经度/纬度)。但是,在尝试这样做时,我一直遇到内存问题(至少)。OSM XML 对象的文件大小为 1.9 GB,供参考。

library(osmar)
get.map.for.municipality<-function(province,municipality){
  base.map.filename = 'OpenStreetMap/mexico-latest.osm'
  #bounds.list is a list that contains the boundaries
  bounds = bounds.list[[paste0(province,'*',municipality)]]
  my.bbox = corner_bbox(bounds[1],bounds[2],bounds[3],bounds[4])
  my.map.source = osmsource_file(base.map.filename)
  my.map = get_osm(my.bbox,my.map.source)
  return(my.map)
}

我在一个循环中运行它,但它甚至无法通过第一个循环。当我尝试运行它时,我的电脑死机了,我只能用手机截屏。内存在几分钟的过程中稳定地倾斜,然后它迅速飙升,在我的电脑死机之前我无法做出反应。

有什么更好的方法来做到这一点?我预计必须运行这个循环大约 100-150 次,所以任何在内存方面更有效的方法都会有所帮助。我不希望从 API 服务下载较小的文件。如有必要,我愿意使用另一种编程语言(最好是 Python 或 C++),但我更愿意将其保留在 R 中。

在此处输入图像描述

4

1 回答 1

3

我建议不要为此使用 R。

有更好的工具来完成这项工作。从命令行或使用DBMS拆分、过滤内容的许多方法。

以下是从 OSM Wiki http://wiki.openstreetmap.org中提取的一些替代方案:

使用 osmfilter 过滤您的 osm 文件:“osmfilter 用于过滤 OpenStreetMap 数据文件的特定标签。您可以定义不同类型的过滤器来获取 OSM 对象(即节点、方式、关系),包括它们的依赖对象,例如方式节点,关系的方式,其他关系的关系。”

使用 osmconvert 基于多边形或边框进行裁剪:http ://wiki.openstreetmap.org/wiki/Osmconvert#Applying_Geographical_Borders

您可以为 osmfilter 和 osmconvert 编写 bash 脚本,但我建议使用 DBMS。只需使用osm2pgsql导入 PostGIS ,然后将您的 R 代码与任何 Postgresql 驱动程序连接。这将优化您的读/写操作。

于 2015-07-21T01:20:56.923 回答