Перетворення osm-файлу у форм-файл (або кадр даних) в R


15

Я шукав дорожню форму для Австралії сьогодні. Я врешті-решт поїхав до Геофабрику . Відкрита карта вулиць має дані у .osmформаті. Але їх немає в .shpАвстралії.

Якщо можливо, я хочу перетворити osmфайли на shapefilesR. Я шукав, але ще не знайшов рішення. Чи є до цього спосіб? Як варіант, чи можна зчитувати файли osm в R і перетворювати дані в кадр даних, щоб я міг малювати фігури, використовуючи ggplot2?

Я домігся наступної графіки NZ, використовуючи два файли з maptoolsі ggplot2. В ідеалі я хочу створити подібну карту Австралії.

введіть тут опис зображення


Що ви хочете зробити з дорожніми файлами - просто відобразити їх на карті чи якийсь аналіз? Shapefiles має деякі обмеження; можливо, вам буде краще використовувати інший формат!
Сімбамангу

@Simbamangu Я хочу спочатку відобразити дороги на карті. Якщо не shapefile, то який формат рекомендуєте використовувати з R?
jazzurro

Відповіді:


10

Це не рішення R, але квантовий ГІС (QGIS) - прекрасний спосіб досягти того, що ви хочете.

Ви можете просто завантажити.

QGIS може вийти з ладу з таким великим витягом, тому, щоб уникнути цього, ви можете використовувати Інструменти OSM, такі як API OverPass, щоб завантажувати лише те, що вам потрібно, використовуючи обмежувальні поля.

Шляхопровід-Turbo Api також доступна для отримання екстрактів, інструкція по це тут!

Я наводив короткий приклад на основі тегів шосе = первинне та шосе = первинне посилання (схему маркування шосе OSM можна переглянути тут! ) За допомогою Майстра на Overpass-Turbo, і зображення нижче було результатом для Вікторії.

Потім я експортував дані як GeoJSON, завантажив їх у QGIS, а потім зберег результат як файл форми. (На другому зображенні показані лінії та поліси, завантажені в QGIS)

Інша альтернатива - завантажити файл PBF або OSM для області з GeoFabrik та підмножити дані, витягнувши теги шосе = * за допомогою осмосу . Якщо ви хочете регулярно оновлювати свої дані, рекомендованим способом продовжуватиметься осмос. Якщо це одноразовий витяг, Overpass, мабуть, буде простішим, хоча вам доведеться робити це в менших обмежувальних полях через обмеження пам'яті. Ви просто застосуєте одні й ті ж запити Overpass для різних обмежувальних полів.

Шосе = Первинні результати OverPass-Turbo

Експортований GeoJSON завантажений у QGIS


2
Nat такий простий, як ви думаєте: australia.osm.pbf має величину 195 Мб (стиснений), тому я припускаю, що це обвалить QGIS для завантаження всіх даних. Я пропоную відфільтрувати бажану інформацію про дорогу за допомогою осмфільтра або осмосу перед тим, як подавати QGIS з даними.
AndreJ

@Andre, дійсна точка, відповідь оновить належним чином!
Марк Купітт

1
Дуже дякую, що даєте мені знати інший спосіб впоратися зі своїм завданням. Я дізнався щось нове від вас. Ура.
jazzurro

10

@jazzurro, ви прекрасно можете це зробити з R, просто шукайте osmar пакет! Прочитайте документацію на осмар (osmar.r-forge.r-project.org/RJpreprint.pdf). На сторінках 11 сторінок ви можете знайти докладний приклад вилучення доріг / автомобільних доріг відповідно до тегів для munich.osm! Після витягування та вилучення даних з планетарного файлу для Австралії ви можете конвертувати у будь-який бажаний формат!

Редагувати:

Оскільки деякі коментатори скаржилися на відсутність прикладів, я опублікую приклад із документів. ІМХО не потрібно було б повторно вводити існуючі приклади, чи не так?

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

введіть тут опис зображення


Дуже дякую за посилання. Я бачив один або два повідомлення, пов’язані з пакетом. Але я не був впевнений, чи зможе пакет перетворити .osmфайли в кадр даних. Швидкий огляд, здається, немає прямого способу перетворення .osmфайлів у кадр даних. Або є?
джазурро

Прочитайте документацію на осмар ( osmar.r-forge.r-project.org/RJpreprint.pdf ) .. На сторінках 11 стор., Ви можете знайти докладний приклад вилучення доріг / автомобільних доріг відповідно до тегів для munich.osm! Після витягування та витягування даних із планетарного файлу для Австралії ви можете конвертувати у будь-який бажаний формат! ps: видалили інше посилання з ОП, оскільки це не стосувалося роботи з osm-файлами ..
Kay

1
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
SS_Rebelious

@SS_Rebelious, це однозначно дає відповідь. Я не знаю, що ви намагаєтесь сказати.
Кей

@Kay Щоб зробити цю відповідь кращою, ви можете пояснити, як використовувати пакет osmar для отримання бажаних результатів.
Захарій

7

Гаразд, ось правильна відповідь:

  • Переконайтеся, що rgdal(версія> = 1.0.4) встановлена

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1]1.0.4
  • Переконайтеся, що gdal(версія> = 1.11.0) встановлена

    library(rgdal)
    getGDALVersionInfo()
    
    [1] "GDAL 1.11.2, released 2015/02/10"
  • Переконайтеся, що gdalце компільовано із підтримкою Expat / OSM та SQLite:

    c('SQLite', 'OSM') %in% ogrDrivers()$name
    
    [1] TRUE TRUE
  • Переконайтеся, що ви знаєте, який шар ви хочете зберегти як shapefile:

    ogrListLayers('filename.osm.pbf')
    
    [1] "points" "lines" "multilinestrings" "multipolygons"
    attr(,"driver")
    [1] "OSM"
    attr(,"nlayers")
    [1] 4
  • Ми готові йти:

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

Після того, як ви прочитаєте файл через readOGR, дотримуйтесь цих вказівок, щоб дізнатися, як побудувати його ggplot2.

Зауважте, що ви також можете читати .osmфайли у форматі XML, просто переконайтеся, що вони не стиснуті (тобто розширення .osmне є .osm.bz2), але спробуйте використовувати .osm.pbf файл, оскільки вони набагато менші.


fyi, остання скомпільована rgdalдля Windows for 0,9-3 і повертається FALSE FALSEдляc('SQLite', 'OSM') %in% ogrDrivers()$name
aaryno

Для rgdalви можете спробувати пакунок ( cran.r-project.org/src/contrib/rgdal_1.0-4.tar.gz ) або oldrel бінарних ( cran.r-project.org/bin/windows/contrib/3.1/ rgdal_1.0-4.zip ). Про GDALдвійковий код Windows, я не знаю, ви можете подати звіт про помилку в GDALпроект і вимагати, щоб підтримка Expat і SQLite повинна бути включена у GDALбінарних файлах Windows .
gkcn

Або ви можете створити його самостійно за допомогою MinGW у Windows та включити Expat та SQLite: trac.osgeo.org/gdal/wiki/BuildingWithMinGW
gkcn

1

osm2shp.ru тут можна завантажити дані openstreetmap у форматі shapefiles. Дані розділені за регіонами: Північна та Південна Америка, Австралія та Океанія, Африка, Європа та Азія. Дані відфільтровані за умовами "Особливості карти".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.