Konwertowanie pliku osm na plik kształtu (lub ramkę danych) w języku R

15

Szukałem dziś pliku kształtu drogi dla Australii. W końcu pojechałem do Geofabrik . Open Street Map ma dane w .osmformacie. Ale nie mają takiego w .shpAustralii.

Jeśli to możliwe, chcę przekonwertować osmpliki na shapefilesR. Korzystałem z wyszukiwania, ale nie znalazłem jeszcze rozwiązania. Czy jest na to jakiś sposób? Alternatywnie, czy można odczytać pliki osm do R i przekonwertować dane na ramkę danych, aby móc rysować za pomocą ggplot2?

Osiągnąłem następującą grafikę NZ przy użyciu dwóch plików kształtów z maptoolsi ggplot2. Idealnie chciałbym stworzyć podobną mapę Australii.

wprowadź opis zdjęcia tutaj

jazzurro
źródło
Co chcesz zrobić z plikami drogowymi - po prostu wyświetl je na mapie lub jakiejś analizie? Pliki kształtów mają pewne ograniczenia; lepiej być przy użyciu innego formatu!
Simbamangu
@Simbamangu Chcę początkowo wyświetlać drogi na mapie. Jeśli nie shapefile, jakiego formatu zaleca się używać z R?
jazzurro

Odpowiedzi:

10

To nie jest rozwiązanie typu R, ale Quantum GIS (QGIS) to świetny sposób na osiągnięcie tego, co chcesz.

Możesz po prostu załadować plik .osm (narzędzie Dodaj wektor), kliknąć go prawym przyciskiem myszy w Spisie treści i zapisać jako plik kształtu ESRI.

QGIS może ulec awarii z tak dużym fragmentem, więc aby tego uniknąć, możesz użyć Narzędzi OSM, takich jak OverPass API, aby pobrać tylko to, czego potrzebujesz, używając obwiedni.

Wiadukt-Turbo Api jest również dostępna w celu uzyskania ekstraktów, krótki tutorial, który jest tutaj!

Uruchomiłem szybki przykład oparty na tagach highway = primary i highway = primary_link (schemat znakowania autostrady OSM można zobaczyć tutaj! ) Za pomocą Kreatora na Overpass-Turbo, a poniższy obrazek był rezultatem dla Victorii.

Następnie wyeksportowałem dane jako GeoJSON, załadowałem je do QGIS, a następnie zapisałem wynik jako plik kształtu. (Drugi obraz pokazuje linie i bieguny załadowane do QGIS)

Inną alternatywą jest pobranie pliku PBF lub OSM dla obszaru z GeoFabrik i podzbiór danych przez wyodrębnienie tagów highway = * za pomocą Osmosis . Jeśli chcesz regularnie aktualizować swoje dane, zalecany jest Osmosis. Jeśli jest to jednorazowy fragment, Overpass prawdopodobnie byłby łatwiejszy, nawet jeśli musisz to zrobić w mniejszych ramkach ograniczających z powodu ograniczeń pamięci. Po prostu zastosujesz te same zapytania Overpass do różnych ramek ograniczających.

Autostrada = podstawowe wyniki OverPass-Turbo

Wyeksportowano GeoJSON załadowany do QGIS

Mark Cupitt
źródło
2
Nat jest tak proste, jak myślisz: australia.osm.pbf ma rozmiar 195 MB (skompresowany), więc zakładam, że zawiesi QGIS, aby załadować wszystkie dane. Sugeruję filtrowanie pożądanych informacji o drodze za pomocą osmfiltera lub osmozy przed podaniem danych do QGIS.
AndreJ
@Andre, ważny punkt, odpowiednio zaktualizuje odpowiedź!
Mark Cupitt
1
Dziękuję bardzo za poinformowanie mnie o innym sposobie realizacji mojego zadania. Nauczyłem się od ciebie czegoś nowego. Twoje zdrowie.
jazzurro
10

@jazzurro, możesz doskonale to zrobić za pomocą R, po prostu wyszukaj pakiet osmar! Przeczytaj dokumentację osmar (osmar.r-forge.r-project.org/RJpreprint.pdf). Na stronach 11 str. Znajdziesz szczegółowy przykład wydobywania dróg / autostrad za pomocą odpowiednich tagów dla michich.osm! Po pobraniu i wyodrębnieniu danych z pliku planety dla Australii możesz przekonwertować je na dowolny format!

Edytować:

Ponieważ niektórzy komentatorzy narzekali na brak przykładów, opublikuję przykład z dokumentów. IMHO, nie byłoby konieczne przepisywanie tutaj istniejących przykładów, prawda?

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

wprowadź opis zdjęcia tutaj

Kay
źródło
Dziękuję bardzo za link. Widziałem jeden lub dwa posty związane z pakietem. Ale nie byłem pewien, czy pakiet może konwertować .osmpliki do ramki danych. Po krótkim spojrzeniu wydaje się, że nie ma bezpośredniego sposobu konwersji .osmplików na ramkę danych. Czy jest tam
jazzurro
Przeczytaj dokumentację osmar ( osmar.r-forge.r-project.org/RJpreprint.pdf ) .. Na stronach 11 str. Znajdziesz szczegółowy przykład wydobywania dróg / autostrad za pomocą odpowiednich tagów dla munich.osm! Po pobraniu i wyodrębnieniu danych z pliku planety dla Australii możesz przekonwertować je na dowolny format! ps: usunął drugi link z PO, ponieważ nie dotyczyło to obsługi plików osm ..
Kay
1
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem.
SS_Rebelious
@SS_Rebelious, wyraźnie daje odpowiedź. Nie wiem co próbujesz powiedzieć.
Kay
@Kay Aby poprawić tę odpowiedź, możesz wyjaśnić, jak korzystać z pakietu osmar, aby uzyskać pożądane wyniki.
Zachary
7

OK, oto poprawna odpowiedź:

  • Upewnij się, że rgdal(wersja> = 1.0.4) jest zainstalowana

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1]1.0.4
  • Upewnij się, że gdal(wersja> = 1.11.0) jest zainstalowana

    library(rgdal)
    getGDALVersionInfo()
    
    [1] "GDAL 1.11.2, released 2015/02/10"
  • Upewnij się, że gdaljest skompilowany z obsługą Expat / OSM i SQLite:

    c('SQLite', 'OSM') %in% ogrDrivers()$name
    
    [1] TRUE TRUE
  • Upewnij się, że wiesz, którą warstwę chcesz zapisać jako plik kształtu:

    ogrListLayers('filename.osm.pbf')
    
    [1] "points" "lines" "multilinestrings" "multipolygons"
    attr(,"driver")
    [1] "OSM"
    attr(,"nlayers")
    [1] 4
  • Jesteśmy gotowi do pracy:

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

Po przeczytaniu pliku readOGRpostępuj zgodnie z tymi wytycznymi, aby dowiedzieć się, jak go narysować ggplot2.

Zauważ, że możesz również czytać .osmpliki w formacie XML, po prostu upewnij się, że nie są one skompresowane (tzn. Rozszerzenie .osmnie jest .osm.bz2) Ale spróbuj użyć pliku .osm.pbf, ponieważ są one znacznie mniejsze.

gkcn
źródło
fyi, najnowsza skompilowana rgdaldla Windowsa to 0.9-3 i wraca FALSE FALSEdoc('SQLite', 'OSM') %in% ogrDrivers()$name
aaryno
Dla rgdalmożna spróbować pakiet źródłowy ( cran.r-project.org/src/contrib/rgdal_1.0-4.tar.gz ) lub oldrel binarny ( cran.r-project.org/bin/windows/contrib/3.1/ rgdal_1.0-4.zip ). O GDALbinarnym systemie Windows, nie wiem, możesz wysłać raport o błędzie do GDALprojektu i zażądać włączenia obsługi Expat i SQLite w plikach GDALbinarnych Windows .
gkcn
Możesz też zbudować go samodzielnie za pomocą MinGW w systemie Windows i włączyć Expat i SQLite: trac.osgeo.org/gdal/wiki/BuildingWithMinGW
gkcn
1

osm2shp.ru tutaj możesz pobrać dane openstreetmap w formacie shapefiles. Dane podzielone według regionów: Ameryka Północna i Południowa, Australia i Oceania, Afryka, Europa i Azja. 61 warstw do pobrania. Dane filtrowane według warunków „Funkcje mapy”.

Сергей Костин
źródło