Chuyển đổi tệp osm thành shapefile (hoặc khung dữ liệu) trong R


15

Tôi đã tìm kiếm một shapefile đường cho Úc ngày hôm nay. Tôi cuối cùng đã đi đến Geofabrik . Open Street Map có dữ liệu ở .osmđịnh dạng. Nhưng họ không có ở .shpÚc.

Nếu có thể, tôi muốn chuyển đổi các osmtệp thành shapefilessử dụng R. Tôi đã tìm kiếm xung quanh, nhưng tôi chưa tìm thấy giải pháp. Có cách nào để làm điều này? Ngoài ra, có thể đọc các tệp osm vào R và chuyển đổi dữ liệu sang khung dữ liệu để tôi có thể vẽ các số liệu bằng cách sử dụng ggplot2không?

Tôi đã đạt được đồ họa sau đây của New Zealand bằng cách sử dụng hai shapefile với maptoolsggplot2. Lý tưởng nhất, tôi muốn sản xuất một bản đồ tương tự của Úc.

nhập mô tả hình ảnh ở đây


Bạn muốn làm gì với các tệp đường - chỉ hiển thị chúng trên bản đồ hoặc một loại phân tích nào đó? Shapefiles có một số hạn chế; bạn có thể tốt hơn bằng cách sử dụng định dạng khác!
Simbamangu

@Simbamangu Tôi muốn hiển thị đường ban đầu trên bản đồ. Nếu không phải là shapefile, bạn khuyên dùng định dạng nào với R?
jazzurro

Câu trả lời:


10

Đây không phải là một giải pháp R, nhưng Quantum GIS (QGIS) là một cách tuyệt vời để đạt được những gì bạn muốn.

Bạn có thể chỉ cần tải tệp .osm (công cụ Thêm Vector), nhấp chuột phải vào tệp Mục lục và Lưu dưới dạng Shapefile ESRI.

QGIS có thể gặp sự cố với một trích xuất lớn như vậy, vì vậy, để tránh điều này, bạn có thể sử dụng Công cụ OSM như API OverPass để chỉ tải xuống những gì bạn cần bằng cách sử dụng các hộp giới hạn.

Các cầu vượt-Turbo Api cũng có sẵn để có được chiết xuất, một hướng dẫn ngắn về đó là đây!

Tôi đã chạy một ví dụ nhanh dựa trên thẻ Highway = sơ cấp và đường cao tốc = thẻ chính_link (Lược đồ gắn thẻ đường cao tốc OSM có thể xem tại đây! ) Bằng cách sử dụng Trình hướng dẫn trên Overpass-Turbo và hình ảnh bên dưới là kết quả cho Victoria.

Sau đó, tôi đã xuất dữ liệu dưới dạng GeoJSON, tải dữ liệu đó vào QGIS sau đó lưu kết quả dưới dạng tệp hình dạng. (Hình ảnh thứ hai cho thấy các dòng và polys được tải vào QGIS)

Cách khác là tải xuống tệp PBF hoặc OSM cho khu vực từ GeoFabrik và tập hợp dữ liệu bằng cách trích xuất các thẻ Highway = * bằng cách sử dụng Osmosis . Nếu bạn muốn cập nhật dữ liệu thường xuyên, thì Thẩm thấu sẽ là cách được khuyến nghị để tiến hành. Nếu nó là một trích xuất một lần, Overpass có thể sẽ dễ dàng hơn, mặc dù bạn phải thực hiện nó trong các hộp giới hạn nhỏ hơn vì giới hạn bộ nhớ. Bạn sẽ chỉ áp dụng các truy vấn Overpass giống nhau cho các hộp giới hạn khác nhau.

Đường cao tốc = Kết quả OverPass-Turbo chính

Đã xuất GeoJSON được tải vào QGIS


2
Đơn giản như bạn nghĩ: australia.osm.pbf có dung lượng lớn 195 MB (được nén), vì vậy tôi cho rằng nó sẽ làm hỏng QGIS để tải tất cả dữ liệu. Tôi đề nghị lọc thông tin đường mong muốn bằng osmfilter hoặc thẩm thấu trước khi cung cấp dữ liệu cho QGIS.
AndreJ

@Andre, điểm hợp lệ, sẽ cập nhật câu trả lời phù hợp!
Mark Cupitt

1
Cảm ơn bạn rất nhiều cho tôi biết một cách khác để xử lý công việc của tôi. Tôi đã học được điều gì đó mới từ bạn. Chúc mừng.
jazzurro

10

@jazzurro, bạn hoàn toàn có thể làm điều này với R, chỉ cần tra cứu gói osmar! Đọc tài liệu osmar (osmar.r-forge.r-project.org/RJpreprint.pdf). Tại trang 11 trang, bạn có thể tìm thấy một ví dụ chi tiết để trích xuất đường / đường cao tốc bằng các thẻ theo munich.osm! Sau khi lấy và trích xuất dữ liệu từ tệp hành tinh cho Úc, bạn có thể chuyển đổi sang bất kỳ định dạng nào bạn muốn!

Biên tập:

Vì một số nhà bình luận đã phàn nàn về việc thiếu các ví dụ, tôi sẽ đăng một ví dụ từ các tài liệu. IMHO không cần thiết phải gõ lại các ví dụ hiện có ở đây, phải không?

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

nhập mô tả hình ảnh ở đây


Cảm ơn bạn rất nhiều về đường link dẫn. Tôi đã thấy một hoặc hai bài viết liên quan đến gói. Nhưng tôi không chắc liệu gói có thể chuyển đổi .osmtập tin thành khung dữ liệu hay không. Nhìn nhanh, có vẻ như không có cách nào trực tiếp để chuyển đổi .osmtập tin thành khung dữ liệu. Hay là có?
jazzurro

Đọc tài liệu osmar ( osmar.r-forge.r-project.org/RJpreprint.pdf ) .. Tại trang 11 trang, bạn có thể tìm thấy một ví dụ chi tiết để trích xuất đường / đường cao tốc bằng các thẻ theo munich.osm! Sau khi lấy và trích xuất dữ liệu từ tệp hành tinh cho Úc, bạn có thể chuyển đổi sang bất kỳ định dạng nào bạn muốn! ps: đã xóa liên kết khác khỏi OP vì điều này không giải quyết được các tệp osm ..
Kay

1
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
SS_Rebelious

@SS_Rebelious, Nó rõ ràng cung cấp một câu trả lời. Tôi không biết bạn đang cố nói gì.
Kay

@Kay Để làm cho câu trả lời này tốt hơn, bạn có thể giải thích cách sử dụng gói osmar để có được kết quả mong muốn.
Zachary

7

OK, đây là câu trả lời chính xác:

  • Đảm bảo rằng rgdal(phiên bản> = 1.0.4) đã được cài đặt

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1]1.0.4
  • Đảm bảo rằng gdal(phiên bản> = 1.11.0) đã được cài đặt

    library(rgdal)
    getGDALVersionInfo()
    
    [1] "GDAL 1.11.2, released 2015/02/10"
  • Đảm bảo rằng gdalđược biên dịch với hỗ trợ Expat / OSM và SQLite:

    c('SQLite', 'OSM') %in% ogrDrivers()$name
    
    [1] TRUE TRUE
  • Đảm bảo rằng bạn biết lớp nào bạn muốn lưu dưới dạng shapefile:

    ogrListLayers('filename.osm.pbf')
    
    [1] "points" "lines" "multilinestrings" "multipolygons"
    attr(,"driver")
    [1] "OSM"
    attr(,"nlayers")
    [1] 4
  • Chúng tôi sẵn sàng để đi:

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

Khi bạn đọc tệp qua readOGR, hãy làm theo các hướng dẫn này để tìm hiểu cách vẽ biểu đồ ggplot2.

Lưu ý rằng bạn cũng có thể đọc .osmcác tệp ở định dạng XML, chỉ cần đảm bảo rằng chúng không bị nén (tức là phần mở rộng .osmkhông .osm.bz2) Nhưng hãy thử sử dụng tệp .osm.pbf vì chúng nhỏ hơn nhiều.


fyi, mới nhất được biên dịch rgdalcho windows cho 0,9-3 và trả lại FALSE FALSEchoc('SQLite', 'OSM') %in% ogrDrivers()$name
aaryno

Để rgdalbạn có thể thử gói nguồn ( cran.r-project.org/src/contrib/rgdal_1.0-4.tar.gz ) hoặc nhị phân oldrel ( cran.r-project.org/bin/windows/contrib/3.1/ rgdal_1.0-4.zip ). Về GDALcửa sổ nhị phân, tôi không biết, bạn có thể gửi báo cáo lỗi cho GDALdự án và yêu cầu hỗ trợ Expat và SQLite phải được bật trong GDALnhị phân Windows .
gkcn

Hoặc bạn có thể tự xây dựng nó bằng MinGW trên Windows và bật Expat và SQLite: trac.osgeo.org/gdal/wiki/Bu kiếmWithMinGW
gkcn

1

osm2shp.ru tại đây bạn có thể tải xuống dữ liệu openstreetmap ở định dạng shapefiles. Dữ liệu được chia theo các khu vực: Bắc và Nam Mỹ, Úc và Châu Đại Dương, Châu Phi, Châu Âu và Châu Á.61 lớp để tải xuống. Dữ liệu được lọc theo điều kiện "Tính năng bản đồ".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.