วิธีที่เร็วที่สุดในการแปลงแรสเตอร์ขนาดใหญ่เป็นแบบหลายเส้นโดยใช้ R หรือ Python?


14

ฉันมีไฟล์แรสเตอร์ขนาดใหญ่ (129,600 คูณ 64,800 พิกเซล) ที่มีแหล่งน้ำทั่วโลก (1 บิตค่า 0 และ 1) และพยายามที่จะแยกมหาสมุทรและชายฝั่งน้ำจืด

ฉันได้ลองกับ ArcGIS และ QGIS เพื่อแปลงจาก raster เป็น polyline แต่ใช้เวลานาน

มีใครรู้วิธีที่ดีกว่า / เร็วกว่า (Python หรือ R) หรือเป็นเครื่องมือที่ดีกว่าสำหรับงานนี้หรือไม่?

ปรับปรุง

  • R: rasterToContour อาจเร็วและแม่นยำ แต่ถ้าคุณมีชุดข้อมูลขนาดใหญ่มากเช่นฉัน (8,398,080,000 พิกเซล) คุณต้องมี RAM จำนวนมาก (มากกว่า 16GB) หรือบังคับ R เพื่อทำการประมวลผลเพิ่มเติมบนฮาร์ดไดรฟ์และมัน จะใช้เวลานานด้วย
  • Python / GDAL: gdal_poligonize สร้างรูปหลายเหลี่ยมแทนโพลีน

อัปเดต 2

  • R rasterToContour: rasterToContour ไม่ส่งผลลัพธ์ที่ต้องการ เมื่อเปรียบเทียบกับ ArcGIS (แรสเตอร์ถึงรูปหลายเหลี่ยมตามด้วยคุณสมบัติต่อบรรทัด) จะไม่แยกเค้าร่างพิกเซลที่แน่นอนดังที่แสดงในตัวอย่างด้านล่าง

ผล rasterToContour ผล rasterToContour

ผล ArcGIS ผล ArcGIS

อัพเดท 3

Python / GDAL: ฉันรัน gdal_polygonize จาก command line กับ ArcGIS ในชุดข้อมูลการทดสอบและผลลัพธ์ชัดเจนมาก:

  • gdal: 49 วินาที
  • ArcGIS: 1.84 วินาที

ทำเช่นนั้นดูอัปเดต 3
Wevers ทั่วไป

คุณสามารถให้ชุดข้อมูลทดสอบนั้นเพื่อให้เราสามารถดูว่าทางเลือกที่เสนอนั้นเร็วกว่าและ / หรือให้ผลลัพธ์ที่ต้องการหรือไม่
Kersten

สำหรับแรสเตอร์ขนาดใหญ่เช่นนี้คุณจะสามารถใช้ C / C ++ กับห้องสมุด gdal ได้ดีขึ้น
Rodrigo

คำตอบ:


8

ฉันทำงานกับ R และใช้rasterToPolygonsจากrasterแพ็คเกจในอดีต แต่ตอนนี้ฉันชอบgdal_polygonizeRโดย John Baumgartner มันขึ้นอยู่กับ gdal_polygonize.pyและเร็วกว่ามาก จอห์น Baumgartner ตีพิมพ์รหัสและให้ตัวอย่างสำหรับการใช้งานของเขาในบล็อก

หากคุณคุ้นเคยกับงูหลามคุณสามารถใช้gdal_polygonize.pyโดยตรงได้แน่นอน


1
ฉันจะลองดู ครั้งล่าสุดที่ฉันใช้ gdal_polygonize.py ArcGIS ยังเร็วกว่านี้
Wevers ทั่วไป

ฉันไม่ได้คาดหวังว่า ArcGis จะเร็วขึ้นเท่านี้ @Generic Militzer
Iris

เดี๋ยวก่อนนี่จะสร้างรูปหลายเหลี่ยม แต่ฉันต้องการ polylines
Wevers ทั่วไป

หากคุณใส่ข้อมูลลงในไฟล์ Geodatabase มันจะค่อนข้างเร็ว แต่ก็ยังไม่เร็วพอ นั่นเป็นเหตุผลที่ฉันกำลังค้นหาทางเลือก
Wevers ทั่วไป

2
มันไม่ได้เป็นปัญหาที่คุณจะได้รับรูปหลายเหลี่ยมคุณสามารถแปลงให้เป็นโพลีนได้เสมอ
Martin

7

สำหรับลูกหลานฉันประสบความสำเร็จกับstars::แพ็คเกจในRการดำเนินการประเภทนี้อย่างรวดเร็ว

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

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

plot(r)
plot(x, add = TRUE)

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


5

ลองrasterToContourจากแพ็คเกจแรสเตอร์

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

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

จากนั้นคุณสามารถเขียนไฟล์ไปยังโฟลเดอร์ในเครื่องได้อย่างง่ายดายเช่น 'ESRI Shapefile' (.shp) โดยใช้รหัสด้านล่าง ลองดูogrDriversจากrgdalเพื่อดูว่าไดรเวอร์ของคุณใช้กับระบบใดได้บ้าง

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")

ฉันจะพยายามให้นิ้วของคุณข้ามมันจะไม่ฆ่าแรมของฉัน แม้ว่าฉันมี 16GB ซึ่งหวังว่าจะเพียงพอ แต่บางครั้ง R ก็ไม่ได้มีประสิทธิภาพเท่านี้เมื่อใช้ไฟล์แรสเตอร์ขนาดใหญ่ แต่มาดูกัน
Wevers ทั่วไป

การแปลงใช้งานได้ แต่ฉันไม่สามารถตรวจสอบรายละเอียดได้ ขณะที่ฉันมักจะเข้าสู่การประมวลผลข้อมูลแรสเตอร์คุณสามารถบอกฉันได้ว่าฉันสามารถถ่ายโอน SpatialLineDataFrame ไปยังรูปร่างไฟล์หรืออะไรที่เทียบเคียงได้ ฉัน googled และยังคงดิ้นรนเนื่องจากฉันไม่รู้ชื่อเลเยอร์ (OGRwrite)
Wevers ทั่วไป

ฮ่าฮ่าฉันเห็นประเด็นของคุณอย่างแน่นอน ดูการปรับปรุงด้านบน
fdetsch

2
คำแนะนำอื่น: ลองตั้งค่า 'maxpixels' rasterToContourเป็นค่าที่สูงกว่าเช่น 1e + 9 คุณจะจบลงด้วยรายละเอียดเพิ่มเติมแล้ว การตั้งค่าเริ่มต้นสร้างเส้นชั้นความสูงที่ค่อนข้างกว้าง
fdetsch

1
หากคุณไม่ต้องการให้resampleข้อมูลของคุณมีความละเอียดเชิงพื้นที่ที่หยาบกว่าวิธีแก้ปัญหาเดียวที่ฉันนึกได้ก็คือการแยกข้อมูลของคุณออกเป็นหลายไทล์ (เช่น 16 raster ย่อย) จากนั้นจึงทำการrasterToContourแยกแต่ละกระเบื้องในลักษณะซ้ำและ ในที่สุดmergeรูปร่างที่เกิดขึ้นจะกลายเป็นไฟล์ขนาดใหญ่เพียงไฟล์เดียว ในกรณีที่คุณมีความสนใจแพคเกจของคณะทำงานของเราRsenalนำเสนอฟังก์ชั่นที่เรียกว่าsplitRasterสร้าง sub-rasters หลาย ๆ แบบจากแรสเตอร์ขนาดใหญ่หนึ่งอัน
fdetsch

2

ในขณะที่ฉันเป็นแฟนตัวยงของ GDAL เครื่องมือรูปหลายเหลี่ยมนั้นช้าเกินไปสำหรับแอปพลิเคชันของฉันเช่นกัน

ทางเลือกที่รวดเร็วนั้นgdal_trace_outlineมาจากสคริปต์ Dans GDALซึ่งมีตัวเลือกเพิ่มเติมเกี่ยวกับความทนทานต่อโดนัท ฯลฯ

เช่นนี้ยังผลิตรูปหลายเหลี่ยมที่คุณจะต้องแปลงหลังจากนั้นด้วยgdal_polygonizeogr2ogr -nlt MULTILINESTRING

ข้อเสียคือคุณต้องรวบรวมด้วยตัวคุณเองยกเว้นว่าคุณใช้ระบบปฏิบัติการ Linux หรือ Mac OsX


น่าเสียดายที่มันล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาด: "การแบ่งกลุ่มผิดพลาด (การทุ่มตลาดหลัก)" ฉันเดาว่าไฟล์ของฉันมีขนาดใหญ่เกินไปหรือแม่นยำกว่านี้มันจะสร้างรูปหลายเหลี่ยมขนาดเล็กจำนวนมากเกินไป
Wevers ทั่วไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.