¿Cómo puedo usar carreteras de datos OSM en R?

8

Necesito usar las carreteras para comparar las posiciones de GPS para verificar que no haya errores en los datos.

Descargué el map.osm de un sitio que tiene información de la ciudad de Roma y lo transformé en Spatial Lines en R.

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

Entonces, con el objeto Spatial Lines intenté usar la función distm pero se acusa de que el objeto espacial no se puede usar (no está en un formato adecuado).

¿Hay otra forma de usar OSM para obtener información de solo carreteras que puedo comparar con datos de GPS en R?

Fabio Jojima
fuente
1
¿Cuál es la distmfunción? ¿Puedes mostrar lo que intentaste y el mensaje de error? ¿Está tratando de calcular distancias desde algunos puntos hasta el punto más cercano en la red de carreteras?
Spacedman
distmes una función de la geosfera de paquete en R, calcula la distancia entre un punto a otro o un punto a un objeto espacial, devolviendo una matriz en el segundo caso. `a <- distm (c (taxi $ lat [1], taxi $ lon [1]), hw_lines, fun = distHaversine)` El error dice "Error en .pointsToMatrix (y): los puntos deben ser vectores de longitud 2, matrices con 2 columnas, o heredando de un objeto SpatialPoints * ". as_spdel paquete osmar convierte el objeto OSM cargado en un objeto espacial. > class(hw_lines) [1] "SpatialLinesDataFrame" attr(,"package") [1] "sp"
Fabio Jojima

Respuestas:

7

Descargué un conjunto de datos de la ciudad de Roma usando el osmarpaquete. Después de eso, seguí su consulta para obtener las carreteras deseadas y luego construí un objeto SpatialPoints aleatorio dentro de los datos recuperados del cuadro delimitador de Roma. Medí distancias entre puntos y líneas usando la función dist2linedel geospherepaquete.

Por favor, intente el siguiente código:

# 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

Guzmán
fuente
Traté de usar api <- osmsource_api()pero dijeron que el bbox tiene demasiados puntos, así que intenté descargar un archivo .osm. He usado rome.osm de http://metro.teczno.com/#rome . No entiendo, en https://en.wikipedia.org/wiki/Rome dice que las coordenadas de Roma son 41 ° 54′N 12 ° 30′E y en OSM Roma dice que es 41 ° 889'N 12 ° 48 ' E, sin embargo, usaste coordenadas diferentes para tu rome.box. get_osm()tiene un sistema de coordenadas diferente?
Fabio Jojima
@FabioJojima Lo siento, ¡fue un error! ¡Encontré "Roma" como ciudad en Estados Unidos! Actualicé la respuesta. Por favor, compruebe si ahora responde a su pregunta!
Guzmán
1
Descubrí que la llamada opcional a mapviewno funcionaba porque nuestras rutinas Rcpp no admitían objetos 'POSIX *'. De todos modos, el problema se resuelve ahora en la rama de desarrollo de GitHub y estará disponible con la próxima actualización oficial en CRAN.
fdetsch
1
Recibo un error al ejecutar get_osm(rome.box, source = api)dicho Space required after the Public Identifier. Hay una respuesta aquí enlace sobre cómo solucionarlo.
Jesper Hybel