การแปลงไฟล์ osm เป็น shapefile (หรือ data frame) ใน R


15

ฉันกำลังมองหาไฟล์รูปร่างถนนสำหรับออสเตรเลียในวันนี้ ฉันสิ้นสุดขึ้นไปGeofabrik Open Street Map มีข้อมูลใน.osmรูปแบบ แต่พวกเขาไม่ได้มีหนึ่งใน.shpสำหรับออสเตรเลีย

ถ้าเป็นไปได้ฉันต้องการแปลงosmไฟล์เป็นshapefilesใช้ R. ฉันได้ค้นหาไปแล้ว แต่ยังไม่พบวิธีแก้ไข มีวิธีการนี้หรือไม่? อีกวิธีหนึ่งเป็นไปได้ไหมที่จะอ่านไฟล์ osm เป็น R และแปลงข้อมูลเป็น data frame เพื่อให้ฉันสามารถวาดรูปโดยใช้ggplot2?

ฉันได้ประสบความสำเร็จในภาพต่อไปนี้ของนิวซีแลนด์ใช้สอง shapefiles ด้วยและmaptools ggplot2เป็นการดีที่ฉันต้องการสร้างแผนที่ที่คล้ายกันของออสเตรเลีย

ป้อนคำอธิบายรูปภาพที่นี่


คุณต้องการทำอะไรกับไฟล์ถนน - เพียงแค่แสดงมันบนแผนที่หรือการวิเคราะห์บางอย่าง? Shapefiles มีข้อ จำกัด บางประการ คุณอาจจะดีกว่าโดยใช้รูปแบบอื่น!
Simbamangu

@Simbamangu ฉันต้องการแสดงถนนเป็นครั้งแรกบนแผนที่ หากไม่ใช่ shapefile คุณแนะนำรูปแบบใดให้ใช้กับ R
jazzurro

คำตอบ:


10

นี่ไม่ใช่โซลูชัน R แต่Quantum GIS (QGIS)เป็นวิธีที่ยอดเยี่ยมในการบรรลุสิ่งที่คุณต้องการ

คุณสามารถโหลดไฟล์. osm (เพิ่มเครื่องมือ Vector) คลิกขวาในสารบัญและบันทึกเป็นไฟล์ ESRI Shapefile

QGIS อาจมีปัญหากับสารสกัดขนาดใหญ่ดังนั้นเพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้เครื่องมือ OSMเช่นOverPass APIเพื่อดาวน์โหลดเฉพาะสิ่งที่คุณต้องการโดยใช้กล่องขอบ

สะพานลอย-Turbo Api นอกจากนี้ยังมีที่จะได้รับสารสกัดจากกวดวิชาสั้น ๆ เกี่ยวกับที่อยู่ที่นี่!

ฉันวิ่งตัวอย่างรวดเร็วโดยใช้ทางหลวง = primary และ highway = primary_link tags (โครงการการติดแท็กทางหลวง OSM สามารถดูได้ที่นี่! ) โดยใช้ตัวช่วยสร้างบน Overpass-Turbo และภาพด้านล่างเป็นผลลัพธ์สำหรับ Victoria

ฉันส่งออกข้อมูลเป็น GeoJSON แล้วโหลดลงใน QGIS จากนั้นบันทึกผลลัพธ์เป็นไฟล์รูปร่าง (ภาพที่สองแสดงเส้นและ polys ที่โหลดเข้าสู่ QGIS)

ทางเลือกอื่น ๆ คือการดาวน์โหลดไฟล์ PBF หรือ OSM พื้นที่จาก GeoFabrik และย่อยข้อมูลโดยแยกทางหลวง = * แท็กโดยใช้Osmosis หากคุณต้องการอัปเดตข้อมูลเล็กน้อยเป็นประจำออสโมซิสจะเป็นวิธีที่แนะนำให้ดำเนินการต่อไป ถ้ามันเป็นหนึ่งแยกแยก, Overpass อาจจะง่ายขึ้นแม้ว่าคุณจะต้องทำมันในกล่องขนาดเล็กที่มีขอบเขตเนื่องจากหน่วยความจำ จำกัด คุณเพียงแค่ใช้แบบสอบถามแบบยกระดับเดียวกันทำกล่องขอบเขตที่แตกต่างกัน

Highway = ผลลัพธ์ OverPass-Turbo หลัก

โหลด GeoJSON ที่ส่งออกเป็น QGIS แล้ว


2
แน็ตง่ายอย่างที่คุณคิด: australia.osm.pbf มีขนาดใหญ่ 195MB (บีบอัด) ดังนั้นฉันคิดว่ามันจะผิดพลาด QGIS ในการโหลดข้อมูลทั้งหมด ฉันแนะนำให้กรองข้อมูลถนนที่ต้องการด้วย osmfilter หรือ osmosis ก่อนป้อนข้อมูล QGIS ด้วย
AndreJ

@Andre จุดที่ถูกต้องจะปรับปรุงคำตอบอย่างเหมาะสม!
Mark Cupitt

1
ขอบคุณมากที่ให้ฉันรู้วิธีอื่นในการจัดการงานของฉัน ฉันเรียนรู้สิ่งใหม่จากคุณ ไชโย
jazzurro

10

@ jazzurro คุณสามารถทำได้อย่างสมบูรณ์แบบด้วย R เพียงค้นหาแพ็คเกจ osmar! อ่านเอกสารของ osmar (osmar.r-forge.r-project.org/RJpreprint.pdf) ที่หน้า 11 หน้าคุณสามารถค้นหาตัวอย่างโดยละเอียดสำหรับการแยกถนน / ทางหลวงด้วยแท็กตามรายการสำหรับ munich.osm! หลังจากดึงและแยกข้อมูลจากไฟล์ดาวเคราะห์สำหรับออสเตรเลียคุณสามารถแปลงเป็นรูปแบบใดก็ได้ที่คุณต้องการ!

แก้ไข:

เนื่องจากนักวิจารณ์บางคนบ่นว่าไม่มีตัวอย่างฉันจะโพสต์ตัวอย่างจากเอกสาร IMHO ไม่จำเป็นที่จะต้องพิมพ์ตัวอย่างที่มีอยู่อีกครั้งที่นี่ใช่ไหม

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ไฟล์เป็น data frame ได้หรือไม่ เมื่อดูอย่างรวดเร็วดูเหมือนว่าไม่มีวิธีการแปลง.osmไฟล์ไปยังกรอบข้อมูลโดยตรง หรือว่ามี
jazzurro

อ่านเอกสารของ osmar ( osmar.r-forge.r-project.org/RJpreprint.pdf ) .. ที่หน้า 11 หน้าคุณสามารถหาตัวอย่างโดยละเอียดสำหรับการแยกถนน / ทางหลวงโดยใช้แท็กตามmunich.osm! หลังจากดึงและแยกข้อมูลจากไฟล์ดาวเคราะห์สำหรับออสเตรเลียคุณสามารถแปลงเป็นรูปแบบใดก็ได้ที่คุณต้องการ! PS: ลบการเชื่อมโยงอื่น ๆ จาก OP เช่นนี้ไม่ได้อยู่กับการซื้อขาย OSM ไฟล์ ..
เคย์

1
สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
SS_Rebelious

@SS_Rebelious มันชัดเจนให้คำตอบ ฉันไม่รู้ว่าคุณกำลังพยายามพูดอะไร
Kay

@Kay เพื่อให้คำตอบนี้ดีขึ้นคุณสามารถอธิบายวิธีใช้แพ็คเกจ osmar เพื่อรับผลลัพธ์ที่ต้องการ
Zachary

7

ตกลงมาที่นี่คำตอบที่ถูกต้อง:

  • ตรวจสอบให้แน่ใจว่าrgdalติดตั้ง (version> = 1.0.4)

    install.packages('rgdal')
    packageVersion('rgdal')
    
    [1]1.0.4
  • ตรวจสอบให้แน่ใจว่าgdalติดตั้ง (version> = 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 เนื่องจากมีขนาดเล็กกว่ามาก


fyi, รวบรวมล่าสุดrgdalสำหรับ windows สำหรับคือ 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 ) เกี่ยวกับGDALwindows ไบนารีฉันไม่รู้คุณสามารถยื่นรายงานบั๊กกับGDALโปรเจ็กต์และร้องขอให้เปิดใช้งานการสนับสนุน Expat และ SQLite ในGDALไบนารีของWindows
gkcn

หรือคุณสามารถสร้างมันเองโดยใช้ MinGW บน Windows และเปิดใช้งาน Expat และ SQLite: trac.osgeo.org/gdal/wiki/BuildingWithMinGW
gkcn

1

osm2shp.ru ที่นี่คุณสามารถดาวน์โหลดข้อมูล openstreetmap ในรูปแบบ shapefiles ข้อมูลถูกแบ่งตามภูมิภาค: อเมริกาเหนือและใต้, ออสเตรเลียและโอเชียเนีย, แอฟริกา, ยูโรปาและเอเชียชั้น 69 สำหรับการดาวน์โหลด ข้อมูลถูกกรองตามเงื่อนไข "คุณสมบัติของแผนที่"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.