2 votos

Cómo manejar los id's duplicados cuando se usa la función as_sp en el paquete osmar de R

A veces, cuando quiero convertir un subconjunto de vías de un archivo osm cargado con el paquete osmar, me encuentro con un error que se queja de los nombres de las filas duplicadas. El siguiente código se ejecuta en este en el archivo attach arroja este error:

Error in `row.names<-.data.frame`(`*tmp*`, value = c(4067932, 4296467,  : 
  duplicate 'row.names' are not allowed
In addition: Warning message:
non-unique values when setting 'row.names': ‘123074181’, ‘154043350’, ‘171826984’, ‘176273732’, ‘196520271’, ‘202157002’, ‘24240315’, ‘24913519’, ‘284493291’, ‘304517627’, ‘35556702’, ‘38210407’, ‘4399491’, ‘4840974’, ‘4840977’, ‘60333308’, ‘61583424’, ‘67627350’, ‘67627353’, ‘68711084’, ‘72157174’ 

Este es el código:

  osm_data <- get_osm(complete_file(), source = osmsource_file('extract.osm'))

  hw_ids <- find(osm_data, way(tags(k == "highway")))
  hw_ids <- find_down(osm_data, way(hw_ids))
  ways <- subset(osm_data, ids = hw_ids)
  ways <- as_sp(ways, "lines")

Supongo que esto se debe a los objetos SpatialLines con el mismo osm_id ? ¿Cómo puedo evitar este problema?

2voto

No estoy seguro de que sea lo que está buscando, pero aquí hay un comienzo con esta solución (basada en esta respuesta ):

library(osmar)
osm_data <- get_osm(complete_file(), source = osmsource_file('extract.osm'))

hw_ids <- find(osm_data, way(tags(k == "highway")))
hw_ids <- find_down(osm_data, way(hw_ids))
ways <- subset(osm_data, ids = hw_ids)

way_ids <- unique(ways$ways$refs$id)
way_lns <- vector("list", length(way_ids))
for (i in 1:length(way_lns)) {
  way_lns[[i]] <- Lines(osmar:::ways_nodes2Line(way_ids[i], ways$ways, ways$nodes), way_ids[i])
}

way_lns <- osmar:::remove_emptyLines(way_lns)
splns <- SpatialLines(way_lns, proj4string = osm_crs())

dat <- cbind(ways$ways$attrs, type = as.factor("way"))
daf <- data.frame(id = unique(dat$id))
rownames(daf) <- daf$id
# used to be data$id

ret <- SpatialLinesDataFrame(splns, daf)

> class(ret)
[1] "SpatialLinesDataFrame"
attr(,"package")
[1] "sp"

plot(ret)

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X