Wie kann ich Straßen aus OSM-Daten in R verwenden?


8

Ich muss die Straßen verwenden, um GPS-Positionen zu vergleichen, um sicherzustellen, dass sie keine Fehler in den Daten sind.

Ich habe die map.osm von einer Site heruntergeladen, die Informationen über die Stadt Rom enthält, und sie in R in Spatial Lines umgewandelt.

src <- osmsource_file(file = "rome.osm")
bb <- center_bbox(41.9, 12.3, 1000, 1000)
rome <- get_osm(bb, src)
ways <- find(rome, way(tags(k == "highway")))
ways <- find_down(rome, way(ways))
ways <- subset(rome, ids = ways)
hw_lines <- as_sp(ways, "lines")  

Also habe ich mit dem Spatial Lines Object versucht, die distm-Funktion zu verwenden, aber es wird beschuldigt, dass das Spatial Object nicht verwendet werden kann (nicht in einem geeigneten Format).

Gibt es eine andere Möglichkeit, mit OSM nur Informationen zu Straßen abzurufen, die ich mit GPS-Daten in R vergleichen kann?


1
Was ist die distmFunktion? Können Sie zeigen, was Sie versucht haben und die Fehlermeldung? Versuchen Sie, Entfernungen von einigen Punkten zum nächsten Punkt im Straßennetz zu berechnen?
Spacedman

distmist eine Funktion aus der Paketgeosphäre in R, berechnet die Entfernung zwischen Punkt zu Punkt oder Punkt zum Raumobjekt und gibt im zweiten Fall eine Matrix zurück. `a <- distm (c (Taxi $ lat [1], Taxi $ lon [1]), hw_lines, fun = distHaversine)` Der Fehler lautet "Fehler in .pointsToMatrix (y): Punkte sollten Vektoren der Länge 2 sein, Matrizen mit 2 Spalten oder Erben von einem SpatialPoints * -Objekt ". as_spaus dem osmar-Paket konvertieren Sie das geladene OSM-Objekt in ein räumliches Objekt. > class(hw_lines) [1] "SpatialLinesDataFrame" attr(,"package") [1] "sp"
Fabio Jojima

Antworten:


7

Ich habe mit dem osmarPaket einen Datensatz aus der Stadt Rom heruntergeladen . Danach folgte ich Ihrer Anfrage, um die gewünschten Autobahnen zu erhalten und dann ein zufälliges SpatialPoints- Objekt innerhalb des Rom-Begrenzungsrahmens zu erstellen , in dem Daten abgerufen wurden. Ich habe Entfernungen zwischen Punkten und Linien mit der Funktion dist2lineaus dem geospherePaket gemessen .

Bitte versuchen Sie den folgenden Code:

# Load libraries
library('osmar')
library('geosphere')

# Define the spatial extend of the OSM data we want to retrieve
rome.box <- center_bbox(center_lon = 12.5450, center_lat = 41.8992, width =  2000, height = 2000)

# Download all osm data inside this area
api <- osmsource_api()
rome <- get_osm(rome.box, source = api)

# General plot
plot(rome)

# Find highways
ways <- find(rome, way(tags(k == "highway")))
ways <- find_down(rome, way(ways))
ways <- subset(rome, ids = ways)

# SpatialLinesDataFrame object
hw_lines <- as_sp(ways, "lines")  

# Plot
spplot(hw_lines, zcol = "uid")

# Interactive view
mapview::mapview(hw_lines) 

# Make a random points dataset (like GPS)
gpsPoints <- spsample(x = hw_lines, n = 100, type = "random")

# Plot points
plot(hw_lines, xlab = "Lon", ylab = "Lat")
plot(gpsPoints, add = TRUE, pch = 19, col = "red")
box()

# Distances between Higways and random points
distances <- dist2Line(p = gpsPoints, line = hw_lines)

romehighways


Ich habe versucht zu verwenden, api <- osmsource_api()aber sie sagten, dass die bbox zu viele Punkte hat, also habe ich versucht, eine .osm-Datei herunterzuladen. Ich habe rome.osm von http://metro.teczno.com/#rome verwendet . Ich verstehe nicht, in https://en.wikipedia.org/wiki/Rome heißt es, dass die Rom-Koordinaten 41 ° 54'N 12 ° 30'E sind und in OSM sagt Rom 41 ° 889'N 12 ° 48 ' E, aber Sie haben andere Koordinaten für Ihre rome.box verwendet. get_osm()Haben Sie ein anderes Koordinatensystem?
Fabio Jojima

@FabioJojima Es tut mir leid, es war ein Fehler! Ich habe "Rom" als Stadt in den USA gefunden! Ich habe die Antwort aktualisiert. Bitte überprüfen Sie, ob es jetzt Ihre Frage beantwortet!
Guzmán

1
Ich habe festgestellt, dass der optionale Aufruf von mapviewnicht funktioniert hat, da unsere Rcpp- Routinen keine POSIX * -Objekte unterstützen. Wie auch immer, das Problem ist jetzt im GitHub-Entwicklungszweig behoben und wird mit dem nächsten offiziellen Update auf CRAN verfügbar sein.
fdetsch

1
Ich erhalte einen Fehler beim Ausführen des get_osm(rome.box, source = api)Sprichworts Space required after the Public Identifier. Es gibt eine Antwort hier Link auf , wie es zu beheben.
Jesper Hybel
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.