Como posso usar estradas a partir de dados OSM no R?

8

Preciso usar as estradas para comparar as posições do GPS e verificar se não há erros nos dados.

Eu baixei o map.osm de um site que tinha informações da cidade de Roma e o transformou em Spatial Lines in 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")  

Então, com o Objeto de Linhas Espaciais, tentei usar a função distm, mas é acusado de que o objeto espacial não pode ser usado (não está em um formato adequado).

Existe outra maneira de usar o OSM para obter informações apenas de estradas que eu posso comparar com dados de GPS no R?

Fabio Jojima
fonte
1
Qual é a distmfunção? Você pode mostrar o que tentou e a mensagem de erro? Você está tentando calcular distâncias de alguns pontos até o ponto mais próximo na rede rodoviária?
Spacedman
distmé uma função da geosfera do pacote em R, calcula a distância entre ponto a ponto ou ponto para Objeto Espacial, retornando uma matriz no segundo caso. `a <- distm (c (taxi $ lat [1], taxi $ lon [1]), hw_lines, fun = distHaversine)` O erro diz "Erro em .pointsToMatrix (y): os pontos devem ser vetores de comprimento 2, matrizes com 2 colunas ou herdadas de um objeto SpatialPoints * ". as_spdo pacote osmar converte o objeto OSM carregado em um objeto espacial. > class(hw_lines) [1] "SpatialLinesDataFrame" attr(,"package") [1] "sp"
Fabio Jojima

Respostas:

7

Eu baixei um conjunto de dados da cidade de Roma usando o osmarpacote. Depois disso, segui sua consulta para obter as rodovias desejadas e depois construir um objeto SpatialPoints aleatório dentro dos dados recuperados da caixa delimitadora de Roma. Eu medi distâncias entre pontos e linhas usando a função dist2linedo geospherepacote.

Por favor, tente o código abaixo:

# 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
fonte
Eu tentei usar, api <- osmsource_api()mas eles disseram que o bbox tem muitos pontos, então tentei baixar um arquivo .osm. Eu usei rome.osm em http://metro.teczno.com/#rome . Eu não entendo, em https://en.wikipedia.org/wiki/Roma diz que as coordenadas de Roma são 41 ° 54′N 12 ° 30′E e no OSM Roma diz que é 41 ° 889'N 12 ° 48 ' E, no entanto, você usou coordenadas diferentes para o seu rome.box. get_osm()tem um sistema de coordenadas diferente?
Fabio Jojima
@FabioJojima Me desculpe, foi um erro! Eu encontrei "Roma" como uma cidade nos EUA! Eu atualizei a resposta. Por favor, verifique se agora responde à sua pergunta!
Guzmán
1
Eu descobri que a chamada opcional para mapviewnão funcionou porque nossas rotinas Rcpp não suportavam objetos 'POSIX *'. De qualquer forma, o problema foi resolvido agora no ramo de desenvolvimento do GitHub e estará disponível com a próxima atualização oficial do CRAN.
Fdetsch
1
Eu recebo um erro ao executar get_osm(rome.box, source = api)dizendo Space required after the Public Identifier. Há uma resposta aqui no link sobre como corrigi-lo.
Jesper Hybel