Mengonversi file osm ke shapefile (atau bingkai data) di R

15

Saya sedang mencari shapefile jalan untuk Australia hari ini. Saya akhirnya pergi ke Geofabrik . Open Street Map memiliki data dalam .osmformat. Tetapi mereka tidak memilikinya di .shpAustralia.

Jika memungkinkan, saya ingin mengonversi osmfile menjadi shapefilesmenggunakan R. Saya telah mencari-cari, tetapi saya belum menemukan solusi. Apakah ada cara untuk melakukan ini? Atau, apakah mungkin untuk membaca file osm ke dalam R dan mengkonversi data ke bingkai data sehingga saya bisa menggambar angka menggunakan ggplot2?

Saya telah mencapai grafik NZ berikut menggunakan dua shapefile dengan maptoolsdan ggplot2. Idealnya, saya ingin membuat peta Australia yang serupa.

masukkan deskripsi gambar di sini

jazzurro
sumber
Apa yang ingin Anda lakukan dengan file jalan - cukup tampilkan di peta, atau semacam analisis? Shapefile memiliki beberapa batasan; Anda mungkin lebih baik menggunakan format lain!
Simbamangu
@Simbamangu Pada awalnya saya ingin menampilkan jalan di peta. Jika tidak shapefile, format apa yang Anda rekomendasikan untuk digunakan dengan R?
jazzurro

Jawaban:

10

Ini bukan solusi R, tetapi Quantum GIS (QGIS) adalah cara yang bagus untuk mencapai apa yang Anda inginkan.

Anda cukup memuat file .osm (Tambahkan alat Vektor), klik kanan pada Daftar Isi dan Simpan Sebagai ESRI Shapefile.

QGIS mungkin macet dengan ekstrak yang sedemikian besar, jadi untuk menghindarinya Anda bisa menggunakan Alat OSM seperti OverPass API untuk mengunduh hanya apa yang Anda perlukan menggunakan kotak pembatas.

The layang-Turbo Api juga tersedia untuk mendapatkan ekstrak, tutorial singkat tentang yang di sini!

Saya menjalankan contoh cepat berdasarkan tag jalan raya = primer dan jalan raya = primary_link (Skema Tagging Highway OSM dapat dilihat di sini! ) Menggunakan Wizard on Overpass-Turbo dan gambar di bawah adalah hasil untuk Victoria.

Saya kemudian mengekspor data sebagai GeoJSON, memuatnya ke QGIS kemudian menyimpan hasilnya sebagai file bentuk. (Gambar kedua menunjukkan garis dan polis yang dimuat ke QGIS)

Alternatif lain adalah mengunduh file PBF atau OSM untuk area tersebut dari GeoFabrik dan mengelompokkan data dengan mengekstraksi tag jalan raya = * menggunakan Osmosis . Jika Anda ingin memperbarui data Anda secara berkala, maka Osmosis akan menjadi cara yang disarankan untuk melanjutkan. Jika itu adalah ekstrak satu kali, Overpass mungkin akan lebih mudah, meskipun Anda harus melakukannya dalam kotak pembatas yang lebih kecil karena keterbatasan memori. Anda hanya akan menerapkan kueri Overpass yang sama melakukan kotak pembatas yang berbeda.

Highway = Hasil Utama OverPass-Turbo

GeoJSON yang Diekspor dimuat ke QGIS

Mark Cupitt
sumber
2
Nat sesederhana yang Anda pikirkan: australia.osm.pbf berukuran 195MB (terkompresi), jadi saya menganggapnya akan membuat QGIS mogok untuk memuat semua data. Saya sarankan untuk menyaring informasi jalan yang diinginkan dengan osmfilter atau osmosis sebelum memberi makan QGIS dengan data.
AndreJ
@Andre, titik valid, akan memperbarui jawaban dengan tepat!
Mark Cupitt
1
Terima kasih banyak memberi tahu saya cara lain untuk menangani tugas saya. Saya belajar sesuatu yang baru dari Anda. Bersulang.
jazzurro
10

@jazzurro, Anda bisa melakukannya dengan sempurna dengan R, lihat saja paket osmar! Baca dokumentasi osmar (osmar.r-forge.r-project.org/RJpreprint.pdf). Pada halaman 11 hlm. Anda dapat menemukan contoh terperinci untuk mengekstraksi jalan / jalan raya dengan tag yang sesuai untuk munich.osm! Setelah menarik dan mengekstraksi data dari file planet untuk Australia, Anda dapat mengonversi ke format apa pun yang Anda inginkan!

Edit:

Karena beberapa komentator mengeluh tentang kekurangan contoh, saya akan memposting contoh dari dokumen. IMHO tidak perlu mengetik ulang contoh yang ada di sini, bukan?

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")

masukkan deskripsi gambar di sini

Kay
sumber
Terima kasih banyak untuk tautannya. Saya telah melihat satu atau dua posting yang terkait dengan paket tersebut. Tapi saya tidak yakin apakah paket tersebut dapat mengkonversi .osmfile ke bingkai data. Setelah melihat sekilas, sepertinya tidak ada cara langsung untuk mengkonversi .osmfile ke bingkai data. Atau ada?
jazzurro
Baca dokumentasi osmar ( osmar.r-forge.r-project.org/RJpreprint.pdf ) .. Di halaman 11 hal. Anda dapat menemukan contoh terperinci untuk mengekstraksi jalan / jalan raya dengan tag yang sesuai untuk munich.osm! Setelah menarik dan mengekstraksi data dari file planet untuk Australia, Anda dapat mengonversi ke format apa pun yang Anda inginkan! ps: menghapus tautan lain dari OP karena ini tidak membahas berurusan dengan osm-file ..
Kay
1
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka.
SS_Rebelious
@SS_Rebelious, Ini jelas memberikan jawaban. Saya tidak tahu apa yang ingin Anda katakan.
Kay
@Kay Untuk membuat jawaban ini lebih baik, Anda bisa menjelaskan cara menggunakan paket osmar untuk mendapatkan hasil yang diinginkan.
Zachary
7

OK, inilah jawaban yang benar:

  • Pastikan rgdal(versi> = 1.0.4) diinstal

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1]1.0.4
  • Pastikan gdal(versi> = 1.11.0) diinstal

    library(rgdal)
    getGDALVersionInfo()
    
    [1] "GDAL 1.11.2, released 2015/02/10"
  • Pastikan yang gdaldikompilasi dengan dukungan Expat / OSM dan SQLite:

    c('SQLite', 'OSM') %in% ogrDrivers()$name
    
    [1] TRUE TRUE
  • Pastikan Anda tahu lapisan mana yang ingin Anda simpan sebagai shapefile:

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

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

Setelah Anda membaca file melalui readOGR, ikuti panduan ini untuk mempelajari cara memplotnya ggplot2.

Perhatikan bahwa Anda juga dapat membaca .osmfile dalam format XML, tapi pastikan file tersebut tidak dikompresi (ekstensi .osmtidak .osm.bz2). Tetapi cobalah untuk menggunakan file .osm.pbf karena ukurannya jauh lebih kecil.

gkcn
sumber
fyi, kompilasi terbaru rgdaluntuk windows adalah 0,9-3 dan kembali FALSE FALSEuntukc('SQLite', 'OSM') %in% ogrDrivers()$name
aaryno
Untuk rgdalAnda dapat mencoba paket sumber ( cran.r-project.org/src/contrib/rgdal_1.0-4.tar.gz ) atau binari oldrel ( cran.r-project.org/bin/windows/contrib/3.1/) rgdal_1.0-4.zip ). Tentang GDALwindows binary, saya tidak tahu, Anda dapat mengajukan laporan bug untuk GDALdiproyeksikan dan meminta dukungan Expat dan SQLite harus diaktifkan di GDALbinari Windows .
gkcn
Atau Anda dapat membuatnya sendiri menggunakan MinGW di Windows dan mengaktifkan Expat dan SQLite: trac.osgeo.org/gdal/wiki/BuildingWithMinGW
gkcn
1

osm2shp.ru di sini Anda dapat mengunduh data openstreetmap dalam format shapefile. Data dibagi berdasarkan wilayah: Amerika Utara dan Selatan, Australia dan Oseania, Afrika, Eropa, dan Asia.61 untuk diunduh. Data difilter menurut kondisi "Fitur Peta".

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