Преобразование файла OSM в шейп-файл (или фрейм данных) в R

15

Сегодня я искал дорожный шейп-файл для Австралии. Я закончил тем, что пошел в Geofabrik . Открытая карта улиц содержит данные в .osmформате. Но они не имеют в .shpАвстралии.

Если возможно, я хочу преобразовать osmфайлы в shapefilesформат R. Я искал вокруг, но пока не нашел решения. Есть ли способ к этому? Как вариант, можно ли прочитать файлы osm в R и преобразовать данные во фрейм данных, чтобы я мог рисовать фигуры, используя ggplot2?

Я получил следующий рисунок NZ, используя два шейп-файла с maptoolsи ggplot2. В идеале я хочу выпустить аналогичную карту Австралии.

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

jazzurro
источник
Что вы хотите сделать с дорожными файлами - просто отобразить их на карте или провести какой-нибудь анализ? Шейп-файлы имеют некоторые ограничения; вам может быть лучше использовать другой формат!
Симбамангу
@Simbamangu Я хочу, чтобы изначально отображать дороги на карте. Если не shapefile, какой формат вы рекомендуете использовать с R?
Джазурро

Ответы:

10

Это не решение R, но Quantum GIS (QGIS) - отличный способ достичь того, чего вы хотите.

Вы можете просто загрузить файл .osm (инструмент Добавить вектор), щелкнуть его правой кнопкой мыши в содержании и сохранить как ESRI Shapefile.

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

Путепровод-Turbo Api также доступна для получения экстрактов, краткое руководство по это здесь!

Я запустил быстрый пример, основанный на тегах highway = primary и highway = primary_link (схему тегирования OSM Highway можно посмотреть здесь! ) С использованием мастера на Overpass-Turbo, и изображение ниже было результатом для Victoria.

Затем я экспортировал данные как GeoJSON, загрузил их в QGIS и затем сохранил результат в виде файла формы. (Второе изображение показывает линии и полисы, загруженные в QGIS)

Другой альтернативой является загрузка файла PBF или OSM для области из GeoFabrik и подмножество данных путем извлечения тегов шоссе = * с использованием Osmosis . Если вы хотите регулярно обновлять данные, рекомендуется использовать Osmosis. Если это одноразовая выдержка, Overpass, вероятно, будет проще, даже если вам придется делать это в меньших ограничивающих прямоугольниках из-за ограничений памяти. Вы бы просто применили одни и те же запросы Overpass для разных ограничивающих рамок.

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

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

Марк Купитт
источник
2
Nat так просто, как вы думаете: файл australia.osm.pbf имеет размер 195 МБ (сжатый), поэтому я предполагаю, что при загрузке всех данных произойдет сбой QGIS. Я предлагаю отфильтровать желаемую дорожную информацию с помощью osmfilter или osmosis до подачи данных в QGIS.
AndreJ
@ Андре, действительная точка, обновит ответ соответствующим образом!
Марк Купитт
1
Большое спасибо, что дали мне знать другой способ справиться с моей задачей. Я узнал что-то новое от вас. Приветствия.
Джазурро
10

@jazzurro, вы прекрасно можете сделать это с помощью R, просто посмотрите пакет osmar! Прочитайте документацию 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 ( osmar.r-forge.r-project.org/RJpreprint.pdf ). На страницах 11 с. Вы можете найти подробный пример извлечения дорог / автомагистралей по соответствующим тегам для munich.osm! После извлечения и извлечения данных из файла планеты для Австралии вы можете преобразовать их в любой формат! ps: удалил другую ссылку из OP, поскольку это не касалось работы с 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
  • Убедитесь, что вы знаете, какой слой вы хотите сохранить как шейп-файл:

    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, так как они намного меньше.

gkcn
источник
FYI, последняя скомпилирован rgdalдля окон как для 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проект и запросить, чтобы в GDALдвоичных файлах Windows была включена поддержка Expat и SQLite .
gkcn
Или вы можете создать его самостоятельно с помощью MinGW в Windows и включить Expat и SQLite: trac.osgeo.org/gdal/wiki/BuildingWithMinGW
gkcn
1

osm2shp.ru здесь вы можете скачать данные openstreetmap в формате shapefiles. Данные разделены по регионам: Северная и Южная Америка, Австралия и Океания, Африка, Европа и Азия. 61 слой для загрузки. Данные отфильтрованы по условиям «Особенности карты».

Сергей Костин
источник