EVOLUTION-MANAGER
Edit File: gdal_tutorial_br.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.5"/> <title>BR: Tutorial da API do GDAL</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">BR </div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Gerado por Doxygen 1.8.5 --> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Página Principal</span></a></li> <li class="current"><a href="pages.html"><span>Páginas relacionadas</span></a></li> </ul> </div> </div><!-- top --> <div class="header"> <div class="headertitle"> <div class="title">Tutorial da API do GDAL </div> </div> </div><!--header--> <div class="contents"> <div class="textblock"><h1><a class="anchor" id="gdal_tutorial_open"></a> Abrindo um Arquivo</h1> <p>Antes de abrir um dataset raster suportado por GDAL é necessário registar os drivers, existe um driver para cada formato suportado e o registro dos driver é realizado normalmente com a função GDALAllRegister(). GDALAllRegister() registar todos os drivers conhecidos including os "plug-in", que são bilioteca dinâmicas, carregadas pelo método GDALDriverManager::AutoLoadDrivers(). Se por algum motivo uma aplicações necessetita limitar o conjunto de drivers seria útil verificar o código de <a href="gdalallregister.cpp.html">gdalallregister.cpp</a>.</p> <p>Uma vez que os drivers são registados, a aplicação deve chamar a função GDALOpen() para abrir dataset, passando o nome do dataset e a forma de acesso (GA_ReadOnly ou GA_Update).</p> <p>Em C++: </p> <div class="fragment"><div class="line"><span class="preprocessor">#include "gdal_priv.h"</span></div> <div class="line"></div> <div class="line"><span class="keywordtype">int</span> main()</div> <div class="line">{</div> <div class="line"> GDALDataset *poDataset;</div> <div class="line"></div> <div class="line"> GDALAllRegister();</div> <div class="line"></div> <div class="line"> poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly );</div> <div class="line"> <span class="keywordflow">if</span>( poDataset == NULL )</div> <div class="line"> {</div> <div class="line"> ...;</div> <div class="line"> }</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line"><span class="preprocessor">#include "gdal.h"</span></div> <div class="line"></div> <div class="line"><span class="keywordtype">int</span> main()</div> <div class="line">{</div> <div class="line"> GDALDatasetH hDataset;</div> <div class="line"></div> <div class="line"> GDALAllRegister();</div> <div class="line"></div> <div class="line"> hDataset = GDALOpen( pszFilename, GA_ReadOnly );</div> <div class="line"> <span class="keywordflow">if</span>( hDataset == NULL )</div> <div class="line"> {</div> <div class="line"> ...;</div> <div class="line"> }</div> </div><!-- fragment --><p>Em Python: </p> <div class="fragment"><div class="line"><span class="keyword">import</span> gdal</div> <div class="line">from gdalconst <span class="keyword">import</span> *</div> <div class="line"></div> <div class="line">dataset = gdal.Open( filename, GA_ReadOnly )</div> <div class="line"><span class="keywordflow">if</span> dataset is None:</div> <div class="line"> ...</div> </div><!-- fragment --><p>Note que se GDALOpen() retornar NULL significa que ocorreu uma falhada, e que as mensagens de erro deverão ter sido emitidas através de CPLError(). Se você quiser controlar como os erros estão relatados revise a a documentação do usuário de função CPLError(). Em geral, todo o GDAL usa CPLError() para o relatório de erro. Note também que o pszFilename não necessita realmente ser o nome de uma arquivo físico (no entando geralmente é). A interpretação é dependente do driver, e pôde ser um URL, um nome de arquivo com os parâmetros adicionais adicionados na string para controlar a abertura do arquivo ou qualquer outra coisa. Tente por favor não limitar diálogos da seleção da arquivo de GDAL somente a selecionar arquivos físicos.</p> <h1><a class="anchor" id="gdal_tutorial_dataset"></a> Extraindo Informacoes do Arquivo</h1> <p>Como descrita em <a href="gdal_datamodel.html">GDAL Data Model</a>, um GDALDataset contem uma lista de bandas raster, todas pertencendo à uma mesma área, e tendo a mesma definição. Possui também um metadata, um sistema coordenado, uma transformação geográfica, tamanho do raster e várias outras informações.</p> <div class="fragment"><div class="line">adfGeoTransform[0] <span class="comment">/* top left x */</span></div> <div class="line">adfGeoTransform[1] <span class="comment">/* w-e pixel resolution */</span></div> <div class="line">adfGeoTransform[2] <span class="comment">/* rotation, 0 if image is "north up" */</span></div> <div class="line">adfGeoTransform[3] <span class="comment">/* top left y */</span></div> <div class="line">adfGeoTransform[4] <span class="comment">/* rotation, 0 if image is "north up" */</span></div> <div class="line">adfGeoTransform[5] <span class="comment">/* n-s pixel resolution */</span></div> </div><!-- fragment --><p>Se nós quiséssemos imprimir alguma informação geral sobre a série de dados nós pudemos fazer o seguinte:</p> <p>Em C++: </p> <div class="fragment"><div class="line"><span class="keywordtype">double</span> adfGeoTransform[6];</div> <div class="line"></div> <div class="line">printf( <span class="stringliteral">"Driver: %s/%s\n"</span>,</div> <div class="line"> poDataset->GetDriver()->GetDescription(), </div> <div class="line"> poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );</div> <div class="line"></div> <div class="line">printf( <span class="stringliteral">"Size is %dx%dx%d\n"</span>, </div> <div class="line"> poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),</div> <div class="line"> poDataset->GetRasterCount() );</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( poDataset->GetProjectionRef() != NULL )</div> <div class="line"> printf( <span class="stringliteral">"Projection is `%s'\n"</span>, poDataset->GetProjectionRef() );</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )</div> <div class="line">{</div> <div class="line"> printf( <span class="stringliteral">"Origin = (%.6f,%.6f)\n"</span>,</div> <div class="line"> adfGeoTransform[0], adfGeoTransform[3] );</div> <div class="line"></div> <div class="line"> printf( <span class="stringliteral">"Pixel Size = (%.6f,%.6f)\n"</span>,</div> <div class="line"> adfGeoTransform[1], adfGeoTransform[5] );</div> <div class="line">}</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line">GDALDriverH hDriver;</div> <div class="line"><span class="keywordtype">double</span> adfGeoTransform[6];</div> <div class="line"></div> <div class="line">hDriver = GDALGetDatasetDriver( hDataset );</div> <div class="line">printf( <span class="stringliteral">"Driver: %s/%s\n"</span>,</div> <div class="line"> GDALGetDriverShortName( hDriver ),</div> <div class="line"> GDALGetDriverLongName( hDriver ) );</div> <div class="line"></div> <div class="line">printf( <span class="stringliteral">"Size is %dx%dx%d\n"</span>,</div> <div class="line"> GDALGetRasterXSize( hDataset ), </div> <div class="line"> GDALGetRasterYSize( hDataset ),</div> <div class="line"> GDALGetRasterCount( hDataset ) );</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( GDALGetProjectionRef( hDataset ) != NULL )</div> <div class="line"> printf( <span class="stringliteral">"Projection is `%s'\n"</span>, GDALGetProjectionRef( hDataset ) );</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( GDALGetGeoTransform( hDataset, adfGeoTransform ) == CE_None )</div> <div class="line">{</div> <div class="line"> printf( <span class="stringliteral">"Origin = (%.6f,%.6f)\n"</span>,</div> <div class="line"> adfGeoTransform[0], adfGeoTransform[3] );</div> <div class="line"></div> <div class="line"> printf( <span class="stringliteral">"Pixel Size = (%.6f,%.6f)\n"</span>,</div> <div class="line"> adfGeoTransform[1], adfGeoTransform[5] );</div> <div class="line">}</div> </div><!-- fragment --><p>Em Python: </p> <div class="fragment"><div class="line">print <span class="stringliteral">'Driver: '</span>, dataset.GetDriver().ShortName,<span class="charliteral">'/'</span>, \</div> <div class="line"> dataset.GetDriver().LongName</div> <div class="line">print <span class="stringliteral">'Size is '</span>,dataset.RasterXSize,<span class="charliteral">'x'</span>,dataset.RasterYSize, \</div> <div class="line"> <span class="charliteral">'x'</span>,dataset.RasterCount</div> <div class="line">print <span class="stringliteral">'Projection is '</span>,dataset.GetProjection()</div> <div class="line"></div> <div class="line">geotransform = dataset.GetGeoTransform()</div> <div class="line"><span class="keywordflow">if</span> not geotransform is None:</div> <div class="line"> print <span class="stringliteral">'Origin = ('</span>,geotransform[0], <span class="charliteral">','</span>,geotransform[3],<span class="charliteral">')'</span></div> <div class="line"> print <span class="stringliteral">'Pixel Size = ('</span>,geotransform[1], <span class="charliteral">','</span>,geotransform[5],<span class="charliteral">')'</span></div> </div><!-- fragment --><h1><a class="anchor" id="gdal_tutorial_band"></a> Extraindo uma Banda Raster</h1> <p>Neste ponto o acesso aos dados da raster através de GDAL pode ser feito uma banda de cada vez. A Band também possui metadata, tamanho de block, tabelas da cor, e vário a outra informação disponível na classe GDALRasterBand. Os seguintes códigos buscam um objeto de GDALRasterBand da série de dados (numerada a partir de 1 em GetRasterCount()) e a exposições de algums informações sobre ela.</p> <p>Em C++: </p> <div class="fragment"><div class="line">GDALRasterBand *poBand;</div> <div class="line"><span class="keywordtype">int</span> nBlockXSize, nBlockYSize;</div> <div class="line"><span class="keywordtype">int</span> bGotMin, bGotMax;</div> <div class="line"><span class="keywordtype">double</span> adfMinMax[2];</div> <div class="line"></div> <div class="line">poBand = poDataset->GetRasterBand( 1 );</div> <div class="line">poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );</div> <div class="line">printf( <span class="stringliteral">"Block=%dx%d Type=%s, ColorInterp=%s\n"</span>,</div> <div class="line"> nBlockXSize, nBlockYSize,</div> <div class="line"> GDALGetDataTypeName(poBand->GetRasterDataType()),</div> <div class="line"> GDALGetColorInterpretationName(</div> <div class="line"> poBand->GetColorInterpretation()) );</div> <div class="line"></div> <div class="line">adfMinMax[0] = poBand->GetMinimum( &bGotMin );</div> <div class="line">adfMinMax[1] = poBand->GetMaximum( &bGotMax );</div> <div class="line"><span class="keywordflow">if</span>( ! (bGotMin && bGotMax) )</div> <div class="line"> GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);</div> <div class="line"></div> <div class="line">printf( <span class="stringliteral">"Min=%.3fd, Max=%.3f\n"</span>, adfMinMax[0], adfMinMax[1] );</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( poBand->GetOverviewCount() > 0 )</div> <div class="line"> printf( <span class="stringliteral">"Band has %d overviews.\n"</span>, poBand->GetOverviewCount() );</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( poBand->GetColorTable() != NULL )</div> <div class="line"> printf( <span class="stringliteral">"Band has a color table with %d entries.\n"</span>, </div> <div class="line"> poBand->GetColorTable()->GetColorEntryCount() );</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line">GDALRasterBandH hBand;</div> <div class="line"><span class="keywordtype">int</span> nBlockXSize, nBlockYSize;</div> <div class="line"><span class="keywordtype">int</span> bGotMin, bGotMax;</div> <div class="line"><span class="keywordtype">double</span> adfMinMax[2];</div> <div class="line"></div> <div class="line">hBand = GDALGetRasterBand( hDataset, 1 );</div> <div class="line">GDALGetBlockSize( hBand, &nBlockXSize, &nBlockYSize );</div> <div class="line">printf( <span class="stringliteral">"Block=%dx%d Type=%s, ColorInterp=%s\n"</span>,</div> <div class="line"> nBlockXSize, nBlockYSize,</div> <div class="line"> GDALGetDataTypeName(GDALGetRasterDataType(hBand)),</div> <div class="line"> GDALGetColorInterpretationName(</div> <div class="line"> GDALGetRasterColorInterpretation(hBand)) );</div> <div class="line"></div> <div class="line">adfMinMax[0] = GDALGetRasterMinimum( hBand, &bGotMin );</div> <div class="line">adfMinMax[1] = GDALGetRasterMaximum( hBand, &bGotMax );</div> <div class="line"><span class="keywordflow">if</span>( ! (bGotMin && bGotMax) )</div> <div class="line"> GDALComputeRasterMinMax( hBand, TRUE, adfMinMax );</div> <div class="line"></div> <div class="line">printf( <span class="stringliteral">"Min=%.3fd, Max=%.3f\n"</span>, adfMinMax[0], adfMinMax[1] );</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( GDALGetOverviewCount(hBand) > 0 )</div> <div class="line"> printf( <span class="stringliteral">"Band has %d overviews.\n"</span>, GDALGetOverviewCount(hBand));</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span>( GDALGetRasterColorTable( hBand ) != NULL )</div> <div class="line"> printf( <span class="stringliteral">"Band has a color table with %d entries.\n"</span>, </div> <div class="line"> GDALGetColorEntryCount(</div> <div class="line"> GDALGetRasterColorTable( hBand ) ) );</div> </div><!-- fragment --><p>In Python (note several bindings are missing): </p> <div class="fragment"><div class="line">band = dataset.GetRasterBand(1)</div> <div class="line"></div> <div class="line">print <span class="stringliteral">'Band Type='</span>,gdal.GetDataTypeName(band.DataType)</div> <div class="line"></div> <div class="line">min = band.GetMinimum()</div> <div class="line">max = band.GetMaximum()</div> <div class="line"><span class="keywordflow">if</span> min is not None and max is not None:</div> <div class="line"> (min,max) = ComputeRasterMinMax(1)</div> <div class="line">print <span class="stringliteral">'Min=%.3f, Max=%.3f'</span> % (min,max)</div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span> band.GetOverviewCount() > 0:</div> <div class="line"> print <span class="stringliteral">'Band has '</span>, band.GetOverviewCount(), <span class="stringliteral">' overviews.'</span></div> <div class="line"></div> <div class="line"><span class="keywordflow">if</span> not band.GetRasterColorTable() is None:</div> <div class="line"> print <span class="stringliteral">'Band has a color table with '</span>, \</div> <div class="line"> band.GetRasterColorTable().GetCount(), <span class="stringliteral">' entries.'</span></div> </div><!-- fragment --><h1><a class="anchor" id="gdal_tutorial_read"></a> Lendo dato Raster</h1> <p>Há algumas maneiras diferentes de ler dados da raster, mas o mais comum é através do Método GDALRasterBand::RasterIO(). Este método tomará automaticamente cuidado da conversão do tipo de dados, amostragem e janela de dados requerida. O seguinte código lerá o primeiro scanline dos dados em um buffer em tamanho similar à quantidade lida, convertendo os valores para ponto flutuando como parte da operação:</p> <p>Em C++: </p> <div class="fragment"><div class="line"><span class="keywordtype">float</span> *pafScanline;</div> <div class="line"><span class="keywordtype">int</span> nXSize = poBand->GetXSize();</div> <div class="line"></div> <div class="line">pafScanline = (<span class="keywordtype">float</span> *) CPLMalloc(<span class="keyword">sizeof</span>(<span class="keywordtype">float</span>)*nXSize);</div> <div class="line">poBand->RasterIO( GF_Read, 0, 0, nXSize, 1, </div> <div class="line"> pafScanline, nXSize, 1, GDT_Float32, </div> <div class="line"> 0, 0 );</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line"><span class="keywordtype">float</span> *pafScanline;</div> <div class="line"><span class="keywordtype">int</span> nXSize = GDALGetRasterBandXSize( hBand );</div> <div class="line"></div> <div class="line">pafScanline = (<span class="keywordtype">float</span> *) CPLMalloc(<span class="keyword">sizeof</span>(<span class="keywordtype">float</span>)*nXSize);</div> <div class="line"> GDALRasterIO( hBand, GF_Read, 0, 0, nXSize, 1, </div> <div class="line"> pafScanline, nXSize, 1, GDT_Float32, </div> <div class="line"> 0, 0 );</div> </div><!-- fragment --><p>Em Python:</p> <div class="fragment"><div class="line">scanline = band.ReadRaster( 0, 0, band.XSize, 1, \</div> <div class="line"> band.XSize, 1, GDT_Float32 )</div> </div><!-- fragment --><p>Note que o scanline retornado é do tipo char*, e contem os bytes xsize*4 de dados binários brutos de ponto flutuando. Isto pode ser convertido em Python usando o módulo do <b>struct</b> da biblioteca padrão:</p> <div class="fragment"><div class="line"><span class="keyword">import</span> <span class="keyword">struct</span></div> <div class="line"></div> <div class="line">tuple_of_floats = <span class="keyword">struct</span>.unpack(<span class="charliteral">'f'</span> * b2.XSize, scanline)</div> </div><!-- fragment --><p>A chamada de RasterIO espera os seguintes argumentos. </p> <div class="fragment"><div class="line">CPLErr GDALRasterBand::RasterIO( GDALRWFlag eRWFlag,</div> <div class="line"> <span class="keywordtype">int</span> nXOff, <span class="keywordtype">int</span> nYOff, <span class="keywordtype">int</span> nXSize, <span class="keywordtype">int</span> nYSize,</div> <div class="line"> <span class="keywordtype">void</span> * pData, <span class="keywordtype">int</span> nBufXSize, <span class="keywordtype">int</span> nBufYSize,</div> <div class="line"> GDALDataType eBufType,</div> <div class="line"> <span class="keywordtype">int</span> nPixelSpace,</div> <div class="line"> <span class="keywordtype">int</span> nLineSpace )</div> </div><!-- fragment --><p>Note que a mesma chamada de RasterIO() poderá ler, ou gravar dependendo do valor de eRWFlag (GF_Read ou GF_Write). Os argumentos nXOff, nYOff, nXSize, nYSize descreve a janela de dados da raster para ler (ou para gravar). Não necessita ser coincidente com os limites da image embora o acesso pode ser mais eficiente se for.</p> <p>O pData é o buffer de memória para os dados que serão lidos ou gravados. O verdadeiro tipo de dado &eacute aquele passado por eBufType, tal como GDT_Float32, ou GDT_Byte. A chamada de RasterIO() cuidará de converter entre o tipo de dados do buffer e o tipo de dados da banda. Anotar que ao converter dados do ponto flutuando para o inteiro RasterIO arredonda para baixo, e ao converter de para fora dos limites de valores válidos para o tipo de saída, será escolhido o mais próximo valor possível. Isto implica, por exemplo, que os dados 16bit lidos em um buffer de GDT_Byte converterão todos os valores maiores de 255 para 255, os <b>dados não estão escalados!</b></p> <p>Os valores nBufXSize e nBufYSize descrevem o tamanho do buffer. Ao carregar dados na resolução completa os valores seria o mesmo que o tamanho da janela. Entretanto, para carregar uma vista de solução reduzida (overview) os valores podiam ser ajustado para menos do que a janela no arquivo. Neste caso o RasterIO() utilizará overview para fazer mais eficientemente o IO se as overview forem apropriadas.</p> <p>O nPixelSpace, e o nLineSpace são normalmente zero indicando que os valores default devem ser usados. Entretanto, podem ser usados controlar o acesso à dados da memória, permitindo a leitura em um buffer que contem dados intercalados (interleave) pixel por exemplo.</p> <h1><a class="anchor" id="gdal_tutorial_close"></a> Fechando o Dataset</h1> <p>Por favor tenha em mente que os objetos de GDALRasterBand estão possuídos por sua dataset, e nunca devem ser destruídos com o operador delete de C++. GDALDataset podem ser fechado chamando GDALClose() ou usando o operador delete no GDALDataset. Um ou outro resultado na finalização apropriada, e resolver gravações pendentes.</p> <h1><a class="anchor" id="gdal_tutorial_creation"></a> Tecnicas para criar arquivos</h1> <p>As arquivos em formatos suportados GDAL podem ser criadas se o driver do formato suportar a criação. Há duas técnicas gerais para criar arquivos, usando CreateCopy() e Create(). O método de CreateCopy chama o método CreateCopy() do driver do formato, e passar como parâmetro dataset que será copiado. O método criar chama o método Create() do driver, e então explicitamente grava todos os metadata, e dados da raster com as chamadas separadas. Todos os drivers que suportam criar arquivos novos suportam o método de CreateCopy(), mas somente algum sustentação o método Create().</p> <p>Para determinar se o driver de um formato suporta Create ou CreateCopy é necessário verificar o DCAP_CREATE e os metadata de DCAP_CREATECOPY no driver do formato objetam. Assegurar-se de que GDALAllRegister() tenha sido chamado antes de chamar GetDriverByName().</p> <p>Em C++: </p> <div class="fragment"><div class="line"><span class="preprocessor">#include "cpl_string.h"</span></div> <div class="line">...</div> <div class="line"> <span class="keyword">const</span> <span class="keywordtype">char</span> *pszFormat = <span class="stringliteral">"GTiff"</span>;</div> <div class="line"> GDALDriver *poDriver;</div> <div class="line"> <span class="keywordtype">char</span> **papszMetadata;</div> <div class="line"></div> <div class="line"> poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);</div> <div class="line"></div> <div class="line"> <span class="keywordflow">if</span>( poDriver == NULL )</div> <div class="line"> exit( 1 );</div> <div class="line"></div> <div class="line"> papszMetadata = poDriver->GetMetadata();</div> <div class="line"> <span class="keywordflow">if</span>( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ) )</div> <div class="line"> printf( <span class="stringliteral">"Driver %s supports Create() method.\n"</span>, pszFormat );</div> <div class="line"> <span class="keywordflow">if</span>( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) )</div> <div class="line"> printf( <span class="stringliteral">"Driver %s supports CreateCopy() method.\n"</span>, pszFormat );</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line"><span class="preprocessor">#include "cpl_string.h"</span></div> <div class="line">...</div> <div class="line"> <span class="keyword">const</span> <span class="keywordtype">char</span> *pszFormat = <span class="stringliteral">"GTiff"</span>;</div> <div class="line"> GDALDriver hDriver = GDALGetDriverByName( pszFormat );</div> <div class="line"> <span class="keywordtype">char</span> **papszMetadata;</div> <div class="line"></div> <div class="line"> <span class="keywordflow">if</span>( hDriver == NULL )</div> <div class="line"> exit( 1 );</div> <div class="line"></div> <div class="line"> papszMetadata = GDALGetMetadata( hDriver, NULL );</div> <div class="line"> <span class="keywordflow">if</span>( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ) )</div> <div class="line"> printf( <span class="stringliteral">"Driver %s supports Create() method.\n"</span>, pszFormat );</div> <div class="line"> <span class="keywordflow">if</span>( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) )</div> <div class="line"> printf( <span class="stringliteral">"Driver %s supports CreateCopy() method.\n"</span>, pszFormat );</div> </div><!-- fragment --><p>Em Python:</p> <div class="fragment"><div class="line">format = <span class="stringliteral">"GTiff"</span></div> <div class="line">driver = gdal.GetDriverByName( format )</div> <div class="line">metadata = driver.GetMetadata()</div> <div class="line"><span class="keywordflow">if</span> metadata.has_key(gdal.DCAP_CREATE) \</div> <div class="line"> and metadata[gdal.DCAP_CREATE] == <span class="stringliteral">'YES'</span>:</div> <div class="line"> print <span class="stringliteral">'Driver %s supports Create() method.'</span> % format</div> <div class="line"><span class="keywordflow">if</span> metadata.has_key(gdal.DCAP_CREATECOPY) \</div> <div class="line"> and metadata[gdal.DCAP_CREATECOPY] == <span class="stringliteral">'YES'</span>:</div> <div class="line"> print <span class="stringliteral">'Driver %s supports CreateCopy() method.'</span> % format</div> </div><!-- fragment --><p>Note que um número de drivers são de leitura apenas e não suportarão Create() ou CreateCopy ().</p> <h1><a class="anchor" id="gdal_tutorial_createcopy"></a> Usando CreateCopy()</h1> <p>O GDALDriver:: O método de CreateCopy() pode ser usado razoavelmente simples enquanto a maioria de informação é coletada do dataset de entrada. Entretanto, inclui opções para passar a formato opções específicas da criação, e para relatar o progresso ao usuário enquanto uma cópia longa da série de dados ocorre. Uma cópia simples de uma arquivo nomeou o pszSrcFilename, a uma arquivo nova nomeada pszDstFilename usando opções de defeito em um formato cujo o driver fosse buscado previamente pudesse olhar como este:</p> <p>Em C++: </p> <div class="fragment"><div class="line">GDALDataset *poSrcDS = </div> <div class="line"> (GDALDataset *) GDALOpen( pszSrcFilename, GA_ReadOnly );</div> <div class="line">GDALDataset *poDstDS;</div> <div class="line"></div> <div class="line">poDstDS = poDriver->CreateCopy( pszDstFilename, poSrcDS, FALSE, </div> <div class="line"> NULL, NULL, NULL );</div> <div class="line"><span class="keywordflow">if</span>( poDstDS != NULL )</div> <div class="line"> <span class="keyword">delete</span> poDstDS;</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line">GDALDatasetH hSrcDS = GDALOpen( pszSrcFilename, GA_ReadOnly );</div> <div class="line">GDALDatasetH hDstDS;</div> <div class="line"></div> <div class="line">hDstDS = GDALCreateCopy( hDriver, pszDstFilename, hSrcDS, FALSE, </div> <div class="line"> NULL, NULL, NULL );</div> <div class="line"><span class="keywordflow">if</span>( hDstDS != NULL )</div> <div class="line"> GDALClose( hDstDS );</div> </div><!-- fragment --><p>Em Python:</p> <div class="fragment"><div class="line">src_ds = gdal.Open( src_filename )</div> <div class="line">dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 )</div> </div><!-- fragment --><p>Note que o método de CreateCopy() retorna um dataset writeable, e que deve ser fechado corretamente à escrita completa e a nivelar a série de dados ao disco. No Python encaixotar isto ocorre automaticamente quando os "dst_ds" saem do espaço. O valor FALSO (ou 0) usado para a opção do bStrict imediatamente depois que o nome de arquivo do destino na chamada de CreateCopy() indica que a chamada de CreateCopy() deve proseguir sem um erro fatal mesmo se a série de dados do destino não puder ser criada para combinar exatamente a série de dados da entrada. Isto pôde ser porque o formato da saída não suporta o datatype do pixel do dataset de entrada, ou porque o destino não pode suportar a escrita que georeferencing por exemplo.</p> <p>Casos mais complexo pôdem envolver passar opções da criação, e usar um monitor predefinido do progresso como este:</p> <p>Em C++: </p> <div class="fragment"><div class="line"><span class="preprocessor">#include "cpl_string.h"</span></div> <div class="line">...</div> <div class="line"> <span class="keywordtype">char</span> **papszOptions = NULL;</div> <div class="line"> </div> <div class="line"> papszOptions = CSLSetNameValue( papszOptions, <span class="stringliteral">"TILED"</span>, <span class="stringliteral">"YES"</span> );</div> <div class="line"> papszOptions = CSLSetNameValue( papszOptions, <span class="stringliteral">"COMPRESS"</span>, <span class="stringliteral">"PACKBITS"</span> );</div> <div class="line"> poDstDS = poDriver->CreateCopy( pszDstFilename, poSrcDS, FALSE, </div> <div class="line"> papszOptions, GDALTermProgress, NULL );</div> <div class="line"> <span class="keywordflow">if</span>( poDstDS != NULL )</div> <div class="line"> <span class="keyword">delete</span> poDstDS;</div> <div class="line"> CSLDestroy( papszOptions );</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line"><span class="preprocessor">#include "cpl_string.h"</span></div> <div class="line">...</div> <div class="line"> <span class="keywordtype">char</span> **papszOptions = NULL;</div> <div class="line"> </div> <div class="line"> papszOptions = CSLSetNameValue( papszOptions, <span class="stringliteral">"TILED"</span>, <span class="stringliteral">"YES"</span> );</div> <div class="line"> papszOptions = CSLSetNameValue( papszOptions, <span class="stringliteral">"COMPRESS"</span>, <span class="stringliteral">"PACKBITS"</span> );</div> <div class="line"> hDstDS = GDALCreateCopy( hDriver, pszDstFilename, hSrcDS, FALSE, </div> <div class="line"> papszOptions, GDALTermProgres, NULL );</div> <div class="line"> <span class="keywordflow">if</span>( hDstDS != NULL )</div> <div class="line"> GDALClose( hDstDS );</div> <div class="line"> CSLDestroy( papszOptions );</div> </div><!-- fragment --><p>Em Python:</p> <div class="fragment"><div class="line">src_ds = gdal.Open( src_filename )</div> <div class="line">dst_ds = driver.CreateCopy( dst_filename, src_ds, 0, </div> <div class="line"> [ <span class="stringliteral">'TILED=YES'</span>, <span class="stringliteral">'COMPRESS=PACKBITS'</span> ] )</div> </div><!-- fragment --><h1><a class="anchor" id="gdal_tutorial_create"></a> Usando Create()</h1> <p>Em situações em que não se quer somente exportar um arquivo existente para uma arquivo novo, geralmente usa-se o método GDALDriver::Criar() (embora algumas opções interessantes são possíveis com o uso de arquivos virtuais ou de arquivos da em-memória). O método Create() examina uma lista de opções bem como o CreateCopy(), mas o tamanho da imagem, número das bandas e o tipo da banda deve ser fornecido explicitamente. </p> <p>Em C++: </p> <div class="fragment"><div class="line">GDALDataset *poDstDS; </div> <div class="line"><span class="keywordtype">char</span> **papszOptions = NULL;</div> <div class="line"></div> <div class="line">poDstDS = poDriver->Create( pszDstFilename, 512, 512, 1, GDT_Byte, </div> <div class="line"> papszOptions );</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line">GDALDatasetH hDstDS; </div> <div class="line"><span class="keywordtype">char</span> **papszOptions = NULL;</div> <div class="line"></div> <div class="line">hDstDS = GDALCreate( hDriver, pszDstFilename, 512, 512, 1, GDT_Byte, </div> <div class="line"> papszOptions );</div> </div><!-- fragment --><p>Em Python:</p> <div class="fragment"><div class="line">dst_ds = driver.Create( dst_filename, 512, 512, 1, gdal.GDT_Byte )</div> </div><!-- fragment --><p>Uma vez que o dataset é criado com sucesso, todos os metadata apropriados devem ser gravados no arquivo. O que variará de acordo com o uso, mas um caso simples com projeção, do geotransform e da raster é mostrado a seguir:</p> <p>Em C++: </p> <div class="fragment"><div class="line"><span class="keywordtype">double</span> adfGeoTransform[6] = { 444720, 30, 0, 3751320, 0, -30 };</div> <div class="line">OGRSpatialReference oSRS;</div> <div class="line"><span class="keywordtype">char</span> *pszSRS_WKT = NULL;</div> <div class="line">GDALRasterBand *poBand;</div> <div class="line">GByte abyRaster[512*512];</div> <div class="line"></div> <div class="line">poDstDS->SetGeoTransform( adfGeoTransform );</div> <div class="line"></div> <div class="line">oSRS.SetUTM( 11, TRUE );</div> <div class="line">oSRS.SetWellKnownGeogCS( <span class="stringliteral">"NAD27"</span> );</div> <div class="line">oSRS.exportToWkt( &pszSRS_WKT );</div> <div class="line">poDstDS->SetProjection( pszSRS_WKT );</div> <div class="line">CPLFree( pszSRS_WKT );</div> <div class="line"></div> <div class="line">poBand = poDstDS->GetRasterBand(1);</div> <div class="line">poBand->RasterIO( GF_Write, 0, 0, 512, 512, </div> <div class="line"> abyRaster, 512, 512, GDT_Byte, 0, 0 ); </div> <div class="line"></div> <div class="line"><span class="keyword">delete</span> poDstDS;</div> </div><!-- fragment --><p>Em C: </p> <div class="fragment"><div class="line"><span class="keywordtype">double</span> adfGeoTransform[6] = { 444720, 30, 0, 3751320, 0, -30 };</div> <div class="line">OGRSpatialReferenceH hSRS;</div> <div class="line"><span class="keywordtype">char</span> *pszSRS_WKT = NULL;</div> <div class="line">GDALRasterBandH hBand;</div> <div class="line">GByte abyRaster[512*512];</div> <div class="line"></div> <div class="line">GDALSetGeoTransform( hDstDS, adfGeoTransform );</div> <div class="line"></div> <div class="line">hSRS = OSRNewSpatialReference( NULL );</div> <div class="line">OSRSetUTM( hSRS, 11, TRUE );</div> <div class="line">OSRSetWellKnownGeogCS( hSRS, <span class="stringliteral">"NAD27"</span> ); </div> <div class="line">OSRExportToWkt( hSRS, &pszSRS_WKT );</div> <div class="line">OSRDestroySpatialReference( hSRS );</div> <div class="line"></div> <div class="line">GDALSetProjection( hDstDS, pszSRS_WKT );</div> <div class="line">CPLFree( pszSRS_WKT );</div> <div class="line"></div> <div class="line">hBand = GDALGetRasterBand( hDstDS, 1 );</div> <div class="line">GDALRasterIO( hBand, GF_Write, 0, 0, 512, 512, </div> <div class="line"> abyRaster, 512, 512, GDT_Byte, 0, 0 ); </div> <div class="line"></div> <div class="line">GDALClose( hDstDS );</div> </div><!-- fragment --><p>Em Python:</p> <div class="fragment"><div class="line"><span class="keyword">import</span> Numeric, osr</div> <div class="line"></div> <div class="line">dst_ds.SetGeoTransform( [ 444720, 30, 0, 3751320, 0, -30 ] )</div> <div class="line"></div> <div class="line">srs = osr.SpatialReference()</div> <div class="line">srs.SetUTM( 11, 1 )</div> <div class="line">srs.SetWellKnownGeogCS( <span class="stringliteral">'NAD27'</span> )</div> <div class="line">dst_ds.SetProjection( srs.ExportToWkt() )</div> <div class="line"></div> <div class="line">raster = Numeric.zeros( (512, 512) ) </div> <div class="line">dst_ds.GetRasterBand(1).WriteArray( raster )</div> </div><!-- fragment --> <p> $Id: gdal_tutorial_br.dox $ </p> </div></div><!-- contents --> <hr> Generated for GDAL by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.8.5. </body> </html>