<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Via SIG &#187; WebGIS</title>
	<atom:link href="http://blog.viasig.com/category/webgis/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.viasig.com</link>
	<description>Um blog sobre SIG, focado na tecnologia, programação e gestão.</description>
	<lastBuildDate>Wed, 21 Jul 2010 18:21:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Mosaicos de imagens em MapServer, com GDAL</title>
		<link>http://blog.viasig.com/2010/01/mosaicos-de-imagens-em-mapserver-com-gdal/</link>
		<comments>http://blog.viasig.com/2010/01/mosaicos-de-imagens-em-mapserver-com-gdal/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 17:55:26 +0000</pubDate>
		<dc:creator>duarte</dc:creator>
				<category><![CDATA[Dados]]></category>
		<category><![CDATA[Intermédio]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[SIG]]></category>
		<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[WebGIS]]></category>
		<category><![CDATA[GDAL]]></category>
		<category><![CDATA[MapServer]]></category>
		<category><![CDATA[Mosaicos]]></category>

		<guid isPermaLink="false">http://blog.viasig.com/?p=513</guid>
		<description><![CDATA[
Quando fica incumbido de publicar informação geográfica na web é quase sempre confrontado com esta questão – como publicar aquela colecção de ortos, composta por uma directoria cheia de ficheiros tif? (ou jpeg, ou ecw, ou sid…)

Este artigo nasceu num desses momentos, e da necessidade de determinar quais as opções existentes no MapServer, e saber qual [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<div class="mceTemp">Quando fica incumbido de publicar informação geográfica na web é quase sempre confrontado com esta questão – como publicar aquela colecção de ortos, composta por uma directoria cheia de ficheiros tif? (ou jpeg, ou ecw, ou sid…)</div>
</div>
<p>Este artigo nasceu num desses momentos, e da necessidade de determinar quais as opções existentes no MapServer, e saber qual delas é a melhor.</p>
<p>AVISO – artigo longo, com resultados de uma série de testes!!! Conclusões no final para os mais stressados…</p>
<h4>Cenário inicial</h4>
<p>Imaginemos um pequeno concelho que tem uma colecção de 45 ortofotomapas, em formato TIFF, não comprimido. Cada imagem ocupa 234MB, o que totaliza 10GB de imagens.</p>
<p>O objectivo é publicar estas imagens como uma cobertura que abrange o concelho, numa aplicação webgis, servida pelo MapServer.</p>
<h4>A melhor opção</h4>
<p>Para escolher a melhor forma de publicar as imagens é preciso saber o que é mais importante para nós: velocidade ou espaço em disco?</p>
<p>A verdade é que a compressão das imagens impõe uma penalização na velocidade com que os programas conseguem mostrar essas imagens. Essa penalização pode ser muito pequena ou muito grande, consoante o tipo de compressão e o tipo de imagem criada durante o processo de compressão. Geralmente, os ficheiros ECW e SID são extremamente comprimidos e relativamente rápidos. Em geral também, o formato JPEG2000 comprime muito as imagens mas é lento. O formato mais antigo JPEG é um compromisso entre os 2 grupos anteriores. Outra regra: assume-se que o MapServer é mais rápido com o formato TIFF, sem compressão, do que com formatos comprimidos, mas estas imagens ocupam muito mais espaço em disco.</p>
<p>Portanto, se a sua única preocupação é velocidade, e tem espaço em disco que não se importa de gastar com os seus ortofotomapas, em principio já sabe a sua resposta – use TIFFs sem compressão. Mas nada como verificar se esta “verdade” realmente se aplica aos seus dados em particular. Ahh, e não se esqueça de considerar o tráfego que vai gerar na rede se quiser usar os ortos em programas SIG desktop…</p>
<p>Temos ainda de saber como criar um layer em MapServer que use todas as imagens como um conjunto único. Afinal não quer que o utilizador seja obrigado a ligar 45 imagens uma-por-uma.</p>
<p>Para iniciar os testes converteram-se todas as imagens para os diversos formatos. Os tamanhos totais em cada formato ficaram assim:</p>
<table class="viasig" style="width: 400px;" border="0" cellspacing="0">
<thead>
<tr>
<th width="200" valign="top">Formato</th>
<th width="200" valign="top">Dimensão</th>
</tr>
</thead>
<tbody>
<tr>
<td width="200" valign="top">TIF+overheads</td>
<td width="200" valign="top">13,5 GB</td>
</tr>
<tr>
<td width="200" valign="top">JPG+overheads</td>
<td width="200" valign="top">915 MB</td>
</tr>
<tr>
<td width="200" valign="top">ECW</td>
<td width="200" valign="top">605 MB</td>
</tr>
<tr>
<td width="200" valign="top">JP2</td>
<td width="200" valign="top">509 MB</td>
</tr>
</tbody>
</table>
<p>Os tamanhos indicados incluem imagens de resolução reduzida, chamadas <em>overheads</em> ou pirâmides. Mais sobre isto adiante…</p>
<p>Para ver os comandos de conversão do GDAL para cada formato pode consultar este artigo anterior – <a title="artigo anterior sobre conversão com GDAL" href="http://blog.viasig.com/2009/01/gdal-formatos-comprimidos/" target="_blank">GDAL: Formatos comprimidos</a>.</p>
<h4>Usar mosaicos em MapServer</h4>
<p>Um mosaico de imagens em MapServer é um layer do tipo RASTER que aponta para um conjunto de imagens em vez de uma só.</p>
<p>A forma tradicional de referenciar um mosaico é criando um shapefile que contém um quadriculado com as extensões das imagens. Este shapefile é criado com um comando do GDAL chamado <em><a title="página do comando gdaltindex" href="http://www.gdal.org/gdaltindex.html" target="_blank">gdaltindex</a></em>.</p>
<p>Mas há uma nova opção. Podemos usar o <a title="página do GDAL sobre o formato VRT" href="http://www.gdal.org/ogr/drv_vrt.html" target="_blank">formato VRT</a>, um formato virtual que é constituído por um ficheiro de texto que indica a fonte dos dados e a forma como são organizados. Um ficheiro VRT pode listar um conjunto de imagens de forma a que o MapServer e outras aplicações o leiam como uma imagem única, quando na verdade será composto por todas as nossas imagens. O comando para criar um mosaico VRT é o <em><a title="página do comando gdalbuildvrt" href="http://www.gdal.org/gdalbuildvrt.html" target="_blank">gdalbuildvrt</a></em>.</p>
<p>Por último, temos a opção de força bruta: juntar todas as imagens numa só, criando uma imagem enorme em disco que abrange toda a nossa área de interesse. Ou seja, no nosso caso em estudo esta imagem teria 10GB. Para criar este mosaico monolítico usamos o comando <em><a title="página do comando gdal_merge" href="http://www.gdal.org/gdal_merge.html" target="_blank">gdal_merge</a></em>.</p>
<p>Vamos ao longo do artigo analisar cada opção e no final medir os tempos que o MapServer demora a visualizar cada tipo de mosaico.</p>
<h4>Mosaico VRT</h4>
<p>O GDAL suporta um formato virtual, VRT, que lista ficheiros já existentes e os descreve como um todo. Podemos agregar várias imagens numa só, definir um novo sistema de coordenadas, ou no caso de ficheiros vectoriais definir filtros de atributos, e renomear atributos, tudo sem alterar os ficheiros originais. Os ficheiros VRT são ficheiros de texto em formato XML e podem ser editados manualmente, ou criados com o <em>gdal_translate</em> ou com o comando <em>gdalbuildvrt</em>. Mais info <a title="pequeno tutorial sobre VRT" href="http://www.gdal.org/gdal_vrttut.html" target="_blank">aqui</a>.</p>
<p>Para construir um mosaico a partir das imagens numa directoria, basta usar o seguinte comando:</p>
<pre>gdalbuildvrt mosaico_tif.vrt directoria\*.tif</pre>
<p>O ficheiro “mosaico_tif.vrt” é criado com o seguinte conteúdo:</p>
<pre><code>&lt;VRTDataset rasterXSize="40000" rasterYSize="20000"&gt;
  &lt;SRS&gt;LOCAL_CS[&amp;quot;unnamed&amp;quot;,UNIT[&amp;quot;metre&amp;quot;,1,AUTHORITY[&amp;quot;EPSG&amp;quot;,&amp;quot;9001&amp;quot;]]]&lt;/SRS&gt;
  &lt;GeoTransform&gt;-1.6000000000000000e+004, 5.0000000000000000e-001, 0.0000000000000000e+000,-7.0000000000000000e+004, 0.0000000000000000e+000,-5.0000000000000000e-001&lt;/GeoTransform&gt;
  &lt;VRTRasterBand dataType="Byte" band="1"&gt;
    &lt;ColorInterp&gt;Red&lt;/ColorInterp&gt;
    &lt;SimpleSource&gt;
      &lt;SourceFilename relativeToVRT="1"&gt;tif\003941Argbx.tif&lt;/SourceFilename&gt;
      &lt;SourceBand&gt;1&lt;/SourceBand&gt;
      &lt;SourceProperties RasterXSize="8000" RasterYSize="10000" DataType="Byte" BlockXSize="8000" BlockYSize="1"/&gt;
      &lt;SrcRect xOff="0" yOff="0" xSize="8000" ySize="10000"/&gt;
      &lt;DstRect xOff="0" yOff="0" xSize="8000" ySize="10000"/&gt;
    &lt;/SimpleSource&gt;</code></pre>
<p>&#8230; seguem-se as restantes imagens em sucessivos SimpleSource até terminar a lista de imagens, para a 1ª banda. Depois inicia-se a 2ª banda:</p>
<div><code>&lt;/VRTRasterBand&gt;<br />
  &lt;VRTRasterBand dataType="Byte" band="2"&gt;<br />
    &lt;ColorInterp&gt;Green&lt;/ColorInterp&gt;<br />
    &lt;SimpleSource&gt;<br />
      &lt;SourceFilename relativeToVRT="1"&gt;tif\003941Argbx.tif&lt;/SourceFilename&gt;<br />
      &lt;SourceBand&gt;2&lt;/SourceBand&gt;<br />
      &lt;SourceProperties RasterXSize="8000" RasterYSize="10000" DataType="Byte" BlockXSize="8000" BlockYSize="1"/&gt;<br />
      &lt;SrcRect xOff="0" yOff="0" xSize="8000" ySize="10000"/&gt;<br />
      &lt;DstRect xOff="0" yOff="0" xSize="8000" ySize="10000"/&gt;<br />
    &lt;/SimpleSource&gt;</code></div>
<p>&#8230; seguem depois as imagens para compor a 3ª banda&#8230;</p>
<div><code>&lt;/VRTRasterBand&gt;<br />
  &lt;VRTRasterBand dataType="Byte" band="3"&gt;<br />
    &lt;ColorInterp&gt;Blue&lt;/ColorInterp&gt;<br />
    &lt;SimpleSource&gt;<br />
      &lt;SourceFilename relativeToVRT="1"&gt;tif\003941Argbx.tif&lt;/SourceFilename&gt;<br />
      &lt;SourceBand&gt;3&lt;/SourceBand&gt;<br />
      &lt;SourceProperties RasterXSize="8000" RasterYSize="10000" DataType="Byte" BlockXSize="8000" BlockYSize="1"/&gt;<br />
      &lt;SrcRect xOff="0" yOff="0" xSize="8000" ySize="10000"/&gt;<br />
      &lt;DstRect xOff="0" yOff="0" xSize="8000" ySize="10000"/&gt;<br />
    &lt;/SimpleSource&gt;</code></div>
<p>Finalizando-se o ficheiro assim:</p>
<div><code>   &lt;/VRTRasterBand&gt;<br />
&lt;/VRTDataset&gt;</code></div>
<p>O QGIS 1.4.0 consegue ler este tipo de ficheiro, mostrando-o como uma só imagem:</p>
<p><a href="$QGIS140_mosaicoVRT_blogviasigcom3.png"></a></p>
<div class="wp-caption alignnone" style="width: 650px"><a rel="attachment wp-att-524" href="http://blog.viasig.com/2010/01/mosaicos-de-imagens-em-mapserver-com-gdal/qgis140_mosaicovrt_blogviasigcom/"><img title="QGIS140_mosaicoVRT_blogviasigcom" src="http://blog.viasig.com/wp-content/uploads/2010/01/QGIS140_mosaicoVRT_blogviasigcom1.png" alt="Mosaico VRT visualizado no QGIS 1.4.0" width="640" height="556" /></a><p class="wp-caption-text">Mosaico VRT visualizado no Quantum GIS 1.4.0.</p></div>
<p>Mas a performance é um problema. Para visualizar este mosaico, o QGIS tem de abrir as 45 imagens, ler todos os pixels, e mostrá-los. Ainda por cima, nesta escala a maior parte da informação é inútil porque não se distinguem todos os pixels. Para resolver este problema, criam-se overheads…</p>
<h4>Criar Overheads</h4>
<p>Os ficheiro TIFF originais têm 234MB cada um, e para visualizar todos os ortos o QGIS tem de ler todas as imagens, num total de 9GB, e mostrá-las numa escala onde o todo pormenor se perde. Este problema aplica-se a todos os programas SIG, incluindo o MapServer.</p>
<p>Para evitar este desperdício de tempo, criam-se overheads ou pirâmides, que são imagens de resolução decrescente gravadas num só ficheiro com extensão OVR. Assim, para uma escala pequena, como a do exemplo anterior, o QGIS tem apenas de ler e mostrar a imagem de pior resolução, já que se ajusta bem ao pormenor visível a essa escala. Consoante o utilizador faz “zoom in”, o QGIS selecciona a imagem com a resolução apropriada a essa escala, até que a partir de uma dada escala começa a mostrar a imagem original. Mas neste momento já só é necessário ler uma pequena porção da imagem para cobrir a área visível. E assim se acelera a visualização das imagens.</p>
<p>Para criar overheads usamos o comando do GDAL, <em><a title="página do comando gdaladdo" href="http://www.gdal.org/gdaladdo.html" target="_blank">gdaladdo</a></em>:</p>
<div><code>gdaladdo -ro &lt;ficheiro_de_imagem&gt; 2 4 8 16 32 64 128</code></div>
<p>O parâmetro “-ro” indica que a imagem original não deve ser alterada, e portanto as overheads serão criadas num ficheiro separado, que terá a extensão OVR.</p>
<p>Os números depois do nome da imagem são os níveis a criar com resolução reduzida. O n.º 2 indica metade da resolução original, 4 é 1/4 e assim sucessivamente. Até que nível de redução calculamos depende da extensão geográfica das imagens e da sua resolução original. Uma forma fácil de determinar até que redução devemos chegar é consultar o QGIS…</p>
<p>O QGIS consegue agora criar overheads – acedendo às propriedades de um tema de imagem, na secção de Pyramids existe um botão para criar pirâmides (embora seja mais lento que o comando GDAL). Aqui o QGIS mostra a lista de resoluções que aconselha – é só contar quantos níveis são aconselhados pelo QGIS. Na imagem seguinte, podemos ver o QGIS a criar pirâmides para uma das imagens:</p>
<div id="attachment_525" class="wp-caption alignnone" style="width: 630px"><a rel="attachment wp-att-525" href="http://blog.viasig.com/2010/01/mosaicos-de-imagens-em-mapserver-com-gdal/qgis140_piramides/"><img class="size-full wp-image-525" title="QGIS140_piramides" src="http://blog.viasig.com/wp-content/uploads/2010/01/QGIS140_piramides.png" alt="Construir pirâmides/overheads no Quantum GIS 1.4.0." width="620" height="548" /></a><p class="wp-caption-text">Construir pirâmides/overheads no Quantum GIS 1.4.0.</p></div>
<p>Como o QGIS indicava 7 níveis de pirâmides para as minhas imagens, foi o que usei no comando: 2, 4, 8, 16, 32, 64, 128 = 7 níveis.</p>
<p>Criei então overheads para o mosaico VRT. O resultado foi um ficheiro OVR com 776MB, ou seja, 33% do tamanho original. Esta é a taxa comum na criação de overheads e temos de prever este consumo adicional de disco.</p>
<p>Para testar as overheads, carreguei de novo o mosaico VRT no QGIS. Agora a imagem total foi mostrada quase instantaneamente. Mas ao fazer zoom in a velocidade degradou-se. Significa que o QGIS deixa de usar as pirâmides do VRT e passa a mostrar as imagens originais… penso que poderá ser um bug.</p>
<p>Portanto a solução passa por criar overheads para cada uma das imagens originais, e ver se assim o QGIS utiliza sempre as overheads.</p>
<p>Para isso usei um comando de linha que percorre todas as imagens TIFF numa directoria e executa o comando <em>gdaladdo</em>:</p>
<div><code>for %I in (directoria_originais\*.tif) do gdaladdo -ro %I 2 4 8 16 32 64 128</code></div>
<p>O resultado foi a criação de um ficheiro OVR para cada TIFF, cada um com 82MB (35% dos originais). Voltando a carregar o mosaico VRT no QGIS, o desempenho foi excelente em todos os níveis de zoom, provando que o QGIS usou sempre as overheads.</p>
<p>NOTA: por curiosidade abri o mosaico VRT no ArcGIS, e tudo funcionou perfeitamente, incluindo as overheads! Sabe-se há muito que o ArcGIS incluía o GDAL, não se sabendo bem para o quê. Pelos vistos, servirá também para ler VRT’s e overheads.</p>
<h4>O caso ECW</h4>
<p>O formato ECW agrada-me muito. Tem compressões equivalentes ao MrSID, é gratuito para comprimir imagens até 500MB, é rápido a visualizar, e já inclui pirâmides no próprio ficheiro. Poupa assim espaço em disco 2x: na compressão e nas pirâmides.</p>
<p>A questão que se coloca é saber até que ponto vai a penalização na performance do MapServer ao ter que descomprimir os ECW para os visualizar a cada Zoom e a cada Pan.</p>
<p>Para criar um mosaico VRT com ECW’s tivemos de converter todos os TIFF originais, com o seguinte comando:</p>
<div><code>for %I in (directoria_originais\*.tif) do gdal_translate -of ECW -co TARGET=90 %I directoria_destino\%~nI.ecw</code></div>
<p>As imagens originais passaram de 13GB (contando com as overheads) para 605MB – poupando 95% do espaço! Podiamos ainda comprimir mais, mas neste estudo preferi manter os defaults…</p>
<p>Criámos um novo VRT com as imagens ECW, e testámos no QGIS. A visualização foi muito rápida e sem degradação ao aumentar a escala.</p>
<h4>O caso JPEG</h4>
<p>Este formato é muito apreciado por ser familiar, bastante rápido, e apresentar taxas de compressão bastante atractivas (embora não consiga acompanhar a compressão dos novos formatos como MrSID e ECW). A questão que se coloca é saber se a multa devida pela descompressão se nota ou não em MapServer. Não esquecer que será necessário criar overheads. Neste teste optei por criar as pirâmides também em formato JPEG, por forma a ser mais fiel ao formato. Se este formato for suficientemente rápido poderá ser uma boa alternativa ao TIFF. Para criar pirâmides em formato JPEG pode-se usar o seguinte comando (está tudo documentado na página do <a title="página do GDAL sobre criação de overheads" href="http://www.gdal.org/gdaladdo.html" target="_blank">gdaladdo</a>):</p>
<div><code>gdaladdo --config COMPRESS_OVERVIEW JPEG --config PHOTOMETRIC_OVERVIEW YCBCR --config INTERLEAVE_OVERVIEW PIXEL imagem 2 4 8 16 32 64 128</code></div>
<p>O resultado foram imagens JPEG e OVR ocupando 915MB (93% de compressão). Em QGIS o resultado foi mais uma vez excelente… visualização rápida de inicio, sem degradação com os zoom in… Além da velocidade, fiquei surpreendido com a compressão atingida e com a óptima qualidade das imagens ao ver todo o mosaico.</p>
<h4>O caso JPEG2000</h4>
<p>Este formato é uma alternativa aos formatos ECW e MrSID, mas mais aberto. No entanto, tem-se revelado sistematicamente lento demais para o poder utilizar a não ser para fins de arquivo.</p>
<p>Decidi mesmo assim inclui-lo no teste. Converti todas as imagens TIFF para JP2, e criei um mosaico VRT. No teste com QGIS, a velocidade foi muito rápida de início, apenas demorando um pouco mais com o aumento da escala de visualização. No entanto, a sua qualidade de imagem ao ver todo o mosaico foi excelente.</p>
<h4>Mosaicos Shapefile (TILEINDEX)</h4>
<p>A forma tradicional de usar mosaicos no MapServer é criar um shapefile com polígonos que cobrem a área de cada ortofotomapa. Este shapefile é depois referenciado no mapfile em vez do ficheiro VRT.</p>
<p>A questão que se coloca é saber se a utilização de um VRT implica uma redução de performance, quando comparada com a utilização de um shapefile.</p>
<p>Criei por isso mosaicos usando shapefiles, e medi os tempos de visualização em MapServer. Afinal, nem sempre novos métodos se revelam melhores que os antigos. O comando que usei foi o seguinte:</p>
<div><code>gdaltindex mosaico.shp directoria\*.tif</code></div>
<p>Não descobri forma de visualizar este tipo de mosaico em QGIS…</p>
<h4>Mosaicos monolíticos</h4>
<p>A última variante de mosaicos conhecida pela humanidade &#8211; juntar todas as imagens numa única, e gigante, imagem.</p>
<p>Para criar este mosaico vamos usar a ferramenta <em>gdal_merge</em>, que é um script python incluído no GDAL (pelo menos na versão <a title="página para obter o FWTools" href="http://fwtools.maptools.org/" target="_blank">FWTools</a>). O plano é juntar todos os tiffs originais, criando um novo tiff. Mas nesta altura, o espaço em disco começava a escassear…</p>
<p>Para poupar algum espaço em disco, optei por usar compressão JPEG. Como o ficheiro poderá ser maior que 4GB usei a opção “bigtiff=yes” (por limitações do formato tiff). E como o ficheiro cobrirá uma grande extensão geográfica, para acelerar o acesso a pequenas áreas, usei também a opção “tiled=yes”. Assim, o comando para criar o mosaico foi o seguinte:</p>
<div><code>gdal_merge -o mosaico.tif -of gtiff -co compress=jpeg -co tiled=yes -co tfw=yes -co bigtiff=yes -v imagens_originais\*.tif</code></div>
<p>Isto produziu um ficheiro com 3,5GB, dada a compressão JPEG dentro do ficheiro TIFF. Confuso? Sucede que o formato TIFF suporta uma variedade de processos de compressão. Um deles é o JPEG. Claro que esta compressão poderá comprometer a velocidade do mosaico, mas não tinha mais espaço em disco para criar um mosaico sem compressão.</p>
<p>O passo seguinte foi criar overheads/pirâmides para este mosaico. Também aqui optei por criar pirâmides comprimidas em JPEG, usando o seguinte comando:</p>
<div><code>gdaladdo --config COMPRESS_OVERVIEW JPEG --config PHOTOMETRIC_OVERVIEW YCBCR --config INTERLEAVE_OVERVIEW PIXEL -ro mosaico.tif 2 4 8 16 32 64 128</code></div>
<p>Este comando criou um ficheiro OVR com 320MB, sendo apenas 9% do original devido à compressão usada. No total, a compressão foi de 72%. Nada mau…</p>
<p>Em QGIS este mosaico foi extremamente rápido, mostrando o ficheiro numa fracção de segundo, e zooms e pans foram também muito rápidos. Definitivamente, foi das melhores prestações senão a melhor.</p>
<p>NOTA: seria interessante criar um mosaico enorme ECW, mas não foi possível por causa do limite de 500MB imposto pela licença gratuita do compressor ECW (incluído no GDAL).</p>
<h4>E agora… com MapServer</h4>
<p>Todos os testes foram efectuados num portátil,  com Windows 7, 32-bit, 2 GB de memória, e MS4W 2.2.7 (inclui o MapServer 5.0.2). Portanto, podemos esperar melhores resultados num PC ou servidor, onde o disco rígido será em princípio bastante mais rápido. Os testes foram feitos com uma pequena aplicação OpenLayers, que inicia com um mosaico visível em toda a extensão, sendo depois feitos 4 zooms no centro do mapa, manualmente.</p>
<p>Os tempos foram obtidos no log produzido pelo MapServer. Para criar este log, inseriram-se as seguintes linhas no <em>mapfile</em>:</p>
<pre><code>MAP
    CONFIG  "MS_ERRORFILE" "/ms4w/mapserver.log"
    DEBUG 5</code></pre>
<p>O mapa foi configurado para gerar imagens em JPEG, através do <a title="documentação do MapServer sobre o motor gráfico AGG" href="http://mapserver.org/output/agg.html" target="_blank">AGG</a>, usando esta secção no <em>mapfile</em>:</p>
<div><code>  OUTPUTFORMAT<br />
    NAME jpg<br />
    DRIVER AGG/JPEG<br />
    IMAGEMODE RGB<br />
  END</code></div>
<p>Para definir um layer com um mosaico VRT usou-se a seguinte sintaxe no <em>mapfile</em>, indicando o ficheiro VRT no tag DATA:</p>
<div><code>   LAYER<br />
    NAME 'mosaicoTotal_tif'<br />
    TYPE RASTER<br />
    DUMP true<br />
    TEMPLATE fooOnlyForWMSGetFeatureInfo<br />
    EXTENT -16500.000000 -83122.641509 4500.000000 -66877.358491<br />
    DATA 'mosaicoTotal_tifoverhds.vrt'<br />
    METADATA<br />
      'ows_title' 'mosaicoTotal_tif'<br />
    END<br />
    STATUS OFF<br />
    TRANSPARENCY 100<br />
    PROJECTION<br />
    'init=EPSG:27492'<br />
    END<br />
  END</code></div>
<p>Note-se que foram criados vários layers deste tipo, havendo um VRT para cada tipo de imagem: TIFF, ECW, JPG, JP2.</p>
<p>Para os mosaicos baseados em shapefile usou-se a seguinte sintaxe (TILEINDEX e TILEITEM no lugar de DATA):</p>
<pre>
<div><code>   LAYER
    NAME 'mosaicoTotalshp_tif'
    TYPE RASTER
    DUMP true
    TEMPLATE fooOnlyForWMSGetFeatureInfo
    EXTENT -16500.000000 -83122.641509 4500.000000 -66877.358491
    TILEINDEX 'mosaicoshp_tif.shp'
    TILEITEM 'location'
    METADATA
      'ows_title' 'mosaicoTotalshp_tif'
    END
    STATUS OFF
    TRANSPARENCY 100
    PROJECTION
    'init=EPSG:27492'
    END
  END</code></div>
</pre>
<h4>Resultados do MapServer</h4>
<p>Usando <strong>mosaicos VRT</strong> obtiveram-se os seguintes tempos:</p>
<table class="viasig" style="width: 600px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th width="99" valign="top">Zoom</th>
<th width="115" valign="top">TIFF+overhds</th>
<th width="100" valign="top">ECW</th>
<th width="100" valign="top">JP2</th>
<th width="100" valign="top">JPG</th>
<th width="84" valign="top">TIFmonolítico</th>
</tr>
<tr>
<td width="99" valign="top">Inicial</td>
<td width="115" valign="top">0.298</td>
<td width="100" valign="top">0.744</td>
<td width="100" valign="top">1.108</td>
<td width="100" valign="top">0.81</td>
<td width="84" valign="top">0.094</td>
</tr>
<tr>
<td width="99" valign="top">Z1</td>
<td width="115" valign="top">0.354</td>
<td width="100" valign="top">0.609</td>
<td width="100" valign="top">3.205</td>
<td width="100" valign="top">0.945</td>
<td width="84" valign="top">0.259</td>
</tr>
<tr>
<td width="99" valign="top">Z2</td>
<td width="115" valign="top">0.419</td>
<td width="100" valign="top">0.761</td>
<td width="100" valign="top">3.173</td>
<td width="100" valign="top">1.018</td>
<td width="84" valign="top">0.291</td>
</tr>
<tr>
<td width="99" valign="top">Z3</td>
<td width="115" valign="top">0.415</td>
<td width="100" valign="top">0.709</td>
<td width="100" valign="top">3.053</td>
<td width="100" valign="top">1</td>
<td width="84" valign="top">0.284</td>
</tr>
<tr>
<td width="99" valign="top">Z4</td>
<td width="115" valign="top">0.65</td>
<td width="100" valign="top">0.658</td>
<td width="100" valign="top">2.533</td>
<td width="100" valign="top">0.966</td>
<td width="84" valign="top">0.276</td>
</tr>
<tr>
<td width="99" valign="top"><strong>Totais</strong></td>
<td width="115" valign="top"><strong>2.136</strong></td>
<td width="100" valign="top"><strong>3.481</strong></td>
<td width="100" valign="top"><strong>13.072</strong></td>
<td width="100" valign="top"><strong>4.739</strong></td>
<td width="84" valign="top"><strong>1.204</strong></td>
</tr>
<tr>
<td width="99" valign="top">Espaço disco</td>
<td width="115" valign="top">13,5GB</td>
<td width="103" valign="top">605MB</td>
<td width="106" valign="top">509MB</td>
<td width="107" valign="top">915MB</td>
<td width="102" valign="top">3,85GB*</td>
</tr>
</tbody>
</table>
<p>*usando compressão JPEG, e incluindo overheads.</p>
<p>E em gráfico (a última categoria “Totais” representa a soma de todos os zooms, evidenciando os ganhos acumulados nos formatos mais rápidos):</p>
<div id="attachment_532" class="wp-caption alignnone" style="width: 607px"><a rel="attachment wp-att-532" href="http://blog.viasig.com/2010/01/mosaicos-de-imagens-em-mapserver-com-gdal/mapserver_mosaicos_vrt/"><img class="size-full wp-image-532" title="Desempenho de mosaicos VRT em MapServer." src="http://blog.viasig.com/wp-content/uploads/2010/01/mapserver_mosaicos_vrt1.png" alt="Desempenho de mosaicos VRT em MapServer." width="597" height="340" /></a><p class="wp-caption-text">Desempenho de mosaicos VRT em MapServer.</p></div>
<p>E o vencedor é… o mosaico monolítico, destacadíssimo. Dos mosaicos VRT, o mais rápido foi o mosaico de TIFF’s não comprimidos, como se supunha de início, com o formato ECW em 2º lugar, bastante melhor que o JPEG em 3º. O formato JPEG2000 é completamente desaconselhado.</p>
<p>Usando <strong>mosaicos baseados em Shapefile</strong>, obtiveram-se os seguintes resultados:</p>
<table class="viasig" style="width: 600px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th width="99" valign="top">Zoom</th>
<th width="115" valign="top">TIFF+overhds</th>
<th width="100" valign="top">ECW</th>
<th width="100" valign="top">JP2</th>
<th width="100" valign="top">JPG</th>
<th width="84" valign="top">TIFmonolítico</th>
</tr>
<tr>
<td width="99" valign="top">Inicial</td>
<td width="115" valign="top">0.287</td>
<td width="100" valign="top">2.374</td>
<td width="100" valign="top">4.206</td>
<td width="100" valign="top">2.366</td>
<td width="84" valign="top">0.094</td>
</tr>
<tr>
<td width="99" valign="top">Z1</td>
<td width="115" valign="top">0.337</td>
<td width="100" valign="top">2.355</td>
<td width="100" valign="top">6.121</td>
<td width="100" valign="top">2.355</td>
<td width="84" valign="top">0.259</td>
</tr>
<tr>
<td width="99" valign="top">Z2</td>
<td width="115" valign="top">0.247</td>
<td width="100" valign="top">1.082</td>
<td width="100" valign="top">3.583</td>
<td width="100" valign="top">1.139</td>
<td width="84" valign="top">0.291</td>
</tr>
<tr>
<td width="99" valign="top">Z3</td>
<td width="115" valign="top">0.186</td>
<td width="100" valign="top">0.656</td>
<td width="100" valign="top">3.069</td>
<td width="100" valign="top">0.76</td>
<td width="84" valign="top">0.284</td>
</tr>
<tr>
<td width="99" valign="top">Z4</td>
<td width="115" valign="top">0.176</td>
<td width="100" valign="top">0.657</td>
<td width="100" valign="top">2.412</td>
<td width="100" valign="top">0.926</td>
<td width="84" valign="top">0.276</td>
</tr>
<tr>
<td width="99" valign="top"><strong>Totais</strong></td>
<td width="115" valign="top"><strong>1.233</strong></td>
<td width="100" valign="top"><strong>7.124</strong></td>
<td width="100" valign="top"><strong>19.391</strong></td>
<td width="100" valign="top"><strong>7.546</strong></td>
<td width="84" valign="top"><strong>1.204</strong></td>
</tr>
<tr>
<td width="99" valign="top">Espaço disco</td>
<td width="115" valign="top">13,5GB</td>
<td width="103" valign="top">605MB</td>
<td width="106" valign="top">509MB</td>
<td width="107" valign="top">915MB</td>
<td width="102" valign="top">3,85GB*</td>
</tr>
</tbody>
</table>
<p>*usando compressão JPEG, e incluindo overheads.</p>
<p>E em gráfico:</p>
<div class="mceTemp">
<dl id="attachment_502" class="wp-caption " style="width: 606px;"><a rel="attachment wp-att-502" href="http://blog.viasig.com/2010/01/mosaicos-de-imagens-em-mapserver-com-gdal/mapserver_mosaicos_shp-png/"><img title="Desempenho de mosaicos SHP em MapServer" src="http://blog.viasig.com/wp-content/uploads/2010/01/mapserver_mosaicos_shp.png" alt="Desempenho de mosaicos SHP em MapServer" width="596" height="340" /></a> Desempenho de mosaicos SHP em MapServer</dl>
</div>
<p> </p>
<p>E o vencedor é… de novo o TIFF monolítico, mas havendo várias alterações. Só o mosaico de TIFF’s não comprimidos melhorou o desempenho em quase 100%, reduzindo de 2,1s para 1,2s. Todos os outros pioraram bastante, por vezes duplicando o tempo de visualização. Não encontrei explicação para esta penalização. O shapefile continha apenas 45 polígonos, sendo difícil acreditar que possa causar tão grande penalização, mesmo considerando que o MapServer tem de determinar quais os polígonos visíveis num momento, determinar as áreas de cada um, e abrir as imagens correspondentes… parece-me pouco trabalho para explicar diferenças de 1,6s como no caso dos ECW… Mas factos são factos.</p>
<h4>Conclusões</h4>
<p>Se não existirem impedimentos, deverá unir as suas imagens num mosaico único, em formato TIFF, comprimido em JPEG, e criar pirâmides também com compressão JPEG. Obtém o maior desempenho possível e com o extra de poupar 70% do espaço em disco. Esta abordagem foi simplesmente a melhor… mais vale guardar os seus originais num arquivo.</p>
<p>Quanto aos mosaicos VRT mostraram ser uma boa opção. Quase todos os formatos tiveram melhor desempenho quando usados através deste formato virtual, do que usando um mosaico baseado em shapefile. A excepção foi o mosaico de TIFF’s não comprimidos. Aqui, usar o mosaico shapefile foi melhor, muito melhor.</p>
<h4>Nota Final</h4>
<p>O formato VRT não serve apenas para criar mosaicos sem alterar as imagens originais, e por isso poderá ser uma opção atractiva em certas situações. Podemos, por exemplo, definir uma deslocação de +200km, +300km sem andar a editar ficheiros de coordenadas – alguém se lembra de passar por isto?? Parece-me que sim.</p>
<h4>Cábula de Comandos</h4>
<p>Todos os comandos usados no artigo…</p>
<table class="viasig" style="width: 600px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th width="600" valign="top">Criar mosaico VRT a com imagens de uma directoria:</th>
</tr>
<tr>
<td width="600" valign="top">gdalbuildvrt mosaico_tif.vrt directoria\*.tif</td>
</tr>
<tr>
<th width="600" valign="top">Criar overheads/pirâmides de uma imagem, num ficheiro separado</th>
</tr>
<tr>
<td width="600" valign="top">gdaladdo -ro imagem.tif 2 4 8 16 32 64 128</td>
</tr>
<tr>
<th width="600" valign="top">Criar overheads/pirâmides para todas as imagens TIFF numa directoria</th>
</tr>
<tr>
<td width="600" valign="top">for %I in (directoria_originais\*.tif) do gdaladdo -ro %I 2 4 8 16 32 64 128</td>
</tr>
<tr>
<th width="600" valign="top">Converter todos os TIFF numa directoria para ECW noutra directoria</th>
</tr>
<tr>
<td width="600" valign="top">for %I in (directoria_originais\*.tif) do gdal_translate -of ECW -co TARGET=90 %I directoria_destino\%~nI.ecw</td>
</tr>
<tr>
<th width="600" valign="top">Criar overheads/pirâmides com compressão JPEG</th>
</tr>
<tr>
<td width="600" valign="top">gdaladdo &#8211;config COMPRESS_OVERVIEW JPEG &#8211;config PHOTOMETRIC_OVERVIEW YCBCR &#8211;config INTERLEAVE_OVERVIEW PIXEL imagem.tif 2 4 8 16 32 64 128</td>
</tr>
<tr>
<th width="600" valign="top">Criar mosaico baseado em shapefile das imagens TIFF numa directoria</th>
</tr>
<tr>
<td width="600" valign="top">gdaltindex mosaico.shp directoria\*.tif</td>
</tr>
<tr>
<th width="600" valign="top">Criar um mosaico monolítico tif, com compressão jpeg, das imagens tiff numa directoria</th>
</tr>
<tr>
<td width="600" valign="top">gdal_merge -o mosaico.tif -of gtiff -co compress=jpeg -co tiled=yes -co tfw=yes -co bigtiff=yes -v imagens_originais\*.tif</td>
</tr>
<tr>
<th width="600" valign="top">MapServer: configurar um mapfile para gerar um ficheiro log com tempos</th>
</tr>
<tr>
<td width="600" valign="top">MAP    CONFIG  &#8220;MS_ERRORFILE&#8221; &#8220;/ms4w/mapserver.log&#8221;    DEBUG 5</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.viasig.com/2010/01/mosaicos-de-imagens-em-mapserver-com-gdal/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
