如何将一个非常大的OpenStreetMap文件划分为R中的较小文件而不会耗尽内存?

时间:2015-04-13 23:09:49

标签: r memory openstreetmap osmar

我目前正在寻找的地图文件不大于墨西哥城市的规模(最大,经度约为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中。

enter image description here

1 个答案:

答案 0 :(得分:3)

我建议不要使用R.

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

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

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

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

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