Büyük raster R veya Python kullanarak çoklu çizgiye dönüştürmenin en hızlı yolu?


14

Küresel su kütleleri (1 bit değerleri 0 ve 1) ile büyük bir raster dosyası (129600 x 64800 piksel) var ve okyanus ve iç su kıyıları çıkarmaya çalışın.

Rasterden çoklu çizgiye dönüştürmek için ArcGIS ve QGIS ile denedim, ancak zaman alır.

Bu görev için daha iyi / daha hızlı bir yol (Python veya R) veya daha iyi bir araç bilen var mı?

Güncelleme

  • R: rasterToContour hızlı ve hassas olabilir, ancak benimki gibi çok büyük bir veri kümeniz (8.398.080.000 piksel) varsa, çok büyük miktarda RAM'e (16GB'dan fazla) ihtiyacınız vardır veya R'yi sabit sürücüde daha fazla işlem yapmaya zorlarsınız ve yaş da alacaktır.
  • Python / GDAL: gdal_poligonize, çoklu çizgiler yerine çokgenler oluşturur

Güncelleme 2

  • R rasterToContour: rasterToContour istenen sonuçları sağlamaz. ArcGIS (raster-poligon ve ardından özellik-çizgi) ile karşılaştırıldığında, aşağıdaki örneklerde gösterildiği gibi tam piksel anahattını çıkarmaz.

rasterToContour sonucu rasterToContour sonucu

ArcGIS sonucu ArcGIS sonucu

GÜNCELLEME 3

Python / GDAL: Test veri kümesinde ArcGIS'e karşı komut satırından gdal_polygonize çalıştırdım ve sonuçlar son derece açıktı:

  • gdal: 49 saniye
  • ArcGIS: 1.84 saniye

Bunu yaptı, bkz. Güncelleme 3.
Generic Wevers

Bu test veri kümesini sağlayabilir misiniz, böylece önerilen alternatiflerin daha hızlı olup olmadığını görebilir ve / veya gerekli sonuçları üretebilir miyiz?
Kersten

Böyle büyük bir tarama için, gdal kütüphanesi ile C / C ++ kullanmak daha iyi olurdu.
Rodrigo

Yanıtlar:


8

Ben R ile çalışan ve alışkınım rasterToPolygonsdan rastergeçmişte paketin ama şimdi tercih gdal_polygonizeRJohn Baumgartner tarafından. Buna dayanır gdal_polygonize.pyve çok daha hızlıdır. John Baumgartner kodu yayınladı ve blogunda kullanım için bir örnek verdi .

Python'a aşina iseniz, gdal_polygonize.pydoğrudan elbette kullanabilirsiniz .


1
Ben veririm denerim. En son gdal_polygonize.py kullandığımda ArcGIS hala daha hızlıydı.
Generic Wevers

ArcGis'in bu gdaldan daha hızlı olmasını beklemiyordum. @Generic Militzer
Iris

Ah bekle, bu çokgenler yaratacak ama ben polinlere ihtiyacım var.
Generic Wevers

Verilerinizi bir Dosya Coğrafi Veritabanına koyarsanız oldukça hızlıdır. Ama yine de yeterince hızlı değil. Bu yüzden alternatifler arıyorum.
Generic Wevers

2
Çokgen elde etmeniz bir sorun olmak zorunda değildir, onları her zaman polinine dönüştürebilirsiniz (ancak, bununla birlikte elbette biraz zaman alabilir).
Martin

7

Gelecek nesiller için, bu tür işlemleri hızlı bir şekilde yapmak için stars::paketle başarılı oldum 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)

resim açıklamasını buraya girin

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

resim açıklamasını buraya girin


5

Deneyin rasterToContourgelen raster paketinin.

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)

resim açıklamasını buraya girin

Daha sonra, aşağıdaki kodu kullanarak dosyaları yerel bir klasöre, örneğin 'ESRI Şekil Dosyası' (.shp) gibi kolayca yazabilirsiniz. Göz at ogrDriversgelen rgdal sistem ile uyumlu olan sürücüler öğrenmek için.

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

Parmaklarımın üzerinde durmaya çalışacağım, RAM'imi öldürmeyecek. Umarım yeterli olan 16GB'ım olmasına rağmen, R bazen büyük raster dosyalarıyla çok verimli değildir. Ama bir bakalım.
Generic Wevers

Dönüşüm bir şekilde çalıştı, ancak ayrıntılı bir şekilde kontrol edemedim. Genellikle raster veri işlemeye daha fazla girdiğim için, SpatialLineDataFrame'i bir şekil dosyasına veya karşılaştırılabilir bir şeye nasıl aktarabileceğimi söyleyebilir misiniz? Katman adını (OGRwrite) bilmediğim için googled ve hala mücadele ediyorum.
Generic Wevers

Haha, kesinlikle görüşünü görüyorum. Yukarıdaki güncellemeye bakın.
fdetsch

2
Başka bir ipucu: 'maxpiksel'leri rasterToContourdaha yüksek bir değere ayarlamaya çalışın , örneğin 1e + 9. Sonrasında daha fazla ayrıntı elde edeceksiniz. Varsayılan ayar oldukça genelleştirilmiş kontur çizgileri oluşturur.
fdetsch

1
resampleVerilerinizi daha kaba bir uzamsal çözünürlükle istemiyorsanız , hayal edebildiğim tek çözüm, verilerinizi birden fazla rasterToContourdöşemeye (örn. 16 alt-rastlayıcı) bölmek, ardından her döşemede ayrı ayrı yinelemeli bir şekilde işlem yapmak ve Son olarak, mergeortaya çıkan şekil dosyaları büyük bir şekil dosyasına dönüştürülür. İlgilenmeniz durumunda, çalışma grubumuzun paketi Rsenal , büyük bir rasterdensplitRaster birden fazla alt-raster oluşturmak için çağrılan bir işlev sunar .
fdetsch

2

GDAL'ın büyük bir hayranıyım, ancak çokgenleştirme aracı uygulamalarım için de çok yavaştı.

Hızlı bir alternatiftir gdal_trace_outlinedan Dans GDAL komut da daha fazla seçenek ilişkin toleransı vardır, çörek, vb

Bunun gibi gdal_polygonize, daha sonra dönüştürmeniz gereken çokgenler de üretir ogr2ogr -nlt MULTILINESTRING.

Bunun bir dezavantajı, bir Linux veya Mac OsX Sisteminde değilseniz, kendiniz derlemeniz gerekir.


Maalesef şu hata mesajıyla başarısız oldu: "Segmentasyon hatası (çekirdek boşaltıldı)". Dosyamın çok büyük veya daha kesin olduğunu tahmin ediyorum, çok fazla küçük çokgen üretecek.
Generic Wevers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.