19 votos

Conversión de un archivo osm a shapefile (o marco de datos) en R

Hoy he estado buscando un shapefile de carreteras para Australia. Al final he ido a Geofabrik . Open Street Map dispone de datos en .osm formato. Pero no tienen uno en .shp para Australia.

Si es posible, quiero convertir el osm archivos a shapefiles utilizando R. He buscado por ahí, pero aún no he encontrado soluciones. ¿Hay alguna forma de hacerlo? Alternativamente, ¿es posible leer archivos osm en R y convertir los datos a marco de datos para que pueda dibujar figuras utilizando ggplot2 ?

He conseguido el siguiente gráfico de NZ utilizando dos shapefiles con maptools y ggplot2 . Idealmente, quiero producir un mapa similar de Australia.

enter image description here

13voto

NVI Puntos 358

@jazzurro, esto lo puedes hacer perfectamente con R, ¡sólo tienes que buscar el paquete osmar! Lee la documentación de osmar (osmar.r-forge.r-project.org/RJpreprint.pdf). ¡En las páginas 11 pp. puedes encontrar un ejemplo detallado para extraer carreteras/autopistas por las etiquetas correspondientes para munich.osm! Después de extraer los datos de un archivo planet para Australia, ¡puedes convertirlos al formato que desees!

Edita:

Como algunos comentaristas se quejaban de la falta de ejemplos, voy a poner un ejemplo de los documentos. IMHO no sería necesario volver a escribir ejemplos existentes aquí, ¿verdad?

library(maptools)
library(osmar)
url <- "http://osmar.r-forge.r-project.org/"
file <- "muenchen.osm.gz"
download.file(sprintf("%s%s", url, file), file)
unzip("gzip -d muenchen.osm.gz") # gzip is linux only, on windows I unzipped this manually with 7zip!

src <- osmsource_osmosis(file = "muenchen.osm")
muc_bbox <- center_bbox(11.575278, 48.137222, 3000, 3000)
muc <- get_osm(muc_bbox, src)
muc
summary(muc)

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

plot(muc)
plot_ways(hw, add = TRUE, col = "green")

# convert to spatial object (SpatialLinesDataFrame)
# and save to whatever format you like..
hw_line <- as_sp(hw, "lines")

enter image description here

12voto

Athena Puntos 2149

No es una solución R, pero Quantum GIS (QGIS) es una forma estupenda de conseguir lo que quieres.

Basta con cargar el archivo .osm (herramienta Añadir vector), hacer clic con el botón derecho del ratón en el índice y Guardar como ESRI Shapefile.

QGIS puede bloquearse con un extracto tan grande, así que para evitarlo puedes utilizar Herramientas OSM como el API de paso elevado para descargar sólo lo que necesita utilizando cuadros delimitadores.

En OverPass-Turbo Api también está disponible para obtener extractos, un breve tutorial sobre eso es ¡Toma!

Ejecuté un ejemplo rápido basado en las etiquetas highway=primary y highway=primary_link (El esquema de etiquetado de autopistas de OSM se puede ver ¡Toma! ) utilizando el Asistente en Overpass-Turbo y la imagen de abajo fue el resultado para Victoria.

Después exporté los datos como GeoJSON, los cargué en QGIS y guardé el resultado como un archivo shape. (La segunda imagen muestra las líneas y polys cargado en QGIS)

La otra alternativa es descargar el archivo PBF u OSM de la zona desde GeoFabrik y subconjuntar los datos extrayendo las etiquetas highway=* mediante Osmosis . Si desea actualizar sus datos con regularidad, le recomendamos que utilice Osmosis. Si se trata de un extracto único, el Overpass probablemente sería más fácil, aunque tenga que hacerlo en cuadros delimitadores más pequeños debido a las limitaciones de memoria. Sólo tendría que aplicar las mismas consultas de Sobrepaso a diferentes cuadros delimitadores.

Highway=Primary OverPass-Turbo Results

Exported GeoJSON loaded into QGIS

8voto

olli Puntos 103

OK, aquí viene la respuesta correcta:

  • Asegúrese de que rgdal (versión >= 1.0.4) está instalado

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1] ‘1.0.4’
  • Asegúrese de que gdal (versión >= 1.11.0) está instalado

    library(rgdal)
    getGDALVersionInfo()
    
    [1] "GDAL 1.11.2, released 2015/02/10"
  • Asegúrese de que gdal está compilado con Expat/OSM y soporte SQLite:

    c('SQLite', 'OSM') %in% ogrDrivers()$name
    
    [1] TRUE TRUE
  • Asegúrese de saber qué capa desea guardar como shapefile:

    ogrListLayers('filename.osm.pbf')
    
    [1] "points" "lines" "multilinestrings" "multipolygons"
    attr(,"driver")
    [1] "OSM"
    attr(,"nlayers")
    [1] 4
  • Estamos listos:

    osm <- readOGR('filename.osm.pbf', 'lines')
    writeOGR(osm, 'myshapedir', 'mylayer', driver = 'ESRI Shapefile')

Una vez leído el archivo mediante readOGR Siga estas directrices para aprender a trazarlo con ggplot2 .

Tenga en cuenta que también puede leer .osm en formato XML, sólo tiene que asegurarse de que no estén comprimidos (es decir, que la extensión sea .osm pas .osm.bz2 ) Pero intente utilizar el archivo .osm.pbf, ya que es mucho más pequeño.

1voto

Osm2shp.ru aquí puede descargar datos de openstreetmap en formato shapefiles. Datos divididos por regiones: América del Norte y del Sur, Australia y Oceanía, África, Europa y Asia.61 capas para descargar. Datos filtrados por condiciones de "Características del mapa".

1voto

Ciara Puntos 21

Esta es una vieja pregunta con algunas viejas y buenas respuestas.

Aquí una actualización completa R utilizando los paquetes osmdata para obtener los datos OSM y sf para gestionar y guardar la geometría:

# install.packages("osmdata")
library(osmdata)
#> Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(sf)
#> Linking to GEOS 3.7.2, GDAL 2.4.2, PROJ 5.2.0
# Check the available features
osmdata::available_features() %>% head()
#> [1] "4wd only"  "abandoned" "abutters"  "access"    "addr"      "addr:city"
# In our case, we are interested in 'highway'
selected_feature = "highway"
# Check available tags for the selceted feature
osmdata::available_tags(selected_feature) %>% head()
#> [1] "bridleway"    "bus_guideway" "bus_stop"     "construction" "corridor"    
#> [6] "crossing"
# For simplicity,we are going to download all
selected_tags = osmdata::available_tags(selected_feature)
# Create the request for Overpass API
q = osmdata::getbb ("Baranduda",
           display_name_contains="Australia",
           # limit=1e04,
           format_out = "polygon") %>%
  osmdata::opq() %>%
  osmdata::add_osm_feature(selected_feature
                  ,selected_tags)
# Download the data
o = osmdata::osmdata_sf(q)
# Street geometry can be lines (roads) and polygons (loops, roundabouts, etc.)
# We are going to merge the two type of geometry
# converting polygons to linestrings
full_street = o$osm_polygons %>%
  sf::st_cast("LINESTRING", warn=FALSE) %>%
  rbind(o$osm_lines)

# Save the file (here in temporary file)
output_file = tempfile(fileext=".shp")
sf::st_write(full_street, output_file)

Recibirá una advertencia cuando guarde los datos, debido a que los nombres de los campos están abreviados para el formato shapefile. Le sugiero que utilice un formato más actualizado, como por ejemplo .gpkg :

sf::st_write(full_street, "your-file-name.gpkg")

Puede visualizar los resultados con mapview :

mapview::mapview(full_street)

enter image description here

Creado el 2020-05-04 por el paquete reprex (v0.3.0)

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