Konvertieren einer Osm-Datei in ein Shapefile (oder einen Datenrahmen) in R


15

Ich habe heute nach einem Road Shapefile für Australien gesucht. Am Ende ging ich zur Geofabrik . Open Street Map enthält Daten im .osmFormat. Aber sie haben keinen .shpfür Australien.

Wenn möglich, möchte ich die osmDateien shapefilesmit R konvertieren . Ich habe gesucht, aber noch keine Lösungen gefunden. Gibt es einen Weg dorthin? Ist es alternativ möglich, Osm-Dateien in R zu lesen und die Daten in Datenrahmen umzuwandeln, damit ich mit Zahlen zeichnen kann ggplot2?

Ich habe die folgende Grafik von NZ mit zwei Shapefiles mit maptoolsund erstellt ggplot2. Idealerweise möchte ich eine ähnliche Karte von Australien produzieren.

Bildbeschreibung hier eingeben


Was möchten Sie mit den Straßendateien tun? Zeigen Sie sie einfach auf einer Karte oder einer Art Analyse an? Shapefiles haben einige Einschränkungen. Vielleicht ist es besser für Sie, ein anderes Format zu verwenden!
Simbamangu

@ Simbamangu Ich möchte zunächst Straßen auf einer Karte anzeigen. Wenn nicht Shapefile, welches Format empfehlen Sie für R?
Jazzurro

Antworten:


10

Dies ist keine R-Lösung, aber Quantum GIS (QGIS) ist ein großartiger Weg, um das zu erreichen, was Sie wollen.

Sie können einfach die .osm-Datei laden (Vektor-Tool hinzufügen), im Inhaltsverzeichnis mit der rechten Maustaste darauf klicken und als ESRI-Shapefile speichern.

QGIS kann mit einem so großen Auszug abstürzen. Um dies zu vermeiden, können Sie OSM-Tools wie die OverPass-API verwenden , um nur das herunterzuladen, was Sie mithilfe von Begrenzungsrahmen benötigen.

Die OverPass-Turbo-API ist auch verfügbar, um Auszüge zu erhalten. Ein kurzes Tutorial dazu finden Sie hier!

Ich habe ein kurzes Beispiel basierend auf den Tags highway = primary und highway = primary_link (das OSM-Highway-Tagging-Schema finden Sie hier! ) Mit dem Assistenten auf Overpass-Turbo ausgeführt. Das folgende Bild war das Ergebnis für Victoria.

Ich exportierte die Daten dann als GeoJSON, lud sie in QGIS und speicherte das Ergebnis als Formdatei. (Das zweite Bild zeigt die Linien und Polys, die in QGIS geladen wurden.)

Die andere Alternative besteht darin, die PBF- oder OSM-Datei für das Gebiet von GeoFabrik herunterzuladen und die Daten durch Extrahieren der highway = * -Tags mit Osmosis zu unterteilen . Wenn Sie Ihre Daten regelmäßig aktualisieren möchten, ist Osmosis die empfohlene Vorgehensweise. Wenn es sich um einen einmaligen Auszug handelt, ist die Überführung wahrscheinlich einfacher, obwohl Sie dies aufgrund von Speicherbeschränkungen in kleineren Begrenzungsrahmen tun müssen. Sie würden einfach dieselben Überführungsabfragen anwenden, um unterschiedliche Begrenzungsrahmen zu erstellen.

Highway = Primäre OverPass-Turbo-Ergebnisse

Exportiertes GeoJSON in QGIS geladen


2
Nat so einfach, wie Sie denken: die australia.osm.pbf ist 195 MB groß (komprimiert), also gehe ich davon aus, dass es zum Absturz von QGIS führen wird, um alle Daten zu laden. Ich empfehle, die gewünschten Straßeninformationen mit Osmfilter oder Osmose zu filtern, bevor Sie QGIS mit den Daten versorgen .
AndreJ

@Andre, gültiger Punkt, aktualisiert die Antwort entsprechend!
Mark Cupitt

1
Vielen Dank, dass Sie mich wissen lassen, wie ich meine Aufgabe anders lösen kann. Ich habe etwas Neues von dir gelernt. Prost.
Jazzurro

10

@jazzurro, du kannst das perfekt mit R machen, schau einfach nach dem osmar-Paket! Lesen Sie die osmar-Dokumentation (osmar.r-forge.r-project.org/RJpreprint.pdf). Auf den Seiten 11 S. finden Sie ein ausführliches Beispiel zum Extrahieren von Straßen / Autobahnen mit den entsprechenden Tags für munich.osm! Nachdem Sie die Daten aus einer Planetendatei für Australien gezogen und extrahiert haben, können Sie sie in ein beliebiges Format konvertieren!

Bearbeiten:

Da sich einige Kommentatoren über fehlende Beispiele beschwerten, werde ich ein Beispiel aus den Dokumenten veröffentlichen. IMHO wäre es nicht nötig, existierende Beispiele hier noch einmal einzutippen, oder?

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")

Bildbeschreibung hier eingeben


Vielen Dank für den Link. Ich habe ein oder zwei Posts zum Paket gesehen. Ich war mir aber nicht sicher, ob das Paket .osmDateien in einen Datenrahmen konvertieren kann . Auf den ersten Blick scheint es keine direkte Möglichkeit zu geben, .osmDateien in einen Datenrahmen zu konvertieren . Oder ist da?
Jazzurro

Lesen Sie die osmar-Dokumentation ( osmar.r-forge.r-project.org/RJpreprint.pdf ). Auf den Seiten 11 S. finden Sie ein detailliertes Beispiel für das Extrahieren von Straßen / Autobahnen anhand der entsprechenden Tags für munich.osm! Nachdem Sie die Daten aus einer Planetendatei für Australien gezogen und extrahiert haben, können Sie sie in ein beliebiges Format konvertieren! ps: entfernte den anderen Link aus dem OP, da dieser sich nicht mit dem Umgang mit Osm-Dateien befasste.
Kay

1
Dies ist keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
SS_Rebelious

@SS_Rebelious, es liefert eindeutig eine Antwort. Ich weiß nicht, was du sagen willst.
Kay

@ Kay Um diese Antwort zu verbessern, können Sie erklären, wie Sie mit dem osmar-Paket die gewünschten Ergebnisse erzielen.
Zachary

7

OK, hier kommt die richtige Antwort:

  • Stellen Sie sicher, dass rgdal(Version> = 1.0.4) installiert ist

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1]1.0.4
  • gdalStellen Sie sicher, dass (Version> = 1.11.0) installiert ist

    library(rgdal)
    getGDALVersionInfo()
    
    [1] "GDAL 1.11.2, released 2015/02/10"
  • gdalStellen Sie sicher, dass mit Expat / OSM- und SQLite-Unterstützung kompiliert wurde:

    c('SQLite', 'OSM') %in% ogrDrivers()$name
    
    [1] TRUE TRUE
  • Stellen Sie sicher, dass Sie wissen, welche Ebene Sie als Shapefile speichern möchten:

    ogrListLayers('filename.osm.pbf')
    
    [1] "points" "lines" "multilinestrings" "multipolygons"
    attr(,"driver")
    [1] "OSM"
    attr(,"nlayers")
    [1] 4
  • Wir sind bereit zu gehen:

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

Wenn Sie die Datei über gelesen haben readOGR, befolgen Sie diese Richtlinien , um zu erfahren, wie Sie sie plotten ggplot2.

Beachten Sie, dass Sie auch .osmDateien im XML-Format lesen können. Achten Sie jedoch darauf, dass diese nicht komprimiert sind (dh die Erweiterung ist .osmnicht vorhanden .osm.bz2). Versuchen Sie jedoch, die Datei .osm.pbf zu verwenden, da sie viel kleiner sind.


Neueste rgdalfür Windows kompiliert für ist 0,9-3 und kehrt FALSE FALSEfürc('SQLite', 'OSM') %in% ogrDrivers()$name
aaryno

Für rgdalSie das Quellpaket versuchen können ( cran.r-project.org/src/contrib/rgdal_1.0-4.tar.gz ) oder oldrel binär ( cran.r-project.org/bin/windows/contrib/3.1/ rgdal_1.0-4.zip ). Über die GDALWindows-Binärdatei, ich weiß nicht, können Sie einen Fehlerbericht einreichen, um zu GDALprojizieren und anzufordern, dass die Expat- und SQLite-Unterstützung in Windows- GDALBinärdateien aktiviert werden muss .
gkcn

Oder Sie können es selbst mit MinGW unter Windows erstellen und Expat und SQLite aktivieren
gkcn

1

osm2shp.ru hier können sie openstreetmap daten im shapefiles format herunterladen. Daten unterteilt nach Regionen: Nord- und Südamerika, Australien und Ozeanien, Afrika, Europa und Asien.61 Ebenen zum Herunterladen. Daten gefiltert nach "Map Features" -Bedingungen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.