Comment puis-je utiliser les routes à partir des données OSM dans R?

8

Je dois utiliser les routes pour comparer les positions GPS pour vérifier qu'il n'y a pas d'erreurs dans les données.

J'ai téléchargé le map.osm à partir d'un site contenant des informations sur la ville de Rome et je l'ai transformé en lignes spatiales 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")  

Donc, avec l'objet Lignes spatiales, j'ai essayé d'utiliser la fonction distm mais on l'accuse que l'objet spatial ne peut pas être utilisé (il n'est pas dans un format approprié).

Il existe un autre moyen d'utiliser OSM pour obtenir des informations sur les routes uniquement que je peux comparer avec les données GPS dans R?

Fabio Jojima
la source
1
Quelle est la distmfonction? Pouvez-vous montrer ce que vous avez essayé et le message d'erreur? Essayez-vous de calculer les distances de certains points au point le plus proche sur le réseau routier?
Spacedman
distmest une fonction de la géosphère du package dans R, il calcule la distance entre point à point ou point à objet spatial, renvoyant une matrice dans le second cas. `a <- distm (c (taxi $ lat [1], taxi $ lon [1]), hw_lines, fun = distHaversine)` L'erreur indique "Erreur dans .pointsToMatrix (y): les points doivent être des vecteurs de longueur 2, matrices à 2 colonnes, ou héritant d'un objet SpatialPoints * ". as_spdu package osmar convertit l'objet OSM chargé en objet spatial. > class(hw_lines) [1] "SpatialLinesDataFrame" attr(,"package") [1] "sp"
Fabio Jojima

Réponses:

7

J'ai téléchargé un ensemble de données de la ville de Rome en utilisant le osmarpackage. Après cela, j'ai suivi votre requête pour obtenir les autoroutes souhaitées , puis j'ai construit un objet SpatialPoints aléatoire à l' intérieur des données récupérées de la boîte englobante de Rome. J'ai mesuré les distances entre les points et les lignes en utilisant la fonction dist2linedu geospherepackage.

Veuillez essayer le code ci-dessous:

# 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
la source
J'ai essayé d'utiliser api <- osmsource_api()mais ils ont dit que la bbox avait trop de points alors j'ai essayé de télécharger un fichier .osm. J'ai utilisé rome.osm de http://metro.teczno.com/#rome . Je ne comprends pas, dans https://en.wikipedia.org/wiki/Rome dit que les coordonnées de Rome sont 41 ° 54′N 12 ° 30′E et dans OSM Rome dit qu'il est 41 ° 889'N 12 ° 48 ' E, mais vous avez utilisé des coordonnées différentes pour votre rome.box. get_osm()avoir un système de coordonnées différent?
Fabio Jojima
@FabioJojima Je suis désolé, c'était une erreur! J'ai trouvé "Rome" comme ville aux USA! J'ai mis à jour la réponse. Veuillez vérifier s'il répond maintenant à votre question!
Guzmán
1
J'ai trouvé que l'appel facultatif à mapviewne fonctionnait pas car nos routines Rcpp ne prenaient pas en charge les objets 'POSIX *'. Quoi qu'il en soit, le problème est résolu maintenant sur la branche de développement de GitHub et sera disponible avec la prochaine mise à jour officielle sur CRAN.
fdetsch
1
Je reçois une erreur d'exécution en get_osm(rome.box, source = api)disant Space required after the Public Identifier. Il y a un lien de réponse ici sur la façon de le réparer.
Jesper Hybel