在R中将osm文件转换为shapefile(或数据框)


15

我今天在寻找澳大利亚的道路形状文件。我最终去了Geofabrik。Open Street Map具有.osm格式的数据。但是他们没有一个.shp适合澳大利亚。

如果可能的话,我想将osm文件转换为shapefiles使用R。我已经搜索过,但是还没有找到解决方案。有什么办法吗?另外,是否可以将osm文件读入R并将数据转换为数据帧,以便我可以使用绘制图形ggplot2

我通过使用带有maptools和的两个shapefile实现了NZ的以下图形ggplot2。理想情况下,我想制作一张类似的澳大利亚地图。

在此处输入图片说明


您想对道路文件进行什么处理-仅将它们显示在地图上或进行某种分析?Shapefile有一些局限性。您最好使用其他格式!
Simbamangu 2014年

@Simbamangu我想最初在地图上显示道路。如果不是shapefile,建议与R一起使用哪种格式?
jazzurro 2014年

Answers:


10

这不是R解决方案,但是Quantum GIS(QGIS)是实现所需目标的好方法。

您可以简单地加载.osm文件(添加矢量工具),在目录中右键单击它,然后另存为ESRI Shapefile。

QGIS提取的内容如此庞大可能会崩溃,因此,为避免这种情况,您可以使用OSM工具(OverPass API)使用边界框仅下载所需的内容。

立交桥涡轮增压 API是提供获得提取物,对一个简短的教程是在这里!

我使用立交桥上的向导运行了一个基于Highway = primary和Highway = primary_link标签的快速示例(可在此处查看OSM高速公路标签方案),下图是Victoria的结果。

然后,我将数据导出为GeoJSON,将其加载到QGIS中,然后将结果保存为形状文件。(第二张图显示了加载到QGIS中的线和多边形)

另一种选择是从GeoFabrik下载该区域的PBF或OSM文件,并通过使用Osmosis提取Highway = *标签来对数据进行子集化。如果您希望定期更新您的数据,则建议使用渗透法进行操作。如果它是一次性提取,则由于内存限制,即使必须在较小的边界框中执行此操作,Overpass也可能会更容易。您只需应用相同的Overpass查询即可执行不同的边界框。

高速公路=主要立交-涡轮结果

导出的GeoJSON已加载到QGIS中


2
Nat就像您想的那么简单:australia.osm.pbf的大小为195MB(压缩),因此我认为它将使QGIS崩溃,从而无法加载所有数据。我建议在向QGIS提供数据之前,用osmfilter或osmosis过滤所需的道路信息。
2014年

@Andre,有效点,将适当更新答案!
马克·库皮

1
非常感谢您让我知道另一种处理任务的方式。我从你那里学到了一些新东西。干杯。
jazzurro 2014年

10

@jazzurro,您完全可以使用R做到这一点,只需查找osmar包即可!阅读osmar文档(osmar.r-forge.r-project.org/RJpreprint.pdf)。在第11页上,您可以找到通过munich.osm的相应标签提取道路/高速公路的详细示例!从澳大利亚的行星文件中提取并提取数据后,您可以将其转换为所需的任何格式!

编辑:

由于一些评论员抱怨缺少示例,因此我将在文档中发布示例。恕我直言,这里没有必要重新输入现有示例,不是吗?

library(maptools)
library(osmar)
url <- "http://osmar.r-forge.r-project.org/"
file <- "muenchen.osm.gz"
download.file(sprintf("%s%s", url, file), file)
unzip("gzip -d muenchen.osm.gz") # gzip is linux only, on windows I unzipped this manually with 7zip!

src <- osmsource_osmosis(file = "muenchen.osm")
muc_bbox <- center_bbox(11.575278, 48.137222, 3000, 3000)
muc <- get_osm(muc_bbox, src)
muc
summary(muc)

hw_ids <- find(muc, way(tags(k == "highway")))
hw_ids <- find_down(muc, way(hw_ids))
hw <- subset(muc, ids = hw_ids)

plot(muc)
plot_ways(hw, add = TRUE, col = "green")

# convert to spatial object (SpatialLinesDataFrame)
# and save to whatever format you like..
hw_line <- as_sp(hw, "lines")

在此处输入图片说明


非常感谢您提供的链接。我看过一两个与该软件包有关的帖子。但是我不确定该包是否可以将.osm文件转换为数据帧。快速浏览一下,似乎没有直接的方法可以将.osm文件转换为数据帧。还是在那里?
jazzurro 2014年

请阅读osmar文档(osmar.r-forge.r-project.org/RJpreprint.pdf)。在第11页上,您可以找到有关munich.osm!的相应标签来提取道路/高速公路的详细示例!从澳大利亚的行星文件中提取并提取数据后,您可以将其转换为所需的任何格式!ps:从OP中删除了另一个链接,因为该链接未解决处理osm文件的问题。– 2014

1
这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
SS_Rebelious

@SS_Rebelious,它确实提供了答案。我不知道你想说什么。

@Kay为使此答案更好,您可以解释如何使用osmar软件包来获得所需的结果。
2014年

7

好的,这是正确的答案:

  • 确保rgdal已安装(版本> = 1.0.4)

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1]1.0.4
  • 确保gdal已安装(版本> = 1.11.0)

    library(rgdal)
    getGDALVersionInfo()
    
    [1] "GDAL 1.11.2, released 2015/02/10"
  • 确保gdal使用Expat / OSM和SQLite支持对其进行编译:

    c('SQLite', 'OSM') %in% ogrDrivers()$name
    
    [1] TRUE TRUE
  • 确保知道要保存为shapefile的图层:

    ogrListLayers('filename.osm.pbf')
    
    [1] "points" "lines" "multilinestrings" "multipolygons"
    attr(,"driver")
    [1] "OSM"
    attr(,"nlayers")
    [1] 4
  • 我们准备出发:

    osm <- readOGR('filename.osm.pbf', 'lines')
    writeOGR(osm, 'myshapedir', 'mylayer', driver = 'ESRI Shapefile')

通过读取文件后 readOGR,请遵循以下准则以了解如何使用进行打印ggplot2

请注意,您还可以读取.osmXML格式的文件,只需确保未压缩文件(即,扩展名为.osmnot .osm.bz2),但是请尝试使用.osm.pbf文件,因为它们要小得多。


fyi,最新rgdal为Windows 编译的是0.9-3,返回FALSE FALSEc('SQLite', 'OSM') %in% ogrDrivers()$name
aaryno

对于rgdal您可以尝试源代码包(cran.r-project.org/src/contrib/rgdal_1.0-4.tar.gz)或oldrel二进制(cran.r-project.org/bin/windows/contrib/3.1/ rgdal_1.0-4.zip)。关于GDALWindows二进制文件,我不知道,您可以提交错误报告以GDAL计划并请求必须在Windows GDAL二进制文件中启用Expat和SQLite支持。
gkcn

或者,您也可以在Windows上使用MinGW自己构建它并启用Expat和SQLite:trac.osgeo.org/gdal/wiki/BuildingWithMinGW
gkcn 2015年

1

osm2shp.ru在这里,您可以下载shapefile格式的openstreetmap数据。数据按地区划分:北美和南美,澳大利亚和大洋洲,非洲,欧洲和亚洲61层可供下载。根据“地图要素”条件过滤的数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.