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

15

Hoy estaba buscando un camino para Australia. Terminé yendo a Geofabrik . Open Street Map tiene datos en .osmformato. Pero no tienen uno .shppara Australia.

Si es posible, quiero convertir los osmarchivos para shapefilesusar R. He buscado, pero aún no he encontrado soluciones. ¿Hay alguna forma de hacerlo? Alternativamente, ¿es posible leer archivos osm en R y convertir los datos en un marco de datos para poder dibujar figuras usando ggplot2?

He logrado el siguiente gráfico de NZ usando dos archivos de forma con maptoolsy ggplot2. Idealmente, quiero producir un mapa similar de Australia.

ingrese la descripción de la imagen aquí

jazzurro
fuente
¿Qué quieres hacer con los archivos de carreteras? ¿Solo mostrarlos en un mapa o algún tipo de análisis? Los archivos de forma tienen algunas limitaciones; ¡puede que sea mejor usar otro formato!
Simbamangu
@Simbamangu Quiero mostrar inicialmente las carreteras en un mapa. Si no es shapefile, ¿qué formato recomienda usar con R?
jazzurro

Respuestas:

10

Esta no es una solución R, pero Quantum GIS (QGIS) es una excelente manera de lograr lo que desea.

Simplemente puede cargar el archivo .osm (herramienta Agregar vector), hacer clic con el botón derecho en la Tabla de contenido y Guardar como archivo de forma ESRI.

QGIS puede bloquearse con un extracto tan grande, por lo que para evitar esto, puede usar las herramientas OSM como la API OverPass para descargar solo lo que necesita usando cuadros delimitadores.

El OverPass-Turbo Api también está disponible para obtener extractos, ¡un breve tutorial sobre eso está aquí!

Ejecuté un ejemplo rápido basado en las etiquetas highway = primary y highway = primary_link (¡El esquema de etiquetado de autopistas OSM se puede ver aquí! ) Usando el asistente en Overpass-Turbo y la imagen a continuación fue el resultado para Victoria.

Luego exporté los datos como GeoJSON, los cargué en QGIS y luego guardé el resultado como un archivo de forma. (La segunda imagen muestra las líneas y polys cargados en QGIS)

La otra alternativa es descargar el archivo PBF u OSM para el área de GeoFabrik y subconjunto de los datos extrayendo las etiquetas highway = * usando Osmosis . Si desea actualizar sus datos regularmente, entonces Osmosis sería la forma recomendada de proceder. 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. Simplemente aplicaría las mismas consultas de Overpass en diferentes cuadros delimitadores.

Carretera = Resultados primarios de OverPass-Turbo

GeoJSON exportado cargado en QGIS

Mark Cupitt
fuente
2
Nat es tan simple como crees: australia.osm.pbf tiene 195 MB de tamaño (comprimido), por lo que supongo que bloqueará QGIS al cargar todos los datos. Sugiero filtrar la información de carretera deseada con osmfilter u osmosis antes de alimentar a QGIS con los datos.
AndreJ
@Andre, punto válido, actualizará la respuesta de manera adecuada.
Mark Cupitt
1
Muchas gracias por dejarme saber otra forma de manejar mi tarea. Aprendí algo nuevo de ti. Salud.
jazzurro
10

@jazzurro, puedes hacer esto perfectamente con R, ¡solo busca el paquete osmar! Lea la documentación de osmar (osmar.r-forge.r-project.org/RJpreprint.pdf). ¡En las páginas 11 págs. Puede encontrar un ejemplo detallado para extraer carreteras / autopistas mediante las etiquetas correspondientes para munich.osm! ¡Después de extraer y extraer los datos de un archivo de planeta para Australia, puede convertir a cualquier formato que desee!

Editar:

Como algunos comentaristas se quejaban de la falta de ejemplos, publicaré un ejemplo de los documentos. En mi humilde opinión, no sería necesario volver a escribir los 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")

ingrese la descripción de la imagen aquí

Kay
fuente
Muchas gracias por el enlace. He visto una o dos publicaciones relacionadas con el paquete. Pero no estaba seguro de si el paquete puede convertir .osmarchivos a marcos de datos. Al echar un vistazo rápido, parece que no hay una forma directa de convertir .osmarchivos a marcos de datos. O hay
jazzurro
Lea la documentación de osmar ( osmar.r-forge.r-project.org/RJpreprint.pdf ). En las páginas 11 págs. Puede encontrar un ejemplo detallado para extraer carreteras / autopistas con las etiquetas correspondientes para munich.osm! ¡Después de extraer y extraer los datos de un archivo de planeta para Australia, puede convertir a cualquier formato que desee! ps: eliminé el otro enlace del OP ya que esto no abordaba el manejo de archivos osm ..
Kay
1
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
SS_Rebelious
@SS_Rebelious, claramente proporciona una respuesta. No sé lo que intentas decir.
Kay
@Kay Para mejorar esta respuesta, podría explicar cómo usar el paquete osmar para obtener los resultados deseados.
Zachary
7

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 gdalesté compilado con soporte para Expat / OSM y SQLite:

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

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

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

Una vez que haya leído el archivo readOGR, siga estas pautas para aprender a trazarlo ggplot2.

Tenga en cuenta que también puede leer .osmarchivos en formato XML, solo asegúrese de que no estén comprimidos (es decir, la extensión .osmno lo está .osm.bz2). Pero intente usar el archivo .osm.pbf ya que son mucho más pequeños.

gkcn
fuente
para su información, la última compilación rgdalpara Windows es 0.9-3 y regresa FALSE FALSEparac('SQLite', 'OSM') %in% ogrDrivers()$name
aaryno
Para rgdalque pueda probar el paquete fuente ( cran.r-project.org/src/contrib/rgdal_1.0-4.tar.gz ) o oldrel binario ( cran.r-project.org/bin/windows/contrib/3.1/ rgdal_1.0-4.zip ). Sobre el GDALbinario de Windows, no lo sé, puede presentar un informe de error para GDALproyectar y solicitar que la compatibilidad con Expat y SQLite esté habilitada en los GDALbinarios de Windows .
gkcn
O puede construirlo usted mismo usando MinGW en Windows y habilitar Expat y SQLite: trac.osgeo.org/gdal/wiki/BuildingWithMinGW
gkcn
1

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

Сергей Костин
fuente