Najlepszy sposób na wycięcie dużego pliku rastrowego ECW?


9

Próbuję przyciąć duży ECW (szczegóły poniżej), ale plik rastrowy jest zbyt duży, aby go w całości przetworzyć.

Niektóre szczegóły ECW poniżej

Sterownik: falki skompresowane ECW / ERDAS (SDK 5.0)

rozmiar pliku: 50 gb Rozmiar to 450000, 565081 Rozmiar piksela: 0,15 0,15 COLORSPACE = RGB COMPRESSION_RATE_TARGET = 9 WERSJA = 2 Liczba pasm: 4

Obszar, który chcę wyciąć, to w przybliżeniu 1/5 oryginalnego pliku.

Oto metody, które wypróbowałem bezskutecznie:

  1. Użyłem Arcgis do zapisania ecw do tiff / innych formatów ... (szybko się poddałem)

  2. Użyłem Qgis i jego narzędzia do strzyżenia ... tworzenie pliku zatrzymało się na około 40%.

  3. Użyto gdal_translate z OSGeo4W z innymi opcjami niż Qgis. (Próbowałem tego myślenia, że ​​MAYBE zwalniając trochę pamięci, nie używając Qgis, przydałoby się)

  4. Użyłem gdal_retile, myśląc, że pocię obraz na kawałki i złapię ten, który chciałem. Polecenie „gdal_retile -ps 10000 10000 -of ecw -tileIndex tile.shp -targetDir input.ecw To się zawiesiło jeszcze szybciej”

Czy ktoś ma pomysł?

Aby uzyskać informacje, uruchamiam Windows 7 64 bity na i5-3470 3,2 GHz z 16 GB pamięci RAM.

Odpowiedzi:


5

Inne pomysły, które możesz wypróbować:

  1. gdal_translate z przełącznikiem -srcwin
  2. gdalwarp z przełącznikami -cutline i -crop_to_cutline i -wm. Ostatni określa pamięć do buforowania i może pomóc w rozwiązaniu problemów z użyciem maszynki do strzyżenia w QGIS (ponieważ jest to zasadniczo ta sama funkcja)
  3. Kalkulator rastrowy QGIS ustawiający zasięg do żądanego obszaru (prostsze niż maszynka do strzyżenia).
  4. SAGA-> Clip grid with polygon - kto wie, może być bardziej wydajna pamięć.
  5. Koduj rozwiązanie za pomocą Pythona i Numpy / SciPy, aby odczytać tylko podzbiór rastra do pamięci i zapisać go.

Podejrzewam, że wykonanie bardzo prostego kadrowania do pewnego stopnia (za pomocą kalkulatora rastrowego lub przełącznika -srcwin w gdal_translate) będzie mniej wymagało pamięci niż przycinanie wielokąta, ponieważ nie masz żadnych kontroli geometrii i konwersji. Opcja 5 powinna wykorzystywać najmniej pamięci, ponieważ czytasz tylko to, czego potrzebujesz. Zajrzyj do tego samouczka, jeśli potrzebujesz poradnika (dostosuj bit do czytania i pisania według bloków).


Dziękuję za odpowiedź! Wypróbuję SAGA, a jeśli to nie zadziała, spróbuję z Numpy.
Blue

5

Możesz go wyciąć bezpośrednio za pomocą narzędzia gdal gdal_translate, jeśli znasz współrzędne swojego obszaru zainteresowania, jeśli jest georeferencyjny:

gdal_translate -projwin [ulx uly lrx lry] infile outfile  

Jeśli nie, użyj -srswinflagi w ten sposób:

gdal_translate -srcwin [xoff yoff xsize ysize] infile outfile.

Inną opcją jest zbudowanie „wirtualnego” rastra (kilku kilobajtów), który wskazuje na twój początkowy zestaw danych, za pomocą gdalbuildvrt .

gdalbuildvrt -te [xmin ymin xmax ymax] infile outfile.vrt

Niestety do korzystania z gdalbuildvrt potrzebny będzie plik georeferencyjny.

Po przycięciu nie zapomnij utworzyć piramid w celu łatwego oglądania. Następujące polecenie zbuduje zewnętrzne piramidy skompresowane algorytmem DEFLATE (bezstratnym):

gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16

Na koniec możesz obliczyć statystyki, aby uniknąć głupich problemów z konkretnym programem komercyjnym:

gdalinfo -stats outfile

Dzięki za odpowiedź nickves. Zbudowałem wirtualny raster i uruchomiłem <code> gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16 </code> Nie jestem pewien, dlaczego otrzymałem następujący komunikat o błędzie BŁĄD 1: Nie można utworzyć pliku TIFF z powodu braku kodek DEFLATE. Budowanie przeglądu nie powiodło się.
Niebieski,

Sprawdź błędy qgis-bug: 8782 i osge4w-bug: 382, jeśli opisują twój przypadek. W międzyczasie spróbuj utworzyć przeglądy bez żadnych algorytmów kompresji lub wybierz inny .
nickves

wygląda na to, że działałem w 2 krokach: gdaladdo -ro input.vrt 2 4 8 16wtedy gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE input.vrt 2 4 8 16. Moim celem jest skończenie z ECW, więc spróbowałem gdal_translate -of ECW input.vrt output.ecw i dostałem następujący błąd:0ERROR 6: GDALDriver::Create() ... no create method implemented for this format.
Niebieski,

@blue ECW jest zastrzeżonym formatem i wymaga specjalnego traktowania. Najpierw sprawdź, czy gdal może pisać w ECW gdalinfo --formats. Jeśli nie widzisz ECW na liście, wypróbuj te instrukcje: faunalia.pt/node/438
nickves

0

Prosty „klip” gdalwarppowinien działać (wiem, że jest to odwieczne pytanie: 18 miesięcy IRL jest jak epoka geologiczna w latach internetowych).

Mam antenę 70 Gb (ECW, 94000 x 81000 pikseli przy 10 cm / px), a GDAL może dowolnie przyciąć ją za pomocą pliku kształtu za pomocą

gdalwarp -cutline [clipfile] -crop_to_cutline [infile] [outfile]

w wierszu polecenia systemu Windows. (Zdaję sobie sprawę, że to rozwiązanie wymaga zbudowania pliku kształtu dla docelowego obszaru zainteresowania, ale nie jest to największe wyzwanie znane GIS).

Wyodrębnienie fragmentu wielkości połowy przedmieścia zajmuje ~ 0,4 sekundy; podzielenie pliku na ćwiartki zajmuje 4 sekundy. Specyfikacja mojego komputera nie różni się znacząco (i7-4770 @ 3,4 GHz, 16 GB pamięci RAM, Win7-64 Ultimate).


gdalwarp został już wspomniany. Informacje na temat wydajności i konkretnego przykładowego rozmiaru obrazu są mile widzianym dodatkiem, ale tak naprawdę powinien to być komentarz do gis.stackexchange.com/a/74450/108 (mile widziane byłoby również sugerowanie edycji za pomocą wiersza poleceń z formatowaniem kodu ; łatwiej jest czytać)
mat wilkie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.