gdal2tiles 삽질

원래는 tif파일하나가 400MB정도 나가서 도저히 Merge를 할 수가 없어서 이 방법, 저 방법 찾다가 우연찮게 발견한 것이 gdal_vrtmerge라는 툴이었다(http://code.google.com/p/maphew/ 가면 Download에 gdal_extra라는 파일에 끼어있음). 공식 GDAL 유틸리티는 아니지만 삽질을 통해 설치하고 gdalwarp의 -tr 옵션을 주어서 PixelSize까지 맞춰서 수 많은 tif파일들을 Merge시킨 vrt 파일을 만들었다. 그냥 gdal_merge를 통해 하나의 통판으로 만들면 용량이 너무 커서 시간도 오래걸리고 쪽날꺼 같아 gdal_vrtmerge를 사용 하였다(참고: Open Source GIS를 이용한 고해상도 영상의 Tile Map Service 시스템 구축에 관한 연구-정명훈).

 

근데 제길슨

gdal2tiles.py: error: Processing of several input files is not supported.

Please first use a tool like gdal_vrtmerge.py or gdal_merge.py on the files:

위와 같은 에러가 뜨는게 아닌가!!

구글링을 하다가 http://www.mail-archive.com/debian-bugs-closed@lists.debian.org/msg280389.html 이것을 찾았고

답변은.. but current (>= 1.6) has a different syntax. Sorry for the noise...

시발놈…

 

그래서 혹시나 나중에 삽질하는 사람을 위해서 gdal2tiles 옵션을 정리하고자 한다.

gdal2tiles 실행 방법

gdal2tiles.py는 FWTools와 OSGeo4w 쉘(shell)을 통하여 실행할 수 있다. 하지만 FWTools에서는 GDAL의 버전이 잘 안맞는 경우가 있는데 그냥 OSGeo4W shell을 통하여 실행하면 된다. 먼저 gdal1.6 라이브러리를 활성화 시키기 위해 gdal16이라고 치고 커맨드를 실행시키면 OSGeo4W가 gdal16.bat을 실행시키면서 환경변수 등을 설정한다.

그 다음 gdal2tiles 커맨드와 적절한 옵션을 실행시키면 된다. 커맨드를 실행 시킬 때는 gdal2tiles.py 혹은 gdal2tiles 둘 다 같은 효과를 갖는다. 그 이유는 gdal2tiles.bat이 결국 아래와 같이 gdal2tiles.py를 실행시키는 구조이기 때문이다.

@python "%OSGEO4W_ROOT%\apps\gdal-16\bin\gdal2tiles.py" %*


이제 gdal2tiles 커맨드와 함께 아래 옵션 값들을 참조하여 자신에게 맞는 옵션들을 기입하면 된다.

gdal2tiles와 관련된 옵션

옵션명

옵션1

옵션2

Type

설명

OptionChoice

profile

-p

--profile

choice

프로파일

mercator, geodetic, raster

resampling

-r

--resampling

choice

리샘플링 방법 지정

average,
near, bilinear, cubic, cubicspline, lanczos, antialias

SRS

-s

--s_srs

 

원본파일의 Spatial Reference System

 

zoom

-z

--zoom

 

2-5 혹은 10과 같은 식으로 지정

 

resume

-e

--resume

 

복구재개모드. Resume mode. Generate only missing files

 

NODATA

-a

--srcnodata

 

NODATA transparency value to assign to the input data

 

verbose

-v

--verbose

 

Print status messages to stdout

 

KML

-k

--force-kml

 

Generate KML for Google Earth - default for 'geodetic' profile and 'raster' in EPSG:4326. For a dataset with different projection use with caution!")

 

No KML

-n

--no-kml

 

Avoid automatic generation of KML files for EPSG:4326

 

url

-u

--url

 

URL address where the generated tiles are going to be published

 

webviewer

-w

--webviewer

 

Web viewer to generate Google Maps, Yahoo Maps, OpenLayers- default 'all'

 

title

-t

--title

 

Title of the map

 

copyright

-c

--copyright

 

Copyright for the map

 

Google Maps API key

-g

-googlekey

 

Google Maps API key from
http://code.google.com/apis/maps/signup.html

 

Yahoo Application ID

-y

--yahookey

 

Yahoo Application ID from
http://developer.yahoo.com/wsregapp/

 

tileindex

-i

--tileindex

 

Generate tileindex and mapfile for MapServer (WMS)

 

 

 

gdal2tiles 옵션의 기본 값

verbose=False

profile="mercator"

kml=False

url=''

webviewer='all'

copyright=''

resampling='average'

resume=False

googlekey='INSERT_YOUR_KEY_HERE'

yahookey='INSERT_YOUR_YAHOO_APP_ID_HERE'

Posted by 강부자아들
,

gdal_vrtmerge 설치는 그냥 대충 설치한 것이기 때문에 정말 필요한 사람만 따라 하기를 바랍니다. 거의 뺑기를 써서 설치하였기 때문에 다른 방법을 아시는 분은 댓글 부탁 드립니다.

 

gdal_vrtmerge를 실행하였으나

C:\Program Files\gdal_extras>gdal_vrtmerge.py

Traceback (most recent call last):

File "C:\PROGRA~1\FWTOOL~1.7\bin\gdal_vrtmerge.py", line 27, in <module>

import gdal

File "C:\PROGRA~1\FWTOOL~1.7\pymod\gdal.py", line 191, in <module>

import _gdal

ImportError: No module named _gdal

 

위와 같은 오류를 접하게 되었다.

가장 근접한 Q&A로 http://old.nabble.com/unable-to-run-gdal_retile.py-td14222713.html를 찾았다

 

You can not use any other Python with GDAL than that installed together with FWTools.

Check if the other installed Python is not in the PATH and PYTHONPATH. If it is, then there is some conflict probably.

 

 

아마 내 것에는 PYTHONPATH 환경변수에 Mapnik이 잡혀있어서 안 되는 것 같았다. 아니면 gdal2tiles도 안 되는 것을 봐서는 Python 바인딩이 잘못 된 것도 같았다. 이유는 아직 모르겠다.

 

결국 해결책은 그냥 OSGEO4W를 실행하는 것이었다.

다운받은 gdal_extras\bin\gdal_vrtmerge.py를 복사해다가 OSGEO4W의 각종 유틸리티가 있는 C:\OSGeo4W\bin\ 안에 붙여 넣었다.

그리고 gdal_vrtmerge.bat 이라는 bat파일을 만들고 그 안에 다음과 같이 적어주었다.

@python "C:\OSGeo4W\bin\gdal_vrtmerge.py" %*

 

마지막으로 OSGEO4W shell을 실행시키고 gdal16을 타이핑하여 gdal16 라이브러리를 활성화 시키고 gdal_vrtmerge를 실행한 화면이다.

Posted by 강부자아들
,

GDAL(http://www.gdal.org/)에는 gdal과 관련된 많은 유틸리티 툴이 있다. 이 툴들은 다른 라이브러리들과 종속성이 있어 GDAL을 포함하고 있는 FWTools(http://fwtools.maptools.org/)를 설치하는 것을 권장한다. FWTools를 설치한 후 FWTools shell을 실행한다. 도스 커맨드 창이 열리게 되는데 여기에 http://gdal.org/gdal_utilities.html에 있는 유틸리티 이름과 유틸리티의 인자 값들을 넣어 실행시키면 된다. 기본 폴더는 FWTools가 설치된 경로이다.

내가 설치한 경로는 C:\Program Files\FWTools2.4.7 이고, 이 폴더 안에 데이터들을 넣고 실행하면 된다. 이 폴더 안에 데이터를 넣지 않고 실행할 경우 데이터 파일들에 대한 경로를 지정해야 한다. 파일명으로만 인자 값들을 전달하고 싶을 때는 FWTools shell을 실행한 후 데이터 파일로 찾아간 후("cd [디렉토리 명]"을 입력) 파일명만 입력하는 방법도 있다.

 

이번 글에서는 Tiff 이미지에서 특정한 색의 영역을 투명처리하고 싶을 때 어떻게 처리하는 가에 대한 방법을 설명하고자 한다. 사용될 GDAL의 유틸리티는 gdalwarp이다. 이 gdalwarp 유틸리에는 –srcnodata, -dstnodata, -dstalpha와 같은 옵션을 투명처리를 하기 위해 지원한다. 투명처리를 위해서는 –dstalpha 옵션을 통해 생성될 이미지에 알파채널을 생성하게 한다. 그냥 쓰고 싶으면 아래와 같은 최종 결과 command만 넣어주면 된다.

최종 결과 command

gdalwarp -dstalpha -srcnodata 0 -dstnodata 0 input.tif output_alpha.tif

gdalwarp의 인자 값 설명

-srcnodata value [value...]:

Input band들에 대한 nodata masking value설정(밴드 별로 각각 다른 값을 설정 있음. 예를 들어 -srcnodata "125 125 150"). 만약 1 이상의 값이 주어진다면 따옴표 안에 공백으로 분리하여 지정해 준다. 마스크 값들은 컬러 값을 보간 사용되지 않는다. None 이라는 값을 넣으면 원본 데이터 세트의 nodata 세팅 값을 무시하게 한다.

예제:

gdalwarp -srcnodata "125 125 150" -dstnodata "125 125 150" orig-ignore-grey.tif grey-nodata.tif

 

-dstnodata value [value...]:

output band 대한 nodata (밴드 별로 각각 다른 값을 설정 있음. 예를 들어 -dstnodata "125 125 150"). 만약 1 이상의 값이 주어진다면 따옴표 안에 공백으로 분리하여 지정해 준다. 새로운 파일은 설정된 값으로 초기화 것이고, 만약 가능하다면 출력 파일에 nodata 값이 기록될 것이다. New files will be initialized to this value and if possible the nodata value will be recorded in the output file.

-dstalpha:

nodata(unset/transparent) 픽셀을 구별 하기 위해 출력 파일에 alpha 밴드를 생성한다.

 

 

nodata 예제들

GDALWARP WITH TRANSPARENCY : http://schwehr.org/blog/archives/2008-02.html

gdalwarp -dstalpha -srcnodata 255 -dstnodata 0 -s_srs EPSG:32619 -t_srs EPSG:4326 input-32619.tif output-4326.tif

 

만약 geotiff 파일의 헤더에 nodata 태그가 설정되어 있다면, 우리가 아무런 작업을 필요 없이 gdalwarp 유틸리티는 자동으로  nodata 태그를 사용할 것이다. 하지만-srcnodata 인자 값은 nodata 태그 값을 덮어 쓰기 있다. 만약 우리가 여러 장의 영상과 영상 별로 다른 값들을 nodata  다루어야 한다면, 각각의 영상 별로 무시해야 nodata 값들을 정해주어 프로세싱하고, 각각의 파일마다 nodata flag 달아 주어야 한다. 만약 우리가 원래 값을 보존해야 한다고 하면 예제는 아래와 같다:

# for this image we want to ignore black (0)

gdalwarp -srcnodata 0 -dstnodata 0 orig-ignore-black.tif black-nodata.tif

 

# and now we want to ignore white (0)

gdalwarp -srcnodata 255 -dstnodata 255 orig-ignore-white.tif white-nodata.tif

 

# and finally ignore a particular blue-grey (RGB 125 125 150)

gdalwarp -srcnodata "125 125 150" -dstnodata "125 125 150" orig-ignore-grey.tif grey-nodata.tif

 

# now we can mosaic them all and not worry about nodata parameters

gdalwarp -dstnodata 0 black-nodata.tif grey-nodata.tif white-nodata.tif final-mosaic.tif

 

http://osgeo-org.1803224.n2.nabble.com/transparent-Geotiff-td2022648.html

위 링크에 질문한 사람은 하얀색 부분을 투명 처리 하고 싶다고 하였다.

gdalwarp -dstalpha -srcnodata 255 -dstnodata 0 de_poel.tif de_poel2.tif 

 

 

http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

d) gdalwarp can also be cause to treat particular values as nodata and to 

   produce alpha values in the output.  In this example we cause oceans to

   be treated as transparent, and generate alpha in the output. 

 

   gdalwarp -wo SOURCE_EXTRA=125 -srcnodata "11 10 50" -dstalpha

             -t_srs '+proj=ortho +datum=WGS84' 

             geoworld.tif ortho.tif

 

   Hmm, it seems the water isn't quite as uniformly blue as I hoped.  It

   must have lived as a lossily compressed image at one point!

 

삽질

아래와 같이 실행한 결과 배경이 검정색으로 나타났다. 왜 그런지 정확히 모르겠지만 아마 –dstnodata를 지정하지 않아서 인 것 같다.

gdalwarp -srcnodata 0 -dstalpha input.tif output.tif

 

Reference

GDALWARP WITH TRANSPARENCY : http://schwehr.org/blog/archives/2008-02.html

OSGEO Q&A : http://osgeo-org.1803224.n2.nabble.com/transparent-Geotiff-td2022648.html

RasterProcTutorial : http://trac.osgeo.org/gdal/wiki/UserDocs/RasterProcTutorial

 

Posted by 강부자아들
,