다중 래스터 병합 결과가 왜 그렇게 큰가요? [닫은]


10

다음과 같이 14 개의 geotiff를 병합하려고합니다.

여기에 이미지 설명을 입력하십시오

각 geotiff는 약 50Mb입니다. 결과물에 지오 틱이 필요합니다.

내 워크 플로우 :

gdalbuildvrt -input_file_list list.txt test.vrt 

(내 목록에는 tif의 이름이 있습니다)

그런 다음 :

gdal_translate -of Gtiff test.vrt test.tif
Input file size is 79841, 59955

작동하지만 결과는 13,3 Gb의 지오 틱입니다! 각각의 50Mb 인 14 개 파일에 대해 13Gb가 아닌 700Mb의 Geotiff를 시도했습니다.

gdal은 기본적으로 압축되지 않는다는 것을 알고 있으므로이 명령을 시도했습니다.

gdal_translate -of Gtiff -co COMPRESS=JPEG test.vrt test_compressed.tif

그러나 파일의 "병합"은 JPEG 압축에 비해 너무 큽니다.

Input file size is 79841, 59955
0ERROR 1: JPEGPreEncode:Strip/tile too large for JPEG
ERROR 1: WriteEncodedTile/Strip() failed.
ERROR 1: JPEGPreEncode:Strip/tile too large for JPEG
ERROR 1: WriteEncodedTile/Strip() failed.
ERROR 1: An error occured while writing a dirty block
...

그래서 다른 워크 플로우를 시도하고 모든 tif를 jpeg (각 14 Mb)로 변환하고 vrt 파일을 빌드하고 LZW 압축으로 변환했습니다. 그러나 출력 geotiff는 약 5Gb입니다.

작업을 수행하는 가장 좋은 방법이 무엇인지, 14 * 50Mb의 지오메트리를 얻을 수 있다면 무엇입니까?

나는 그것을 시도하지는 않았지만이 tif를 포토샵에서 병합 한 다음 왼쪽 위 / 오른쪽 아래 좌표로 다시 지리 참조 할 것을 생각했습니다. 이 워크 플로를 사용하면 14 * 50 Mb가 될 것 같지만 확실하지 않습니다. 그리고 gdal 모범 사례를 배우고 싶기 때문에 지금은 시도하지 않았습니다.


물기 : 입력이 8 비트의 tif이고 내보내기가 기본적으로 32 비트이면 심각한 문제가 발생합니다. 바이트 정의를 그대로 유지하십시오. 그리고 기억하십시오 : 전체 주제가 조사 할 것입니다. tiff는 항상 직사각형이므로 20x 50mb입니다.

이 스크린 샷에서 녹색으로 표시된 숫자는 왼쪽과 오른쪽에서 동일해야합니다.

비트

출력 이미지는 입력 이미지의 합보다 많은 픽셀을 갖지만 이것이 큰 차이를 설명하지는 않습니다. gdalinfo를 기반으로 이미지의 특성을보고 어떤 압축이 사용되는지 확인하고 범위가 올바른지 확인하는 것이 좋습니다.

50Mb의 14 개 tif는 원래 -co COMPRESS = JPEG로 gdal_translate로 처리 한 700Mb의 14 개 tif입니다. Mb의 수를 줄이기 위해 래스터를 압축했지만 좋은 생각이 아니 었습니까?

이 스크린 샷은 동일한 geotiff (01.tif)의 2 개의 gdal 정보를 나타냅니다. 스크린 샷의 왼쪽에는 압축되지 않은 Gtiff의 700Mb의 gdalinfo가 있습니다. 녹색이 다른 50Mb :

01.tif 파일의 비 압축 및 압축 gdalinfo

나에 따르면, qgis에서는 다른 데이터 소스 및 위성 이미지와 일치하기 때문에 범위가 정확합니다.

* 입력 이미지의 크기가 같다고 가정하면 입력 이미지 당 20000 * 12000 픽셀을 생성하는데, 이는 50MB의 이미지에 비해 클 수 있습니다.

"범위를 넘어서"라는 말의 의미를 잘 모르겠습니다. 그러나 QGIS에서 5Gb LZW를 열려고 시도했지만 다른 데이터 소스와 일치하기 때문에 범위가 좋습니다.

당신의 대답은 Gtiff의 크기가 같지 않다는 것을 깨달았습니다. 병합 할 때 크기가 커지는 원인이 될 수 있다고 생각합니까? gdal은 같은 크기의 파일을 선호하기 때문입니다. 크기를 얻기 위해 각 Gtiff에 gdalinfo를 만들었습니다 .Gtiff의 크기에는 매우 작은 차이가 있습니다.

02.tif Size is 19956, 11981
03.tif Size is 19959, 11993
04.tif Size is 19961, 11992
05.tif Size is 19958, 11993
06.tif Size is 19958, 11990
07.tif Size is 19956, 11984
08.tif Size is 19956, 11993
09.tif Size is 19958, 11993
10.tif Size is 19958, 11989
11.tif Size is 19958, 11985
12.tif Size is 19958, 11993
13.tif Size is 19959, 11993
14.tif Size is 19960, 11994

그런 다음 이미지의 픽셀 깊이를 확인해야합니다. 입력이 바이트 단위 인 경우 바이트를 유지해야합니다. gdal_translate -of Gtiff -ot 바이트 -co COMPRESS = LZW test.vrt test.tif

나는이 명령을 시도했지만 gdal은 딱딱한 크기가 초과되었다고 나에게 말했다.

Input file size is 79841, 59955
0...10...20...30...40...50..ERROR 1: TIFFAppendToStrip:Maximum TIFF file size exceeded. Use BIGTIFF=YES creation option.
ERROR 1: WriteEncodedTile/Strip() failed.

그러나 큰 뻣뻣한 것을 만들어야한다면 4GB 이상이기 때문에 문제를 해결하지 못합니다. 필자의 경우 픽셀 심도가 중요합니까? (지도의 HD 사진, DEM이 아닌 지리 참조 됨)

비고 1 : vrt를 만들기 전에 이미지를 jpeg로 변환해도 도움이되지 않으며 데이터가 손실 될 수 있습니다.

약간의 정보를 잃어버린 경우에는 심각하지 않습니다. 물론 풀지 않는 것이 좋지만, 필요한 경우 문제가되지 않습니다. jpeg로 작업하면 출력이 더 밝아 질 것이라고 확신했지만 결론적으로 출력이 Gtiff 일 때는 사실이 아닙니다. 따라서 이것은 좋은 해결책이 아닙니다. 이 솔루션을 포기합니다.

> 비고 2 : vrt 사용이 도움이됩니다 : GTiff가 필요하십니까?

예, Geotiff 입력이 필요한 모바일 응용 프로그램에서 가져와야하기 때문에 Gtiff가 필요합니다 (응용 프로그램은 지형 공간 pdf 입력도 사용할 수 있다고 생각하지만 절대로 작업하지 않으며 문제를 이해하고 싶습니다. gdal, 내가 처음이 아니기 때문에).


-co tiled = yes -co bigtiff = yes -co compress = jpeg -co photometric = ycbcr을 시도하고 -co TILED = yes -co BLOCKXSIZE = 512 -co BLOCKYSIZE = 512를 시도했습니다.

이 두 명령은 잘 작동하며 ~ 700 Mb 크기입니다. 정확히 내가 기대 한 것입니다.

이제 또 다른 문제가 있습니다. QGIS에서 빠르게 열 수 없습니다. 15 분 정도 기다려야합니다 (하지만 QGIS가 tif를 성공적으로 열기 전에 종료합니다). 이유를 모르겠습니다. 그리고 내 안드로이드 앱에서는 작동하지 않습니다 ( "tiled = yes"의 원인 일 수 있습니다). 나는 스스로 문서를 읽어야한다.


사용 -co tiled = yes -co bigtiff = yes -co compress = jpeg -co photometric = ycbcr
user30184

답변:


2

출력 이미지는 입력 이미지의 합보다 많은 픽셀을 갖지만 이것이 큰 차이를 설명하지는 않습니다. gdalinfo를 기반으로 이미지의 특성을보고 어떤 압축이 사용되는지 확인하고 범위가 올바른지 확인하는 것이 좋습니다. (입력 이미지의 크기가 같다고 가정하면 입력 이미지 당 20000 * 12000 픽셀을 만듭니다. 이는 50MB의 이미지에 비해 클 수 있습니다. 모자이크를 만들 때 좌표계의 범위를 넘어서고있을 수 있습니다.) 이미지의 픽셀 깊이를 살펴보십시오. 입력이 바이트 단위 인 경우 바이트를 유지해야합니다.

gdal_translate -of Gtiff -ot Byte -co COMPRESS=LZW test.vrt test.tif 

참고 1 : vrt를 만들기 전에 이미지를 jpeg로 변환해도 도움이되지 않으며 (다음 단계 전에 압축되지 않음) 데이터가 손실 될 수 있습니다.

비고 2 : vrt 사용이 도움이됩니다 : GTiff가 필요하십니까?

편집 : 이미지 크기에는 기적이 없지만 큰 데이터와 함께 jpeg 압축을 사용할 수 있도록 타일 tif를 출력으로 사용해야합니다 (-co TILED = yes -co BLOCKXSIZE = 512 -co BLOCKYSIZE = 512 ). 너무 큰 경우, 유일한 해결책은 gdalwarp를 사용하여 낮은 해상도에서 다시 샘플링하는 것입니다.


물기 : 입력이 8 비트의 tif이고 내보내기가 기본적으로 32 비트이면 심각한 문제가 발생합니다. 바이트 정의를 그대로 유지하십시오. 그리고 기억하십시오 : 전체 주제가 조사 할 것입니다. tiff는 항상 직사각형이므로 20x 50mb입니다.
Riccardo

20000 x 12000은 어디서 얻었습니까? 질문에 표시된 출력은 입력 이미지가 79841 x 59955임을 제안합니다.
Evil Genius

입력 vrt의 크기는 79841, 59955입니다. 그러나 5 행과 4 열이 있으므로 ~ 80000을 4와 ~ 60000을 5로 나눕니다. 앞에서 말했듯이 이것은 이미지의 크기가 같고 그림과 같이 위치한다고 가정합니다.
radouxju

원래 질문을 수정하여 답변했습니다. 계속 진행해야한다고 생각합니다.
grimdaemon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.