<?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>Blog Geo.NET &#187; Banco de Dados Geográficos</title>
	<atom:link href="http://blog.geoprocessamento.net/tag/banco-de-dados-geograficos/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.geoprocessamento.net</link>
	<description>Geoprocessamento, SIG e Sensoriamento Remoto</description>
	<lastBuildDate>Tue, 24 Aug 2010 02:33:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Construindo funcionalidades para o WKT Raster</title>
		<link>http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=construindo-funcionalidades-para-o-wkt-raster</link>
		<comments>http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 13:54:48 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[WKTRaster]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=945</guid>
		<description><![CDATA[


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/' rel='bookmark' title='Permanent Link: PostGIS WKT Raster'>PostGIS WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-2/' rel='bookmark' title='Permanent Link: Funções PostGIS #2'>Funções PostGIS #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-1/' rel='bookmark' title='Permanent Link: Funções PostGIS #1'>Funções PostGIS #1</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No post anterior, falamos um pouquinho sobre como o WKT Raster funciona. Hoje gostaria de mostrar um pouquinho sobre as maquinações que ando desenvolvendo para o PostGIS e WKT Raster.</p>
<p style="text-align: justify;">Em tese, se o <em>raster</em> está armazenado no banco e conseguimos determinar o valor de cada pixel, poderíamos usar a SQL para realizar álgebra de mapas? A resposta é sim, podemos. É claro, já existem softwares especializados em realizar álgebra de mapas, como o <a title="idrisi" href="http://www.idrisi.com.br/" target="_blank">IDRISI</a>,<a title="envi" href="http://www.envi.com.br/" target="_self"> ENVI</a>, <a title="spring" href="http://www.dpi.inpe.br/spring/" target="_blank">SPRING</a>, ArcGIS (com <a title="spatial" href="http://www.esri.com/software/arcgis/extensions/spatialanalyst/index.html" target="_blank">Spatial Analyst</a>), o módulo <a title="sextante" href="http://forge.osor.eu/plugins/wiki/index.php?id=13&amp;type=g" target="_blank">Sextante</a> do gvSIG, <a title="whitebox" href="http://www.uoguelph.ca/~hydrogeo/Whitebox/index.html" target="_blank">WhiteBox</a>, entre outros.</p>
<p style="text-align: justify;">A vantagem de fazermos isto no PostGIS é que podemos aproveitar de algumas funcionalidades do banco de dados para realizar atualizações automáticas (funciona, mas a perfomance não deve ser das melhores), controlar melhor o acesso aos rasters - centralizando tudo em uma única localização, backup, etc.</p>
<p style="text-align: justify;">Existem diversas funções para análise espacial de rasters, incluindo as matemáticas, lógicas, entre outras. Hoje irei mostrar apenas algumas matemáticas, que são bem simples. O módulo WKT Raster já planeja construir em C (linguagem nativa do PostgreSQL) algumas funções para análise espacial, mas enquanto isto não acontece, vamos levando com estas aqui.</p>
<p style="text-align: justify;">Importante: estas funções só operam com <em>rasters</em> de uma única banda. Todas as operações são realizadas na banda 1. Nenhuma operação é realizada na banda 2 ou 3 - se bem que o suporte para tal é simples de ser construído.</p>
<p style="text-align: justify;">Cuidado ao utilizar estas funções. Caso você sobreescreva seu <em>raster</em>, não o conseguirá de volta - caso precise.</p>
<h3 style="text-align: justify;">ST_Plus</h3>
<p style="text-align: justify;">Esta função adiciona um valor <em>double precision</em> ao nosso raster de interesse. Se o pixel tem valor 1 e nosso argumento é 1, o resultado daquele pixel será 2. Esta função tem como entrada um raster e um valor numérico. O retorno da função é um objeto raster completo.</p>
<pre name="code" class="SQL">
CREATE OR REPLACE FUNCTION ST_Plus(p_grid raster, z double precision)
	RETURNS raster AS
$$
DECLARE
	w integer;
	h integer;
	z1 integer;

	grid raster;
BEGIN

	SELECT
		ST_Width(p_grid),
		ST_Height(p_grid)
	 into w,h;

	-- realizar cópia do raster original
	grid := p_grid;

	for i in 1..h loop
		for j in 1..w loop

			-- selecting cell value
			z1 := ST_Value(p_grid,i,j);
			grid := st_setvalue(grid,1,i,j,z1 + z);

		end loop;
	end loop;

	return grid;
END
$$
language 'plpgsql';
</pre>
<p style="text-align: justify;">A função é bem simples. Ela copia o raster original em memória e adiciona o valor à cada pixel. Sem segredos. Como usá-la? Recomendo primeiramente, duplicar sua coluna do tipo<em> raster</em>, pois a função de adição de colunas <em>raster</em> é bastante longa e com parâmetros meio obscuros. Procure o arquivo SQL gerado pelo gdal2wktraster e ache a linha que adiciona a coluna. Modifique o nome da coluna e execute este comando novamente. Depois disso popule a coluna com os novos valores.</p>
<pre name="code" class="SQL">
SELECT AddRasterColumn('public','teste_raster','grid_stplus',-1, ARRAY['16BUI'], false,
       true, null, 0.000833, -0.000833, 9, 9,
           ST_Envelope(
               ST_SetSRID('POLYGON((-49.500416 -18.000416,-49.500416 -19.000416,-48.000416 -18.000416,-48.000416 -19.000416,-49.500416 -18.000416))'::geometry, -1)));

UPDATE teste_raster SET grid_stplus = ST_Plus('nome_da_coluna_raster_original',10);
</pre>
<p style="text-align: justify;">Faça um teste com ST_Value para identificar se tudo correu bem. Neste teste, somamos 10 unidades ao valor de cada pixel da coluna original raster. Por que estamos criando uma coluna extra para armazenar nosso novo raster? Se alterarmos o raster original, não conseguiremos ele de volta, portanto, cuidado ao utilizar as funções.</p>
<h3>ST_Minus</h3>
<p>De forma similar à ST_Plus, ST_Minus vai subtrair determinado valor de cada pixel de nosso raster e nos trará como resultado o <em>raster</em> modificado.</p>
<pre name="code" class="SQL">
CREATE OR REPLACE FUNCTION ST_Minus(p_grid raster, z double precision)
	RETURNS raster AS
$$
DECLARE
	w integer;
	h integer;
	z1 integer;

	grid raster;
BEGIN

	SELECT
		ST_Width(p_grid),
		ST_Height(p_grid)
	 into w,h;

	-- realizar cópia do raster original
	grid := p_grid;

	for i in 1..h loop
		for j in 1..w loop

			-- selecting cell value
			z1 := ST_Value(p_grid,i,j);
			grid := st_setvalue(grid,1,i,j,z1 - z);

		end loop;
	end loop;

	return grid;
END
$$
language 'plpgsql';
</pre>
<p>Recomendo testar da mesma maneira que a função anterior. O uso é o mesmo - modificando o nome da função.</p>
<h3>ST_Plus</h3>
<p>Esta função realiza a multiplicação do valor do pixel. Simples e direta.</p>
<pre name="code" class="SQL">
CREATE OR REPLACE FUNCTION ST_Times(p_grid raster, z double precision)
	RETURNS raster AS
$$
DECLARE
	w integer;
	h integer;
	z1 integer;

	grid raster;
BEGIN

	SELECT
		ST_Width(p_grid),
		ST_Height(p_grid)
	 into w,h;

	-- realizar cópia do raster original
	grid := p_grid;

	for i in 1..h loop
		for j in 1..w loop

			-- selecting cell value
			z1 := ST_Value(p_grid,i,j);
			grid := st_setvalue(grid,1,i,j,z1 * z);

		end loop;
	end loop;

	return grid;
END
$$
language 'plpgsql';
</pre>
<p>Use-a do mesmo jeito que as anteriores.</p>
<h3>ST_Divide</h3>
<pre name="code" class="SQL">
CREATE OR REPLACE FUNCTION ST_Divide(p_grid raster, z double precision)
	RETURNS raster AS
$$
DECLARE
	w integer;
	h integer;
	z1 integer;

	grid raster;
BEGIN
	if (z = 0) then
		return p_grid;
	end if;

	SELECT
		ST_Width(p_grid),
		ST_Height(p_grid)
	 into w,h;

	-- realizar cópia do raster original
	grid := p_grid;

	for i in 1..h loop
		for j in 1..w loop

			-- selecting cell value
			z1 := ST_Value(p_grid,i,j);
			grid := st_setvalue(grid,1,i,j,z1 / z);

		end loop;
	end loop;

	return grid;
END
$$
language 'plpgsql';
</pre>
<h3>ST_Power</h3>
<p>Esta função eleva o valor da célula ao valor passado como parâmetro na função. Se temos uma célula de valor 2, e passamos 2 como parâmetro, teremos o 4 como resultado (2^2);</p>
<pre name="code" class="SQL">
CREATE OR REPLACE FUNCTION ST_Power(p_grid raster, z double precision)
	RETURNS raster AS
$$
DECLARE
	w integer;
	h integer;
	z1 integer;

	grid raster;
BEGIN

	SELECT
		ST_Width(p_grid),
		ST_Height(p_grid)
	 into w,h;

	-- realizar cópia do raster original
	grid := p_grid;

	for i in 1..h loop
		for j in 1..w loop

			-- selecting cell value
			if z = 0 then
				grid := st_setvalue(grid,1,i,j,1);
			else
				z1 := st_value(p_grid,i,j);
				grid := st_setvalue(grid,1,i,j,z1 ^ z);
			end if;

		end loop;
	end loop;

	return grid;
END
$$
language 'plpgsql';
</pre>
<p style="text-align: justify;">E assim podemos construir funções que alterem nossos rasters originais. São funções simples, praticamente demonstrativas. Na sequência demonstraremos algumas funções mais interessantes, como <strong>declividade, cálculo de fluxo de direção, identificação de depressões, eliminação de depressões, </strong>entre outras.</p>
<p style="text-align: justify;">Um abraço,</p>
<p style="text-align: justify;">George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/' rel='bookmark' title='Permanent Link: PostGIS WKT Raster'>PostGIS WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-2/' rel='bookmark' title='Permanent Link: Funções PostGIS #2'>Funções PostGIS #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-1/' rel='bookmark' title='Permanent Link: Funções PostGIS #1'>Funções PostGIS #1</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PostGIS WKT Raster</title>
		<link>http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=postgis-wkt-raster</link>
		<comments>http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/#comments</comments>
		<pubDate>Sat, 31 Jul 2010 03:00:15 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[WKTRaster]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=931</guid>
		<description><![CDATA[Buenas pessoal, Como estão as coisas? Hoje vamos conversar um pouquinho sobre o WKT Raster. O WKT Raster é um projeto para implementar suporte aos famosos grids, rasters, imagens ao PostGIS. WKT vem de Well Known Text (algo como "texto bem conhecido"). O projeto já tem código compilado e funcionando e tomei a semana para [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/' rel='bookmark' title='Permanent Link: Construindo funcionalidades para o WKT Raster'>Construindo funcionalidades para o WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-pt4/' rel='bookmark' title='Permanent Link: #Python &#8211; pt4'>#Python &#8211; pt4</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-pt2/' rel='bookmark' title='Permanent Link: #Python &#8211; pt2'>#Python &#8211; pt2</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Buenas pessoal,</p>
<p style="text-align: justify;">Como estão as coisas? Hoje vamos conversar um pouquinho sobre o WKT Raster.</p>
<p style="text-align: justify;">O WKT Raster é um projeto para implementar suporte aos famosos <em>grids, rasters, </em>imagens ao PostGIS. WKT vem de <em>Well Known Text</em> (algo como "texto bem conhecido").</p>
<p style="text-align: justify;">O projeto já tem código compilado e funcionando e tomei a semana para testá-lo de acordo. A implementação veio da especificação desenvolvida por Pierre Racine. O projeto tem como objetivo integrar-se perfeitamente ao engine do PostGIS já existente, sendo possível executar operações espaciais / álgebra de mapas, carregar rasters multi-bandas, entre outras coisas deliciosas.</p>
<p style="text-align: justify;">Este projeto é muito interessante, pois podemos armazenar os rasters dentro do banco de dados, garantindo ou excluindo acesso à quem realmente precisa, ao invés de ficarmos com milhares de cópias por aí (imagine um escritório com 20 analistas GIS - qual é quantidade de informações duplicadas), sem saber ao certo qual é a mais atual ou com melhor qualidade - enfim, nos garante todas as vantagens do armazenamento centralizado em banco de dados. Não necessariamente <strong>precisamos</strong> armazenar os dados no PostgreSQL, podemos deixá-los em HD e adicionar somente os metadados e acessá-los da mesma forma, caso você esteja preocupado com disco <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Em suma, é demais!</p>
<p style="text-align: justify;">Vamos comentar com instalar essa belezinha no seu PostgreSQL - em Windows XP. Linux <em>users, sorry.</em></p>
<h3 style="text-align: justify;">Pré-requisitos</h3>
<p style="text-align: justify;">Sempre existem né?</p>
<ul style="text-align: justify;">
<li>PostgreSQL/PostGIS instalado. O PostGIS deve 1.4 ou maior, determinando também a versão do PostgreSQL: 8.3 ou maior;</li>
<li><a title="python" href="http://www.python.org/" target="_blank">Python</a>;</li>
<li><a title="gdal" href="http://pypi.python.org/pypi/GDAL/1.6.1" target="_blank">GDAL/python</a>;</li>
<li><a title="wktraster" href="http://www.postgis.org/download/windows/pg83/experimental/wktraster/" target="_blank">WKT Raster</a>;</li>
</ul>
<h3 style="text-align: justify;">Instalação</h3>
<p style="text-align: justify;">1) Instale o Python, 2.5 ou 2.6. Estou usando o 2.5, que foi instalado junto com o ArcGIS. Portanto, se você tem esta instação específica, não se preocupe. Esta instalação é bem simples. Dois cliques, pá pum, está instalado.</p>
<p style="text-align: justify;">2) Instale os GDAL bindings. Para fazer isso é só descompactar a pasta zipada e colocá-la no diretório que mais lhe agradar. Coloquei a minha pasta (gdalwin32-1.6) no diretório C:\.</p>
<p style="text-align: justify;">2.1) Vá em Painel de Controle &gt; Sistema &gt; Avançado &gt; Variáveis de Ambiente. Procure a variável PATH. Ela é composta de vários diretórios separados por um ponto-e-vírgula, correto? Adicione o diretório C:\gdalwin32-1.6\bin nesta listinha e adicione um ; no final. Claro, se você pos a pasta do gdal em outro diretório, faça as alterações pertinentes.</p>
<p style="text-align: justify;">2.2 ) Ainda em variáveis de ambiente, adicione uma nova variável, chamada GDAL_DATA e adicione o caminho C:\gdalwin32-1.6\data como caminho. Como esta variável de ambiente é usada somente pelo GDAL, não se preocupe em colocar o ;. Mas se colocar também não faz mal. Dê OK para salvar as variáveis de ambiente. Os bindings do GDAL para Python já estão instalados. Você pode acessá-los e utilizar o GDAL para um monte de coisas, como converter coordenadas de rasters, reprojetá-los, etc. tudo usando uma linha de comando.</p>
<p style="text-align: justify;">3) Descompacte o pacote do WKT Raster.</p>
<p style="text-align: justify;">3.1) Copie o arquivo rtpostgis.dll para a pasta <strong>lib</strong> do PostgreSQL. Geralmente é algo como C:\Program Files\PostgreSQL\8.x\lib;</p>
<p style="text-align: justify;">3.2) Copie os arquivos gdal2wktraster.py e libgdal.dll para a pasta <strong>bin</strong> da sua instalação do PostgreSQL. Fácil né?</p>
<p style="text-align: justify;">3.3) Vamos instalar os comandos e funções do Wkt Raster no nosso banco agora. Abra o PgAdmin3 ou o console sql do Postgres e conecte-se ao banco de dados alvo. Feito isso, rode os comandos que se encontram na pasta share\contrib\ do pacote WktRaster. Feito isso, teste se o WKT Raster está funcionando apropriadamente usando o comando SQL:</p>
<p style="text-align: justify;">SELECT postgis_raster_lib_build_date(),postgis_raster_lib_version();</p>
<p style="text-align: justify;">Caso o comando tenha sucesso, tudo foi instalado com sucesso.</p>
<p style="text-align: justify;">A instalação termina aqui. Mas como carregar um raster para dentro de nosso banco de dados? Podemos utilizar a ferramenta em Python desenvolvida para este propósito, o script gdal2wktraster.py</p>
<h3 style="text-align: justify;">Carregar um raster para o banco de dados</h3>
<p style="text-align: justify;">Esta ferramenta é uma aplicação em linha de comando, bastante fácil de utilizar. O resultado dela é um script .sql que você pode rodar pelo console sql ou pelo PgAdmin3.</p>
<p style="text-align: justify;">Abra um console DOS e digite:</p>
<p style="text-align: justify;">python "CaminhoParaOArquivo\gdal2wktraster.py" --help</p>
<p style="text-align: justify;">Isto lhe deve dar todas as opções da ferramenta.</p>
<p style="text-align: justify;">Algumas:</p>
<ul style="text-align: justify;">
<li><strong>-t </strong>nome da tabela à ser criada no PostGIS, e.g. -t teste_raster;</li>
<li><strong>-o </strong>nome do arquivo de saída, e.g. -o srtm.sql;</li>
<li><strong>-k</strong> especifica o tamanho <em>tile</em>. Esta opção é muito importante, pois divide seu <em>raster </em><strong>original</strong> em diversos registros cada um com este tamanho, <strong>em pixels.</strong> e.g. -k 90x90; Caso você não utilize esta opção, seu raster original ocupará apenas um único registro da tabela. Se você utilizá-la, você diz ao PostGIS: pegue este raster, fatie-o em pedaços de tal tamanho e insira-os nesta tabela!</li>
<li><strong>-f </strong>especifica o nome da coluna do tipo raster. e.g. -f grid;</li>
<li><strong>-r</strong> esta é a opção mais importante de todas, com ela especificamos o arquivo original à ser carregado. e.g. -r "CaminhoDoArquivoRaster\arquivo.tif";</li>
</ul>
<p style="text-align: justify;">Exemplo de um comando completo</p>
<p style="text-align: justify;">C:\Python25\python.exe "C:\Program Files\PostgreSQL\8.3\bin\gdal2wktraster.py" - r "C:\srtm.tif" -k 90x90 -f grid -t srtm -o srtm.sql</p>
<p style="text-align: justify;">Esta ferramenta é bem fácil de utilizar e gera um SQL limpinho, só faltando rodá-lo dentro do banco de dados.</p>
<p style="text-align: justify;">Estou desenvolvendo algumas ferramentinhas de análise espacial, em especial ferramentas para extração automática de feições - algumas já estão prontas, outras ainda no forno, mas logo logo falo sobre elas! Esta é a <a title="wktoficial" href="http://trac.osgeo.org/postgis/wiki/WKTRaster" target="_blank">página oficial do WKT Raster</a>.</p>
<p style="text-align: justify;">O que acharam?</p>
<p style="text-align: justify;">Abraços!</p>
<p style="text-align: justify;">George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/' rel='bookmark' title='Permanent Link: Construindo funcionalidades para o WKT Raster'>Construindo funcionalidades para o WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-pt4/' rel='bookmark' title='Permanent Link: #Python &#8211; pt4'>#Python &#8211; pt4</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-pt2/' rel='bookmark' title='Permanent Link: #Python &#8211; pt2'>#Python &#8211; pt2</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Usando Python e o geoprocessing framework #2</title>
		<link>http://blog.geoprocessamento.net/2010/07/usando-python-e-o-geoprocessing-framework-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=usando-python-e-o-geoprocessing-framework-2</link>
		<comments>http://blog.geoprocessamento.net/2010/07/usando-python-e-o-geoprocessing-framework-2/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 18:44:39 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[Geo Aplicado]]></category>
		<category><![CDATA[Geoprocessamento]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=881</guid>
		<description><![CDATA[Boa tarde pessoal! Continuando naquele nosso projetinho, hoje vamos falar sobre a classe em Python que atualiza nossos dados em um determinado banco de dados. Temos algumas particularidades quando trabalhamos com ArcSDE, (registro de camadas como versionadas/não versionadas), portanto mostrarei como trabalhar com um Geodatabase local. A alteração para ArcSDE não é tão grande, e [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/06/python-geoprocessing-framework1/' rel='bookmark' title='Permanent Link: Usando Python e o Geoprocessing Framework #1'>Usando Python e o Geoprocessing Framework #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-pt2/' rel='bookmark' title='Permanent Link: #Python &#8211; pt2'>#Python &#8211; pt2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/03/oopython/' rel='bookmark' title='Permanent Link: OOP com python &#8211; Uma breve introdução.'>OOP com python &#8211; Uma breve introdução.</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Boa tarde pessoal!</p>
<p>Continuando naquele nosso projetinho, hoje vamos falar sobre a classe em Python que atualiza nossos dados em um determinado banco de dados. Temos algumas particularidades quando trabalhamos com ArcSDE, (registro de camadas como versionadas/não versionadas), portanto mostrarei como trabalhar com um Geodatabase local. A alteração para ArcSDE não é tão grande, e com um cadinho de pesquisa vocês conseguem fazer.</p>
<p>Lembre-se das outras classes que precisamos, mostradas no post anterior.</p>
<p>Construiremos duas classes, uma chamada GeoprocessorWrapper, um "embrulho" do objeto geoprocessor da ESRI. Isto não necessário, mas facilita, já que facilitamos algumas operações através deste "embrulho". A outra será uma tarefa, que juntará todos os dados e resultados das classes anteriores para atualizar nosso banco de dados.</p>
<p>Vamos começar com a mais simples, geoprocessorWrapper:</p>
<pre name="code" class="python">
import arcgisscripting, logHandler

__toolboxAliases = [
            "analysis",
            "management",
            "3d",
            "cartography",
            "arc",
            "interop",
            "geocoding",
            "ga",
            "lr",
            "md",
            "na",
            "samples",
            "sa",
            "stats"]

class geoprocessorWrapperClass():
    def __init__(self,workspace,toolboxList,overwriteOutput=False):
        self.logs = logHandler.logHandlerClass()
        # Startup logging object
        self.gp = arcgisscripting.create(9.3)
        # Startup ESRI geoprocessing object

        self.gp.Workspace = workspace
        self.gp.OverwriteOutput = overwriteOutput
        # Define overwrite output. Default is to FALSE.

        #lista de toolboxes disponiveis
        self.toolboxList = []
        self.toolboxList += toolboxList

        self.buildGeoprocessorOptions(toolboxList)

    def buildGeoprocessorOptions(self):
        for x in self.toolboxList:
            try:
                if x in __toolboxAliases:
                    self.gp.AddToolbox(x)
            except:
                self.logs.newLogMessage(self, "Error in adding " + x + " toolbox to geoprocessor object. Are you sure this toolbox exists?" + self.gp.GetMessages(), "Geoprocessing Error")
    # adds all toolboxes to current geoprocessing object.

    def changeWorkspace(self,workspace):
        self.gp.Workspace = workspace;
    # changes the current workspace in geoprocessing object

    def removeToolboxes(self,toolboxList):
        for x in self.toolboxList:
            try:
                self.gp.RemoveToolbox(x)
                self.toolboxList.remove(x)
                self.logs.newLogMessage(self,"Removed " + x + "toolbox from geoprocessing object.","Information")
            except:
                self.logs.newLogMessage(self,self.gp.GetMessages(),"Geoprocessing Error")
    # removes unneeded toolboxes from current geoprocessing object
</pre>
<p style="text-align: justify;">Vamos começar com alguns detalhes desta classe:</p>
<p style="text-align: justify;">Em primeiro lugar, temos os tradicionais import x. Eles são responsáveis por disponibilizar outras bibliotecas ao nosso código. Note que importamos o módulo arcgisscripting.</p>
<p style="text-align: justify;">Logo depois, temos uma lista dos <em>aliases</em> que cada <em>toolbox</em> possui no Python.  É necessário adicionar uma toolbox ao objeto geoprocessing para que se tenha acesso às ferramentas da mesma - o que pode ser feito de dois jeitos, pelo caminho da toolbox (C:\Program Files\...\ArcGis\Toolbox.tbx) ou pelo seu apelido. A primeira maneira é útil para adicionar toolboxes customizadas, que não tem apelido. A segunda maneira é mais prática para adicionar as toolboxes tradicionais.</p>
<p style="text-align: justify;">O construtor da classe toma dois parâmetros obrigatórios e um opcional para inicializar a classe. O <em>workspace</em> é a pasta onde iremos trabalhar - ele poderia ser também um geodatabase, mas neste caso, uma pasta. toolboxList é uma lista com os apelidos das toolboxes que queremos adicionar ao nosso objeto de geoprocessing. O parâmetro adicional é se você deseja que os resultados do objeto geoprocessing sejam escritos por cima dos anteriores (caso tenham o mesmo nome) e é por default, falso.</p>
<p style="text-align: justify;">O construtor é bastante simples. Ele cria um objeto geoprocessing, utilizando a versão 9.3 como opção (ajuste para sua versão caso necessário - mas não garanto que funcione na 9.2 - já que vários métodos como ListDatasets, têm uma resposta diferente do que<br />
na versão 9.3), define qual é o workspace inicial e adiciona as toolboxes relevantes.</p>
<p>A forma de uso é a seguinte:</p>
<pre name="code" class="python">
g = geoprocessorWrapper.geoprocessorWrapperClass(r"C:\",["analysis","management","lr"])
#ou
g = geoprocessorWrapper.geoprocessorWrapperClass(r"C:\",["analysis","management","lr"],true)

# para acessar o geoprocessor do nosso wrapper, use:

listaDeFeatureClasses = g.gp.ListFeatureClasses()

for x in listaDeFeatureClasses:
    print x.FeatureType
</pre>
<p>Bem simples né? Temos um método também para mudar de<em> workspace, </em>sem necessitar de criarmos uma nova ferramenta. O outro método disponível é para remover toolboxes que não precisamos. Um método aqui poderia ser facilmente criado para adicionar novas toolboxes ao objeto. Alguém se arrisca?</p>
<p>Com esta classe podemos fazer quaisquer operações, mas utilizaremos uma outra classe para realizar todo o trabalho sujo. Lembra-se do código do post passado? Temos disponível em nossa máquina um arquivo .zip extraído em uma pasta qualquer, correto?</p>
<p>Vamos à classe geodatabaseUpdateTask.</p>
<pre name="code" class="python">
import os, sys

class geodatabaseOperationClass():
    def __init__(self,geoprocessor,inputShapefile,outputGeodatabase,outputFeatureDataset,outputFeatureClass):

        self.geoprocessorWrapperClass = geoprocessor

        self.inputShapefile = inputShapefile

        self.outputGeodatabase = outputGeodatabase
        self.outputFeatureDataset = outputFeatureDataset
        self.outputFeatureClass = outputFeatureClass

        self.processStage = 0
        self.stages = ["Testes de conformidade",
                       "Deleçãoo de Feature Class",
                       "Cópia de Shapefile",
                       "Atualização Completa"]

    def getProcessStage(self):
        return self.stages[self.processStage]

    def testGeodatabase(self):
        #workspace definido pelo geoprocessor
        return self.outputGeodatabase in self.geoprocessorWrapperClass.gp.ListWorkspaces(self.outputGeodatabase,"ALL")

    def testFeatureDataset(self):
        #adaptando workspace
        self.geoprocessorWrapperClass.gp.Workspace += "\\" + self.outputGeodatabase
        return self.outputFeatureDataset in self.geoprocessorWrapperClass.gp.ListDatasets(self.outputFeatureDataset,"ALL")

    def testFeatureClass(self):
        #adaptando workpace
        self.geoprocessorWrapperClass.gp.Workspace += "\\" + self.outputFeatureDataset
        return self.outputFeatureClass.gp.Workspace in self.geoprocessorWrapperClass.gp.ListFeatureClasses(self.outputFeatureClass,"ALL")

    def testAllObjetcs(self):
        if self.testGeodatabase() and self.testFeatureDataset() and self.testFeatureClass():
            self.processStage = 1
            return True
        else:
            self.processStage = 0
            return False

    def deleteFeatureClass(self,featureClass):
        try:
            self.geoprocessorWrapperClass.gp.Delete_management(featureClass)
        except:
            print self.geoprocessorWrapperClass.gp.getmessages()

    def copyFeatures(self,inputShapefile,outputFeatureClass):
        try:
            self.geoprocessorWrapperClass.gp.CopyFeatures_management(inputShapefile,outputFeatureClass)
        except:
            print self.geoprocessorWrapperClass.gp.getmessages()

    def updateFeatureClass(self):
        try:
            if self.testAllObjects:
                self.processStage += 1
                print self.getProcessStage()

                self.deleteFeatureClass(self.outputFeatureClass)
                self.processStage += 1
                print self.getProcessStage()

                self.copyFeatures(self.inputShapefile,self.outputFeatureClass)
                self.processStage += 1
                print self.getProcessStage()
        except:
            print self.geoprocessorWrapperClass.gp.getmessages()
</pre>
<p style="text-align: justify;">Temos os tradicionais import no cabeçalho de nosso arquivo e logo depois o construtor da classe.</p>
<p style="text-align: justify;">Nosso construtor tem os seguintes parâmetros: geoprocessor (um objeto do tipo geoprocessorWrapper), o caminho para o shapefile à ser carregado no banco de dados, o geodatabase de destino, o featureDataset de destino e a FeatureClass de destino.</p>
<p style="text-align: justify;">Você pode ver que construí uma lista de estágios que temos de passar antes de atualizar a FeatureClass. O estágio testes de conformidade vão garantir que os objetos existam no geodatabase e não ocorram erros. Esta etapa pode ser customizada, caso a FeatureClass não exista, crie a mesma, somente importando os dados - também deixo isto para o usuário interessado! Lembre-se que temos de passar um objeto geoprocessorWrapper com um workspace, uma pasta. Neste caso em específico, deve-se passar apenas pastas, pois definimos o geodatabase em outras áreas.</p>
<p style="text-align: justify;">Os testes cuidam da mudança de workspace e asseguram que a featureClass exista. Perceba que todo o trabalho é realizado dentro desta classe, nas funções:</p>
<ul>
<li>deleteFeatureClass()</li>
<li>copyFeatureClass()</li>
</ul>
<p>Uma função resume todo o processo: updateFeatureClass(). Veja que ela não tem parâmetros, pois usa os parâmetros setados no construtor. À medida que a mesma progride, atualiza o status do processo e informa ao usuário.</p>
<p>Forma de uso:</p>
<pre name="code" class="python">
gp = geoprocessorWrapper.geoprocessorWrapperClass(r"C:\",['management'])
geoOperation = geodatabaseOperation.geodatabaseOperationClass(gp,r"C:\shapefile.shp","teste.mdb","dnpm","dnpm_brasil")
geoOperation.updateFeatureClass()
</pre>
<p>Lembrem-se que o restante do código (buscar o arquivo na net, dezipar, etc) está no post anterior. Como prometi, aqui vai a classe LogHandler.</p>
<p><a href='http://blog.geoprocessamento.net/wp-content/uploads/2010/07/logger1.zip'>LogHandler Class</a></p>
<p>E ae pessoal? Dúvidas?</p>
<p>Podem ver que o Python dá muito poder ao framework de geoprocessing do ArcGIS e é muito simples.</p>
<p>Um abraço</p>
<p>George</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/06/python-geoprocessing-framework1/' rel='bookmark' title='Permanent Link: Usando Python e o Geoprocessing Framework #1'>Usando Python e o Geoprocessing Framework #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-pt2/' rel='bookmark' title='Permanent Link: #Python &#8211; pt2'>#Python &#8211; pt2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/03/oopython/' rel='bookmark' title='Permanent Link: OOP com python &#8211; Uma breve introdução.'>OOP com python &#8211; Uma breve introdução.</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/07/usando-python-e-o-geoprocessing-framework-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funções PostGIS #3</title>
		<link>http://blog.geoprocessamento.net/2010/05/funcoes-postgis-3/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=funcoes-postgis-3</link>
		<comments>http://blog.geoprocessamento.net/2010/05/funcoes-postgis-3/#comments</comments>
		<pubDate>Tue, 25 May 2010 17:11:20 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[Conceitos]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[PostGIS]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=725</guid>
		<description><![CDATA[Boa tarde pessoal! Vamos falar um pouco hoje das funções de análise espacial e medições. Antes disso, o blog alcançou +50 postagens essa semana. Parabéns para nós! ST_Area() Esta função é bastante simples. Ela retorna a área de um polígono ou multipolígono. -- assinatura -- SELECT ST_Area(geometria) SELECT ST_Area( ST_GeomFromText(('POLYGON((0 0, 1 0,1 1,0 1,0 [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-2/' rel='bookmark' title='Permanent Link: Funções PostGIS #2'>Funções PostGIS #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-1/' rel='bookmark' title='Permanent Link: Funções PostGIS #1'>Funções PostGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects-2/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects #2'>Brincando com ArcObjects #2</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Boa tarde pessoal!</p>
<p>Vamos falar um pouco hoje das funções de análise espacial e medições. Antes disso, o blog alcançou +50 postagens essa semana. Parabéns para nós!</p>
<h3>ST_Area()</h3>
<p>Esta função é bastante simples. Ela retorna a área de um polígono ou multipolígono.</p>
<pre name="code" class="SQL">-- assinatura
-- SELECT ST_Area(geometria)

SELECT ST_Area(
   ST_GeomFromText(('POLYGON((0 0, 1 0,1 1,0 1,0 0))')))
</pre>
<h3>ST_Perimeter()</h3>
<p>Outra função bastante simples, de um único argumento. O argumento deve ser uma geometria do tipo polígono. Se você passar uma LINESTRING, o PostGIS irá retornar 0. Veja ST_Length() para LINESTRINGs.</p>
<pre name="code" class="SQL">-- assinatura
-- SELECT ST_Area(geometria)

SELECT ST_Perimeter(
   ST_GeomFromText(('POLYGON((0 0, 1 0,1 1,0 1,0 0))')));

-- só funciona com polígonos. user ST_Length()
SELECT ST_Perimeter(
   ST_GeomFromText('LINESTRING(0 0, 1 0, 2 1, 2 2, 3 2)'));
</pre>
<h3>ST_Perimeter2D()</h3>
<p>Calcula o perímetro considerando apenas as coordenadas X e Y de um polígono.</p>
<pre name="code" class="SQL">-- assinatura
-- SELECT ST_Perimeter2D(geometria)
-- note que nosso polígono é 3D, possui Z.
SELECT ST_Perimeter2D(
   ST_GeomFromText(('POLYGON((0 0 1, 1 0 1,1 1 2,0 1 3,0 0 1))')));
</pre>
<h3>ST_Perimeter3D()</h3>
<p>Calcula o perímetro de um polígono levando em conta as coordenadas Z. Veja que nosso polígono anterior, com a coordenada Z, ST_Perimeter3D() nos dá um retorno diferente.</p>
<pre name="code" class="SQL">-- assinatura
-- SELECT ST_Perimeter3D(geometria)
-- note que o polígono é 3D, possui Z.
SELECT ST_Perimeter3d(
   ST_GeomFromText(('POLYGON((0 0 1, 1 0 1,1 1 2,0 1 3,0 0 1))')));
</pre>
<h3>ST_Length()</h3>
<p>Calcula o comprimento de uma LINESTRING. Simples e direto <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Esta função calcula o comprimento de uma linha em duas dimensões.</p>
<pre name="code" class="SQL">-- assinatura
-- SELECT ST_Length(geometria)

SELECT ST_Length(
    ST_GeomFromText('LINESTRING(0 0, 1 0, 2 1, 3 3)'));
</pre>
<h3>ST_Length2D()</h3>
<p>Exatamente igual à função acima. É apenas um apelido para ST_Length().</p>
<h3>ST_Length3D()</h3>
<p>Esta função funciona exatamente como ST_Perimeter3D. Mas para LINESTRINGs. Esta função leva em conta as coordenadas no eixo Z de uma geometria.</p>
<pre  name="code" class="SQL">
-- assinatura
-- SELECT ST_Length3D(geometria)

SELECT ST_Length3D(
    ST_GeomFromText('LINESTRING(0 0 1, 0 0 0, 1 0 2, 2 3 1)'));
</pre>
<h3>ST_Centroid()</h3>
<p>Esta função calcula o centro de massa de uma geometria. Para pontos é apenas uma média aritmética de seus conjuntos de coordenadas. Para LINESTRINGS, é o resultado de uma média ponderada do comprimento de seus segmentos e para polígonos o centro de massa do mesmo.</p>
<p>É possível aplicar esta função em qualquer tipo de geometria e em coleções genéricas (GEOMETRY_COLLECTIONs - conjuntos de geometrias de diversos tipos), sendo o resultado equivalente ao centróide do conjunto de geometrias de maior dimensionalidade (pontos são 0-dimensionais, linhas unidimensionais, polígonos bidimensionais). Ou seja, se temos um conjunto de pontos, linhas e polígonos, o centróide será igual ao centróide do conjunto de polígonos.</p>
<p>Esta função é importante. Diversas vezes a maneira mais prática e fácil de se transformar dados é através do centróide e preparar dados para estatísticas espaciais.</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_Centroid(geometria)

SELECT ST_AsText(
	ST_CENTROID(
	ST_GeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))')));

SELECT ST_AsText(
	ST_CENTROID(
	ST_GeomFromText('LINESTRING(0 0, 1 0, 1 1)')));

SELECT ST_AsText(
	ST_CENTROID(
	ST_GeomFromText('MULTIPOINT((0 0),(5 8),(10 1))')));
</pre>
<p>Aqui estão os resultados das chamadas acima.</p>
<div id="attachment_759" class="wp-caption aligncenter" style="width: 141px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Centroid.png"><img class="size-full wp-image-759" title="ST_Centroid" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Centroid.png" alt="Resultado da função ST_Centroid utilizando um polígono como argumento" width="131" height="52" /></a><p class="wp-caption-text">Resultado da função ST_Centroid utilizando um polígono como argumento</p></div>
<div id="attachment_761" class="wp-caption aligncenter" style="width: 163px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Centroid1.png"><img class="size-full wp-image-761" title="ST_Centroid1" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Centroid1.png" alt="Resultado da função ST_Centroid utilizando uma linestring como argumento" width="153" height="52" /></a><p class="wp-caption-text">Resultado da função ST_Centroid utilizando uma linestring como argumento</p></div>
<div id="attachment_760" class="wp-caption aligncenter" style="width: 162px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Centroid2.png"><img class="size-full wp-image-760" title="ST_Centroid2" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Centroid2.png" alt="Resultado da função ST_Centroid utilizando um multipoint como argumento" width="152" height="53" /></a><p class="wp-caption-text">Resultado da função ST_Centroid utilizando um multipoint como argumento</p></div>
<h3>ST_Intersects()</h3>
<p>Outra função importante. Esta função simplesmente teste se geometria A interseciona geometria B. Esta função <strong>não</strong> retorna a real interseção das duas partes, mas somente se elas se intersecionam ou não, <em>true</em> ou <em>false</em>. ST_Intersects pode ser utilizado com qualquer par de geometrias.</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_Intersercts(geometria_A,geometria_B);

-- retorna true
SELECT ST_Intersects(
	ST_GeomFromText('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'),ST_GeomFromText('LINESTRING(0 0, 2 2, 1 1)'));

-- retorna false
SELECT ST_Intersects(
	ST_GeomFromText('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'),ST_GeomFromText('LINESTRING(10 10, 20 10)'));
</pre>
<h3>ST_Intersection()</h3>
<p>Esta função é parecida com a ST_Intersects, mas esta retorna de fato a interseção entre as duas geometrias. Ambas as funções são computacionalmente intensivas, portanto cuidado ao utilizá-la em um sistema em produção, em views e outras coisas deste tipo. Esta função tem uma particularidade: podemos usar como parametro qualquer tipo de geometria, mas o resultado sempre virá no formato de geometria com menor dimensionalidade.</p>
<p>Exemplo: se computarmos a interseção entre dois polígonos, teremos como resultado um polígono (ou nulo). Se computarmos a interseção entre um polígono e diversas linhas, o resultado será uma LINESTRING <strong>obrigatoriamente</strong>. Porque? É matemático, a interseção de um polígono com um ponto sempre terá como resultado um ponto. Os resultados estão em verde.</p>
<p>Veja:</p>
<div id="attachment_765" class="wp-caption aligncenter" style="width: 274px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_line_line1.png"><img class="size-full wp-image-765" title="ST_Intersection_Linestrings" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_line_line1.png" alt="Resultado gráfico da interseção de duas LINESTRINGs" width="264" height="182" /></a><p class="wp-caption-text">Resultado gráfico da interseção de duas LINESTRINGs</p></div>
<p>Podemos ter como resultado da interseção entre duas LINESTRINGs um conjunto de pontos ou uma LINESTRING (quando dois segmentos são coincidentes).</p>
<div id="attachment_766" class="wp-caption aligncenter" style="width: 281px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_poli_ponto.png"><img class="size-full wp-image-766" title="ST_Intersection_PointPolygon" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_poli_ponto.png" alt="Resultado gráfico da interseção de um conjunto de pontos e um polígono" width="271" height="234" /></a><p class="wp-caption-text">Resultado gráfico da interseção de um conjunto de pontos e um polígono</p></div>
<div id="attachment_767" class="wp-caption aligncenter" style="width: 335px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_poli_linha.png"><img class="size-full wp-image-767" title="ST_Intersection_PolylinePolygon" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_poli_linha.png" alt="Resultado gráfico de ST_Intersection entre um conjunto de LINESTRINGs e um polígono" width="325" height="294" /></a><p class="wp-caption-text">Resultado gráfico de ST_Intersection entre um conjunto de LINESTRINGs e um polígono</p></div>
<div id="attachment_768" class="wp-caption aligncenter" style="width: 335px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_poli_poli.png"><img class="size-full wp-image-768" title="ST_IntersectionPolygonPolygon" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_poli_poli.png" alt="Resultado gráfico de ST_Intersection entre dois polígonos" width="325" height="284" /></a><p class="wp-caption-text">Resultado gráfico de ST_Intersection entre dois polígonos</p></div>
<p>Vamos à assinatura da função:</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_Intersection(geometria_A,geometria_B);

-- POLYGON e LINESTRING
SELECT ST_AsText(ST_Intersection(
	ST_GeomFromText('POLYGON((0 0,1 0, 1 1,0 1,0 0))'),
        ST_GeomFromText('LINESTRING(0 0,.5 .5,2 2,3 3)')));

-- POLYGON E PONTO
SELECT ST_AsText(ST_Intersection(
	ST_GeomFromText('POLYGON((0 0,1 0, 1 1,0 1,0 0))'),
        ST_GeomFromText('POINT(.2 .2)')))

-- POLYGON e POLYGON
SELECT ST_AsText(ST_Intersection(
	ST_GeomFromText('POLYGON((0 0,1 0, 1 1,0 1,0 0))'),
	ST_GeomFromText('POLYGON((.5 .5,1.5 .5,1.5 1.5,.5 1.5,.5 .5))')))

-- LINESTRING e LINESTRING
SELECT ST_AsText(ST_Intersection(
	ST_GeomFromText('LINESTRING(0 0,1 1,3 2,6 6)'),
	ST_GeomFromText('LINESTRING(-1 -1,.5 .5,3 4,5 6)')))
</pre>
<p>Os resultados em formato texto são os seguintes:</p>
<div id="attachment_773" class="wp-caption aligncenter" style="width: 354px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_polygon_line.png"><img class="size-full wp-image-773" title="ST_IntersectionText_PolygonLinestring" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_polygon_line.png" alt="Resultado textual de ST_Intersection entre um polígono e uma linestring" width="344" height="55" /></a><p class="wp-caption-text">Resultado textual de ST_Intersection entre um polígono e uma linestring</p></div>
<div id="attachment_774" class="wp-caption aligncenter" style="width: 355px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_polygon_point.png"><img class="size-full wp-image-774" title="ST_IntersectionText_PolygonPoint" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_polygon_point.png" alt="Resultado textual de ST_Intersection entre um polígono e um ponto" width="345" height="55" /></a><p class="wp-caption-text">Resultado textual de ST_Intersection entre um polígono e um ponto</p></div>
<div id="attachment_775" class="wp-caption aligncenter" style="width: 357px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_polygon_polygon.png"><img class="size-full wp-image-775" title="ST_IntersectionText_PolygonPolygon" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_polygon_polygon.png" alt="Resultado textual de ST_Intersection entre dois polígonos" width="347" height="55" /></a><p class="wp-caption-text">Resultado textual de ST_Intersection entre dois polígonos</p></div>
<div id="attachment_776" class="wp-caption aligncenter" style="width: 356px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_LINE_line.png"><img class="size-full wp-image-776" title="ST_IntersectionText_LinestringLinestring" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_intersection_text_LINE_line.png" alt="Resultado textual de ST_Intersection entre duas LINESTRINGs" width="346" height="55" /></a><p class="wp-caption-text">Resultado textual de ST_Intersection entre duas LINESTRINGs</p></div>
<p>Uma nota importante: pontos não se intersecionam. Ou eles são coincidentes ou não.</p>
<h3>ST_Overlaps</h3>
<p>Esta função é parecida em funcionamento com a ST_Intersects. Na verdade ela realiza a mesma operação que ST_Intersects, mas leva em consideração se um objeto não está contido plenamente dentro do outro. Esta função opera com qualquer tipo de geometria, mas presta atenção na dimensionalidade de cada uma: uma geometria de menor dimensionalidade está sempre contida na geometria de maior dimensionalidade, portanto, não sobrepõe a de maior dimensionalidade.</p>
<p>Exemplo: geometria_a é um ponto e geometria_b é um polígono. Se perguntado se ST_Overlaps(geometria_a,geometria_b), o PostGIS vai retornar falso, pois não são da mesma dimensionalidade. Se geometria_a é um polígono e geometria_b também, a operação pode retornar verdadeiro, caso a sobreposição ocorra.</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_Overlaps(geometria_a,geometria_b)

-- [1]
-- mesma dimensionalidade: estas geometrias podem se sobrepor.
SELECT ST_Overlaps(
	ST_GeomFromText('LINESTRING(0 0,1 1,3 2,6 6)'),
	ST_GeomFromText('LINESTRING(-1 -1,.5 .5,3 4,5 6)'))

-- [2]
-- mesma dimensionalidade: estas geometrias podem se sobrepor.
SELECT ST_Overlaps(
	ST_GeomFromText('POLYGON((0 0,1 0,1 1,0 1,0 0))'),
	ST_GeomFromText('POLYGON((.5 .5,1.5 .5,1.5 1.5,.5 1.5,.5 .5))'))

-- [3]
-- dimensionalidade diferente: estas geometrias não podem se sobrepor (mesmo que se intersecionem)
SELECT ST_Overlaps(
	ST_GeomFromText('LINESTRING(0 0,1 1,3 2,6 6)'),
	ST_GeomFromText('POINT(0 0)'));

-- [4]
-- dimensionalidade diferente: estas geometrias não podem se sobrepor (mesmo que se intersecionem)
SELECT ST_Overlaps(
	ST_GeomFromText('POLYGON((0 0,1 0,1 1,0 1,0 0))'),
	ST_GeomFromText('POINT(0 0)'));
</pre>
<div id="attachment_780" class="wp-caption aligncenter" style="width: 144px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Overlaps_LinestringLinestring.png"><img class="size-full wp-image-780" title="ST_Overlaps_True" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Overlaps_LinestringLinestring.png" alt="Resultado da função ST_Overlaps nos exemplos 1 e 2 de ST_Overlaps" width="134" height="52" /></a><p class="wp-caption-text">Resultado da função ST_Overlaps nos exemplos 1 e 2 de ST_Overlaps</p></div>
<div id="attachment_781" class="wp-caption aligncenter" style="width: 144px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Overlaps_LinestringPoint.png"><img class="size-full wp-image-781" title="ST_Overlaps_False" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Overlaps_LinestringPoint.png" alt="Resultado da função ST_Overlaps nos exemplos 3 e 4 de ST_Overlaps" width="134" height="52" /></a><p class="wp-caption-text">Resultado da função ST_Overlaps nos exemplos 3 e 4 de ST_Overlaps</p></div>
<h3>ST_Covers()</h3>
<p>Esta função retorna verdadeiro caso nenhum ponto da geometria_b se encontre fora da geometria_a.</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_Covers(geometria_a,geomtria_b);

-- geometria_a cobre geometria_b? verdadeiro
SELECT ST_Covers(
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'),
	ST_GeomFromText('POLYGON((.5 .5,1.5 .5,1.5 1.5,.5 1.5,.5 .5))'));

-- geometria_a cobre geometria_b? verdadeiro, todos os pontos de geometria_b estão contidos em a
SELECT ST_Covers(
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'),
	ST_GeomFromText('POINT(1 1)'));

-- geometria_a cobre geometria_b? falso. geometria_a é menor que geometria_a.
SELECT ST_Covers(
	ST_GeomFromText('POLYGON((.5 .5,1.5 .5,1.5 1.5,.5 1.5,.5 .5))'),
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'));

-- geometria_a cobre geometria_b? falso. geometria_a cobre geometria_b parcialmente (note o segundo ponto, em 100 100)
SELECT ST_Covers(
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'),
	ST_GeomFromText('MULTIPOINT((1 1),(100 100))'));
</pre>
<div id="attachment_782" class="wp-caption aligncenter" style="width: 145px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_covers_true.png"><img class="size-full wp-image-782" title="ST_Covers_True" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_covers_true.png" alt="Resultado da função ST_Covers utilizando com dois polígonos" width="135" height="52" /></a><p class="wp-caption-text">Resultado da função ST_Covers utilizando com dois polígonos</p></div>
<div id="attachment_783" class="wp-caption aligncenter" style="width: 144px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_covers_false.png"><img class="size-full wp-image-783" title="ST_Covers_False" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_covers_false.png" alt="Resultado da função ST_Covers entre um polígono e multipontos" width="134" height="53" /></a><p class="wp-caption-text">Resultado da função ST_Covers entre um polígono e multipontos</p></div>
<h3>ST_Within()</h3>
<p>Esta função é similar em funcionamento à ST_Covers(). A diferença aqui é que esta retorna positivo se estiver completamente dentro de B.</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_Within(geometria_a,geometria_b)

-- [1]
-- geometria_a está completamente dentro de geometria_b? verdadeiro
SELECT ST_Within(
	ST_GeomFromText('POINT(5 5)'),
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'));

-- [2]
-- geometria_a está completamente dentro de geometria_b? verdadeiro
SELECT ST_Within(
	ST_GeomFromText('LINESTRING(5 5, 2 3, 1 0)'),
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'));

-- [3]
-- geometria_a está completamente dentro de geometria_b? verdadeiro
SELECT ST_Within(
	ST_GeomFromText('POLYGON((1 1,2 1,2 2,1 2,1 1))'),
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'));

-- [4]
-- geometria_a está completamente dentro de geometria_b? falso. geometrias de dimensionalidade menor não contém geometrias de maior
-- dimensionalidade
SELECT ST_Within(
	ST_GeomFromText('POLYGON((1 1,2 1,2 2,1 2,1 1))'),
	ST_GeomFromText('MULTIPOINT((0 0),(10 0),(10 10),(0 10),(0 0))'));

-- [5]
-- geometria_a está completamente dentro de geometria_b? falso. A não está inteiramente dentro de B
SELECT ST_Within(
	ST_GeomFromText('MULTIPOINT((5 5),(100 100))'),
	ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'));
</pre>
<div id="attachment_786" class="wp-caption aligncenter" style="width: 144px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_within_true.png"><img class="size-full wp-image-786" title="ST_Within_True" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_within_true.png" alt="Resultado da função ST_Within(), exemplos de 1 à 3" width="134" height="52" /></a><p class="wp-caption-text">Resultado da função ST_Within(), exemplos de 1 à 3</p></div>
<div id="attachment_787" class="wp-caption aligncenter" style="width: 145px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_within_false.png"><img class="size-full wp-image-787" title="ST_Within_False" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/st_within_false.png" alt="Resultado da função ST_Within, exemplos 4 e 5" width="135" height="54" /></a><p class="wp-caption-text">Resultado da função ST_Within, exemplos 4 e 5</p></div>
<p>Por agora é só pessoal. No próximo post vou tentar explicar melhor sobre a dimensionalidade de cada tipo de geometria e os porquês estas funções se comportam desta maneira.</p>
<p>Espero que tenham gostado.</p>
<p>Abraços</p>
<p>George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-2/' rel='bookmark' title='Permanent Link: Funções PostGIS #2'>Funções PostGIS #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-1/' rel='bookmark' title='Permanent Link: Funções PostGIS #1'>Funções PostGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects-2/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects #2'>Brincando com ArcObjects #2</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/05/funcoes-postgis-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Funções PostGIS #2</title>
		<link>http://blog.geoprocessamento.net/2010/05/funcoes-postgis-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=funcoes-postgis-2</link>
		<comments>http://blog.geoprocessamento.net/2010/05/funcoes-postgis-2/#comments</comments>
		<pubDate>Wed, 12 May 2010 19:48:59 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=709</guid>
		<description><![CDATA[Boa tarde senhores e senhoras, Continuando nossa peregrinação pelas funções do PostGIS, irei começar explicar a que usamos no post anterior e não expliquei. ST_AsText() Esta função retorna o valor WKT (Well Known Text - especificação OGC) da geometria. Esta função é útil pois lhe mostra algo um pouco mais inteligível do que o WKB [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-3/' rel='bookmark' title='Permanent Link: Funções PostGIS #3'>Funções PostGIS #3</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-1/' rel='bookmark' title='Permanent Link: Funções PostGIS #1'>Funções PostGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/' rel='bookmark' title='Permanent Link: Construindo funcionalidades para o WKT Raster'>Construindo funcionalidades para o WKT Raster</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Boa tarde senhores e senhoras,</p>
<p style="text-align: justify;">Continuando nossa peregrinação pelas funções do <em>PostGIS</em>, irei começar explicar a que usamos no <em>post</em> anterior e não expliquei.</p>
<h3 style="text-align: justify;">ST_AsText()</h3>
<p style="text-align: justify;">Esta função retorna o valor <em>WKT (Well Known Text </em>- especificação <em>OGC</em>) da geometria. Esta função é útil pois lhe mostra algo um pouco mais inteligível do que o <em>WKB </em>(<em>Well Known Byte</em>).</p>
<p style="text-align: justify;">Ela tem como retorno o <em>WKT </em>sem o código SRID da geometria especificada. Se utilizada em um comando <em>SELECT</em>, ela irá realizar esta conversão em todos os objetos válidos da coluna especificada. Ela é uma função de <em>output</em>.</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_AsText(the_geom)

SELECT nm_equipamento_urbano, ST_AsText(the_geom);
</pre>
<p style="text-align: justify;">Vamos falar um pouco das funções construtoras de geometria. Por que elas são importantes? É uma maneira de se converter dados de coordenadas, em objetos geográficos, representados no banco de dados por uma <em>string</em> com o valor <em>WKB</em>. Vamos começar pela mais simples: ST_Point()</p>
<h3 style="text-align: justify;">ST_Point()</h3>
<p style="text-align: justify;">Esta é a mais simples das funções construtoras. Ela tem como entrada apenas um X e Y. Esta função esta de acordo com a norma <em>OGC</em>. Na verdade, o que ela faz é chamar a função ST_MakePoint() passando como entrada apenas os eixos X e Y.</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_Point(coordenada_x, coordenada_y);

SELECT ST_Point(-42.5,-19.2);
</pre>
<p>O resultado é retornado em <em>WKB</em>. Veja:</p>
<div id="attachment_710" class="wp-caption aligncenter" style="width: 497px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Point.png"><img class="size-full wp-image-710" title="ST_Point" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_Point.png" alt="Função ST_Point() retornando o valor em WKB" width="487" height="93" /></a><p class="wp-caption-text">Função ST_Point() retornando o valor em WKB</p></div>
<h3 style="text-align: justify;">ST_MakePoint()</h3>
<p style="text-align: justify;">A função MakePoint é mais completa que a ST_Point, pois permite a utilização de até quatro eixos de coordenadas, X, Y, Z e M. Esta função <strong>não está de acordo</strong> com a norma <em>OGC</em> mas é uma forma de se trabalhar no <em>PostGIS</em>. O problema do uso da mesma é no momento de integração com outros softwares <em>OGC compliant</em>. Fique atento!</p>
<pre name="code" class="SQL">
-- assinaturas
-- SELECT ST_MakePoint(x,y);
-- SELECT ST_MakePoint(x,y,z);
-- SELECT ST_MakePoint(x,y,z,m);

SELECT ST_MakePoint(-10,-1,300,1);
</pre>
<p>O resultado desta função também é trazido em <em>WKB</em>.</p>
<p style="text-align: center;">
<div id="attachment_711" class="wp-caption aligncenter" style="width: 519px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakePoint.png"><img class="size-full wp-image-711 " title="ST_MakePoint" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakePoint.png" alt="Função ST_MakePoint() retornando o valor em WKB" width="509" height="93" /></a><p class="wp-caption-text">Função ST_MakePoint() retornando o valor em WKB</p></div>
<p style="text-align: justify;">Existem funções deste tipo para todos os tipos de geometria. Vamos mostrar as outras:</p>
<h3 style="text-align: justify;">ST_MakeLine()</h3>
<p style="text-align: justify;">Vamos complicar um pouquinho. Da mesma maneira que podemos construir pontos, podemos construir linhas. Existem três maneiras de se utilizar esta função: uma é com o resultado agregado de uma consulta, um array de pontos, ou dois pontos. Vou mostrar as três maneiras.</p>
<pre name="code" class="SQL">-- assinatura
-- SELECT ST_MakeLine(geometry_set);
-- SELECT ST_MakeLine(ponto1,ponto2);
-- SELECT ST_MakeLine(array_pontos);

-- resultado agregado de consulta
SELECT l.setor, ST_AsText(ST_MakeLine(l.the_geom)) FROM
	(SELECT codsetor as "setor", the_geom FROM equipamento_urbano) as l GROUP BY l.setor;

-- dois pontos
SELECT ST_AsText(ST_MakeLine(ST_MakePoint(-1,-1),ST_MakePoint(-2,-2)))

-- array de pontos
SELECT ST_AsText(ST_MakeLine(ARRAY[ST_MakePoint(-10,-1),ST_MakePoint(-5,0),ST_MakePoint(-10,2),ST_MakePoint(-19,-20),ST_MakePoint(-1,0)]));

-- note que a abertura do array se faz com os colchetes!
</pre>
<p style="text-align: justify;">Vejamos os resultados, respectivamente: agregado, dois pontos e array de pontos. Uma nota: utilizei ST_AsText nas funções para facilitar a visualização do resultado. Todos os resultados podem ser facilmente testados, com exceção do agregado. Caso alguém tenha interesse, posso lhe enviar a tabela em formato .sql para conferência <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<div id="attachment_713" class="wp-caption aligncenter" style="width: 630px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakeLine_Agg.png"><img class="size-full wp-image-713" title="ST_MakeLine_Aggregate" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakeLine_Agg.png" alt="Resultado de ST_MakeLine com pontos agregados" width="620" height="176" /></a><p class="wp-caption-text">Resultado de ST_MakeLine com pontos agregados</p></div>
<div id="attachment_714" class="wp-caption aligncenter" style="width: 195px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakeLine_2p.png"><img class="size-full wp-image-714" title="ST_MakeLine_2p" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakeLine_2p.png" alt="Resultado de ST_MakeLine com dois pontos" width="185" height="93" /></a><p class="wp-caption-text">Resultado de ST_MakeLine com dois pontos</p></div>
<div id="attachment_715" class="wp-caption aligncenter" style="width: 315px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakeLine_Array.png"><img class="size-full wp-image-715" title="ST_MakeLine_Array" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakeLine_Array.png" alt="Resultado da função ST_MakeLine com um array de pontos" width="305" height="93" /></a><p class="wp-caption-text">Resultado da função ST_MakeLine com um array de pontos</p></div>
<p style="text-align: justify;">Vamos complicar mais um pouquinho?</p>
<h3 style="text-align: justify;">ST_MakePolygon()</h3>
<p style="text-align: justify;">Esta função constrói polígonos. Para um polígono ser um polígono ele deve ter uma clara distinção de seu interior com seu exterior. A única maneira de delimitarmos isto é tenho uma <em>LINESTRING</em> fechada, ou seja, o último vértico deve ser igual ao primeiro. Um polígono também pode ter <em>holes</em> ou seja, buracos. Eles também podem ser construídos aqui. Veja só:</p>
<pre name="code" class="SQL">
-- assinatura
-- SELECT ST_MakePolygon(linestring_fechada);
-- SELECT ST_MakePolygon(linestring_fechada,array_poligonos_interiores);

SELECT ST_AsText(ST_MakePolygon(
	ST_MakeLine(ARRAY[
		ST_MakePoint(0,0),
		ST_MakePoint(1,0),
		ST_MakePoint(1,1),
		ST_MakePoint(0,1),
		ST_MakePoint(0,0)])))
</pre>
<p>Veja o resultado:</p>
<div id="attachment_717" class="wp-caption aligncenter" style="width: 235px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakePolygon.png"><img class="size-full wp-image-717" title="ST_MakePolygon" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_MakePolygon.png" alt="Resultado de ST_MakePolygon" width="225" height="93" /></a><p class="wp-caption-text">Resultado de ST_MakePolygon</p></div>
<p style="text-align: justify;">Todas estas funções são extremamente úteis, permitindo o usuário à manipular as geometrias de diversas tabelas para construir objetos temporários ou <em>views</em> para visualização em softwares de SIG. Lembrem-se que você não precisa utilizar ST_MakePoint() para construir polígonos ou linhas. Você pode utilizar a agregados e resultados de consultas como parâmetros de entrada para estas funções.</p>
<h3 style="text-align: justify;">ST_GeomFromText</h3>
<p style="text-align: justify;">Esta é a rainha das funções construtoras de geometria. Com ela é possível construir qualquer geometria, desde que você tenha o <em>WKT</em> das mesmas. Mão na roda. A segunda assinatura lhe permite especificar um <em>SRID</em>.</p>
<pre name="code" class="SQL">-- assinatura
-- SELECT ST_GeomFromText('wkt');
-- SELECT ST_GeomFromText('wkt',srid);

SELECT ST_AsText(ST_GeomFromText('LINESTRING(0 0, 1 0, 2 1, 2 2, 3 1, 3 3, 0 1, 0 0)'))

SELECT ST_AsText(ST_GeomFromText('POLYGON((0 0, 1 0,1 1,0 1,0 0))'));
</pre>
<div id="attachment_718" class="wp-caption aligncenter" style="width: 290px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_GeomFromText_Line.png"><img class="size-full wp-image-718" title="ST_GeomFromText_Line" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_GeomFromText_Line.png" alt="Resultado da função ST_GeomFromText, construindo uma linha." width="280" height="93" /></a><p class="wp-caption-text">Resultado da função ST_GeomFromText, construindo uma linha.</p></div>
<div id="attachment_719" class="wp-caption aligncenter" style="width: 229px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_GeomFromText_Polygon.png"><img class="size-full wp-image-719" title="ST_GeomFromText_Polygon" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/05/ST_GeomFromText_Polygon.png" alt="Resultado da função ST_GeomFromText, construindo um polígono." width="219" height="93" /></a><p class="wp-caption-text">Resultado da função ST_GeomFromText, construindo um polígono.</p></div>
<p style="text-align: justify;">Agora vem a pergunta: porque utilizamos dois pares de parênteses quando construímos um polígono e apenas um quando construímos uma <em>linestring</em>? Lembra quando construímos um polígono, temos a opção de passar uma array de polígonos internos, os famosos <em>holes</em>? Então, o segundo <em>set </em>de parênteses corresponde à possibilidade de inserir este array de polígonos. Não se esqueça, para polígonos e geometrias multi*, dois <em>sets</em> de parênteses são necessários.</p>
<p style="text-align: justify;">Hoje vimos um pouco sobre as funções construtoras de geometrias no <em>PostGIS. </em>O que acharam?</p>
<p style="text-align: justify;">Abraços</p>
<p style="text-align: justify;">George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-3/' rel='bookmark' title='Permanent Link: Funções PostGIS #3'>Funções PostGIS #3</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/funcoes-postgis-1/' rel='bookmark' title='Permanent Link: Funções PostGIS #1'>Funções PostGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/' rel='bookmark' title='Permanent Link: Construindo funcionalidades para o WKT Raster'>Construindo funcionalidades para o WKT Raster</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/05/funcoes-postgis-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Agricultura Familiar e Geoprocessamento</title>
		<link>http://blog.geoprocessamento.net/2010/04/agricultura-familiar-e-geoprocessamento/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=agricultura-familiar-e-geoprocessamento</link>
		<comments>http://blog.geoprocessamento.net/2010/04/agricultura-familiar-e-geoprocessamento/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 21:49:57 +0000</pubDate>
		<dc:creator>Geo.NET</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[Geo Aplicado]]></category>
		<category><![CDATA[Geoprocessamento]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SIG]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=655</guid>
		<description><![CDATA[Olá Pessoal! Hoje gostaria de comentar com vocês sobre um trabalho elaborado pela também Tecnóloga em Geoprocessamento, Julie Eugênio. Há algum tempo ela preparou um projeto de gerenciamento de atividades de agricultura familiar fazendo uso de técnicas de Geoprocessamento. O objetivo principal da pesquisa dela foi o desenvolvimento de uma aplicação, com base em técnicas [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/03/monografias-geoprocessamento/' rel='bookmark' title='Permanent Link: Monografias Geoprocessamento &#8211; IFPB'>Monografias Geoprocessamento &#8211; IFPB</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias &#8211; Parte 1'>O Geoprocessamento e Suas Tecnologias &#8211; Parte 1</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal!</p>
<p>Hoje gostaria de comentar com vocês sobre um trabalho elaborado pela também Tecnóloga em Geoprocessamento, Julie Eugênio.</p>
<p>Há algum tempo ela preparou um projeto de gerenciamento de atividades de agricultura familiar fazendo uso de técnicas de Geoprocessamento.</p>
<p>O objetivo principal da pesquisa dela foi o desenvolvimento de uma aplicação, com base em técnicas de Geoprocessamento, para apoiar as atividades de um projeto voltado à agricultura familiar sustentável denominado “Cinturão Verde”, inserido no programa de microcrédito “Empreender-JP”, no município de João Pessoa, capital do Estado da Paraíba.</p>
<p>O mapa abaixo mostra a localização da área de estudo.</p>
<p style="text-align: center"><a href="../"><img class="aligncenter" src="../wp-content/uploads/2010/04/JP1.png" alt="" width="509" height="335" /></a></p>
<p style="text-align: left">Durante a construção da aplicação SIG integrada a um Banco de Dados Geográficos deu-se ênfase ao uso de tecnologias livres, com destaque para o <em><strong>Quantum Gis</strong></em> (QGis) e <em><strong>PostgreSQL/PostGis</strong></em>.</p>
<p style="text-align: left">Na parte escrita do trabalho desenvolvido foi detalhada toda a metodologia empregada. A qual está resumida na figura abaixo.</p>
<p style="text-align: left"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/04/metodologiaj.png"><img class="aligncenter size-full wp-image-661" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/04/metodologiaj.png" alt="" width="376" height="386" /></a>O trabalho foi extremamente elogiado pelos responsáveis técnicos da prefeitura de João Pessoa. Você pode fazer o <em>download </em>do trabalho completo a partir do link abaixo, que traz o tema da monografia escrita com base nesse projeto.</p>
<p style="text-align: center"><a href="http://www.geoprocessamento.cefetpb.edu.br/monografias/Julie_Eugenio.pdf" target="_blank"><strong>Gerenciamento  de Atividades de Agricultura Familiar Sustentável com Base em Técnicas  de Geoprocessamento, no Município de João Pessoa - PB</strong></a></p>
<p>Espero que tirem proveito de mais essa demonstração da potencialidade do uso de tecnologias livres para Geoprocessamento.</p>
<p>Abraços.</p>
<p>--</p>
<p>Anderson Medeiros</p>
<p>Tecnólogo em Geoprocessamento</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/03/monografias-geoprocessamento/' rel='bookmark' title='Permanent Link: Monografias Geoprocessamento &#8211; IFPB'>Monografias Geoprocessamento &#8211; IFPB</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias &#8211; Parte 1'>O Geoprocessamento e Suas Tecnologias &#8211; Parte 1</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/04/agricultura-familiar-e-geoprocessamento/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Padrões Open Geospatial Consortium – Parte 2</title>
		<link>http://blog.geoprocessamento.net/2010/04/ogc-parte2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ogc-parte2</link>
		<comments>http://blog.geoprocessamento.net/2010/04/ogc-parte2/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 08:16:18 +0000</pubDate>
		<dc:creator>Geo.NET</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[Conceitos]]></category>
		<category><![CDATA[Geoprocessamento]]></category>
		<category><![CDATA[OGC]]></category>
		<category><![CDATA[SIG]]></category>
		<category><![CDATA[WebMapping]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=630</guid>
		<description><![CDATA[Hoje vamos dar sequência à postagem sobre padrões da OGC. Na primeira postagem dessa série vimos o que é o OGC e alguns comentários sobre as especificações WMS, WFS e WCS. Agora vamos tecer algumas considerações sobre os padrões GML, KML e SLD. Geographic Markup Language (GML) O objetivo da GML é oferecer um conjunto [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/03/ogc-parte1/' rel='bookmark' title='Permanent Link: Padrões Open Geospatial Consortium &#8211; Parte 1'>Padrões Open Geospatial Consortium &#8211; Parte 1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/metadata-3/' rel='bookmark' title='Permanent Link: Metadata #3'>Metadata #3</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.geoprocessamento.net/"><img class="aligncenter size-full wp-image-631" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/04/ogc-21.jpg" alt="" width="496" height="365" /></a>Hoje vamos dar sequência à postagem sobre padrões da <strong>OGC</strong>. Na <a href="http://blog.geoprocessamento.net/2010/03/ogc-parte1/" target="_blank"><strong>primeira postagem dessa série</strong></a> vimos o que é o OGC e alguns comentários sobre as especificações <strong>WMS</strong>, <strong>WFS</strong> e <strong>WCS</strong>.</p>
<p>Agora vamos tecer algumas considerações sobre os padrões <strong>GML</strong>, <strong>KML</strong> e <strong>SLD</strong>.</p>
<h3><em>Geographic Markup Language</em><em><strong> </strong></em><strong>(GML)</strong><em><strong><br />
</strong></em></h3>
<p>O objetivo da <strong>GML</strong> é oferecer um conjunto de regras com as quais um usuário pode definir sua própria linguagem para descrever seus dados, assim utilização do padrão GML permite a interoperabilidade entre dados geográficos.  Definindo como será o armazenamento e transporte de informações geográficas, incluindo propriedades espaciais e não espaciais das entidades geográficas.</p>
<p>O GML é usado também em serviços<strong> WFS</strong> para trocar feições entre clientes e servidores, servindo, portanto como suporte ao serviço WFS.</p>
<h3><em>Keyhole Markup Language</em><em><strong> </strong></em><strong>(KML)</strong></h3>
<p>A linguagem <strong>XML</strong> (<em>eXtensible Markup Language</em>), como o próprio nome já diz, pode ser extendida  ou ampliada. O próprio padrão  <strong>KML </strong>da OGC é uma extensão de um XML utilizado pelo Google para tornar possível a visualização de dados geográficos nos seus famosos programas:<strong> <em>Google Earth</em></strong> e <em><strong>Google Maps</strong></em>.</p>
<p>A estrutura do KML é baseado em <em>tags</em> como ocorre com arquivos HTML e XML comuns. Estas <em>tags </em>do KML tem os nomes e atributos usados para objetivos de exibição específicas. Em termos simples, notamos que o <em>Google Earth</em> e e o <em>Google Maps</em> funcionam pra os arquivos KML como como navegadores.</p>
<p>O KML depende de outros padrões para gerar a visualização de dados geográficos, pois na sintaxe do KML proveniente de um serviço de internet existe uma requisição WMS.</p>
<p>Hoje, o OGC e o <em>Google</em> trabalham em conjunto para aprimorar a implementação do KML, além de manter a comunidade informada das atualizações e avanços em seu projeto.</p>
<h3><em>Styled Layer Descriptor</em><em><strong> </strong></em><strong>(SLD)</strong></h3>
<p>A especificação <strong>SLD</strong> se refere à um arquivo XML que representa graficamente entidades geográficas (textos, pontos, objetos lineares ou polígonos.). Na linguagem SLD podem ser definidas regras que agrupam objetos em diferentes categorias e definindo para cada grupo um estilo diferente, por exemplo a simbologia de um <strong>WMS </strong>(estabelecer cores e rótulos) a partir de regras a serem definidas.</p>
<p>Programas de SIG, como o <strong><em>Udig</em></strong>, geram arquivos SLD de forma automática. Para executar este processo, basta adicionar uma camada WFS à uma visualização do <em>Udig,</em> fazer uma requisição ao servidor através de uma URL adequada e depois criar temas e rótulos de acordo com as necessidades da aplicação.</p>
<p>Enfim, esta foi uma breve consideração sobre alguns dos principais padrões da OGC (WMS, WFS, WCS, GML, KML e SLD). Espero que tenham gostado. Qualquer dúvida, entre em contato deixando um comentário.</p>
<p>Um Abraço e até a próxima postagem</p>
<p>--</p>
<p>Anderson Medeiros</p>
<p>Tecnólogo em Geoprocessamento</p>
<p>Consultor em Geotecnologias Livres</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/03/ogc-parte1/' rel='bookmark' title='Permanent Link: Padrões Open Geospatial Consortium &#8211; Parte 1'>Padrões Open Geospatial Consortium &#8211; Parte 1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/metadata-3/' rel='bookmark' title='Permanent Link: Metadata #3'>Metadata #3</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/04/ogc-parte2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Criação de Templates para PostGIS</title>
		<link>http://blog.geoprocessamento.net/2010/04/template_postgis/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=template_postgis</link>
		<comments>http://blog.geoprocessamento.net/2010/04/template_postgis/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 03:57:54 +0000</pubDate>
		<dc:creator>Vicente Martins</dc:creator>
				<category><![CDATA[Vicente Martins]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=611</guid>
		<description><![CDATA[Olá a todos, muito bom está por aqui novamente. Hoje vou falar para vocês de um assunto que na minha graduação o Prof. Marcello Benigno[1] sempre "enchia o saco" repetindo e repetindo e repetindo... a criação de templates para o banco de dados (no nosso caso, PostgreSQL[2]). Templates nada mais são que modelos pré-definidos de [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/' rel='bookmark' title='Permanent Link: PostGIS WKT Raster'>PostGIS WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/' rel='bookmark' title='Permanent Link: Construindo funcionalidades para o WKT Raster'>Construindo funcionalidades para o WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/03/meettheshp2pgsql/' rel='bookmark' title='Permanent Link: shp2pgsql: Você conhece esta fantástica ferramenta?'>shp2pgsql: Você conhece esta fantástica ferramenta?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Olá a todos, muito bom está por aqui novamente.</p>
<p style="text-align: justify">Hoje vou falar para vocês de um assunto que na minha graduação o Prof. Marcello Benigno[1] sempre "enchia o saco" repetindo e repetindo e repetindo... a criação de <em>templates</em> para o banco de dados (no nosso caso, PostgreSQL[2]). <em>Templates</em> nada mais são que modelos pré-definidos de banco de dados, que aumentam a produtividade na criação de novos bancos. Neles nós colocamos características comuns aos bancos de dados que serão criados e só associamos os novos bancos a eles.</p>
<p style="text-align: justify">Como exemplo, hoje a tarde precisei recriar um<strong> <em>template_postgis</em></strong> para que pudesse sincronizar uma aplicação <em>geodjango</em> a ele (A aplicação poderá ser vista em breve na edição número 1 da revista Geo.NET), então fiz da seguinte forma:</p>
<p style="text-align: justify">Como <em>root</em> chamei o postgres:</p>
<pre style="text-align: justify"># su postgres</pre>
<p style="text-align: justify">Após entrar no <em>root</em> postgres, mandei criar um novo banco de dados chamado <em>template_postgis</em>:</p>
<pre style="text-align: justify">$ createdb -U postgres template_postgis</pre>
<p style="text-align: justify">A opção "-U" do comando createdb se refere ao usuário que será dono do banco, ou do <em>template</em>, como é nosso caso (Para maiores informações sobre outras opções do comando createdb digite $ man createdb). Para esta versão, o <em>root</em> postgres é por <em>default</em> o dono das tabelas, bancos e <em>templates</em> criados, por tanto, não faz necessário informá-lo como usuário.</p>
<p style="text-align: justify">Para que seja possível rodar as funções da extensão espacial postgis, é necessário a criação da linguagem procedural plpgsql. Por meio desta, é possível rodar as funções contidas nos arquivos lwpostgis.sql e ref_spatial_sys.sql, arquivos estes que contem funções que resolvem referência espacial, tipos de geometrias, sistemas de coordenadas e etc. Para criar a linguagem, basta usar o comando:</p>
<pre style="text-align: justify">$ createlang -d template_postgis -U postgres plpgsql</pre>
<p style="text-align: justify">A opção "-d" informa para qual banco de dados, ou template será criada a nova linguagem procedural (Para maiores informações, consulte $ man createlang).</p>
<p style="text-align: justify">Depois de ter criado a linguagem, basta importar os arquivos lwpostgis.sql, lwpostgis_upgrade.sql e spatial_ref_sys.sql. Para isso usaremos o terminal interativo do pgsql através do comando:</p>
<pre style="text-align: justify">$ psql -d template_postgis -f lwpostgis.sql</pre>
<pre style="text-align: justify">$ psql -d template_postgis -f lwpostgis_upgrde.sql</pre>
<pre style="text-align: justify">$ psql -d template_postgis -f spatial_ref_sys.sql</pre>
<p style="text-align: justify">Neste ponto é importante tomar nota de que, se o usuário não estiver no <em>path</em> onde estão os arquivos acima, lhe será retornado um erro. Para evitar tal erro, consulte a documentação para a sua distribuição.</p>
<p style="text-align: justify">Para confirmar se tudo correu bem, entre no <em>template</em> e faça uma consulta às tabelas da seguinte forma:</p>
<pre style="text-align: justify">$ psql -d template_postgis</pre>
<pre style="text-align: justify">template_postgis=# \dt
Lista de relações
Esquema |       Nome       |  Tipo  |   Dono
---------+------------------+--------+----------
public  | geometry_columns | tabela | postgres
public  | spatial_ref_sys  | tabela | postgres
(2 registros)</pre>
<p style="text-align: justify">Observe que dentro do <em>template_postgis</em> foram criadas as tabelas espaciais, e que por <em>default</em> o dono das mesmas é o root postgres. Agora ficou simples, pois sempre que for preciso criar um db com extensão espacial, basta rodar o comando:</p>
<pre style="text-align: justify">$ psql -T template_postgis &lt;nome_novo_db&gt;</pre>
<p style="text-align: justify">Este novo db será criado, e dentro dele já estarão inseridas as tabelas espaciais.</p>
<p style="text-align: justify">Fácil não é? <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify">Abraço a todos.</p>
<p style="text-align: justify">Referencias:</p>
<p style="text-align: justify">[1] <a href="http://profmarcello.blogspot.com">Prof. Marcello</a></p>
<p style="text-align: justify">[2] <a href="http://postgres.org">PostgreSQL</a></p>
<p style="text-align: justify">
<p style="text-align: justify">Vicente Martins.</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/' rel='bookmark' title='Permanent Link: PostGIS WKT Raster'>PostGIS WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/08/construindo-funcionalidades-para-o-wkt-raster/' rel='bookmark' title='Permanent Link: Construindo funcionalidades para o WKT Raster'>Construindo funcionalidades para o WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/03/meettheshp2pgsql/' rel='bookmark' title='Permanent Link: shp2pgsql: Você conhece esta fantástica ferramenta?'>shp2pgsql: Você conhece esta fantástica ferramenta?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/04/template_postgis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Padrões Open Geospatial Consortium &#8211; Parte 1</title>
		<link>http://blog.geoprocessamento.net/2010/03/ogc-parte1/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ogc-parte1</link>
		<comments>http://blog.geoprocessamento.net/2010/03/ogc-parte1/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 13:18:19 +0000</pubDate>
		<dc:creator>Geo.NET</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Banco de Dados]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[Conceitos]]></category>
		<category><![CDATA[Geoprocessamento]]></category>
		<category><![CDATA[OGC]]></category>
		<category><![CDATA[SIG]]></category>
		<category><![CDATA[WebMapping]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=523</guid>
		<description><![CDATA[Olá Pessoal! Hoje vou abordar um tema de extremo interesse para quem trabalha com Geotecnologias, livres ou não: Os padrões do Open Geospatial Consortium (OGC). Nesta primeira parte da série vamos entender o que é o OGC e os padrões WMS, WFS e WCS. O Open Geospatial Consortium (OGC) Desde seus primórdios em 1994 a [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/04/ogc-parte2/' rel='bookmark' title='Permanent Link: Padrões Open Geospatial Consortium – Parte 2'>Padrões Open Geospatial Consortium – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/03/monografias-geoprocessamento/' rel='bookmark' title='Permanent Link: Monografias Geoprocessamento &#8211; IFPB'>Monografias Geoprocessamento &#8211; IFPB</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><a href="http://blog.geoprocessamento.net"><img class="aligncenter size-full wp-image-536" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/03/ogc1.jpg" alt="" width="510" height="388" /></a></p>
<p>Olá Pessoal!</p>
<p>Hoje vou abordar um tema de extremo interesse para quem trabalha com Geotecnologias, livres ou não: Os padrões do<em> <strong>Open Geospatial Consortium</strong></em> (<strong>OGC</strong>). Nesta primeira parte da série vamos entender o que é o OGC e os padrões <strong>WMS</strong>, <strong>WFS</strong> e <strong>WCS</strong>.</p>
<h3>O <em><strong>Open Geospatial Consortium </strong></em><strong>(OGC)</strong><em><strong><br />
</strong></em></h3>
<p>Desde seus primórdios em 1994 a instituição, que se chamava <strong><em>OpenGis  Consortium</em></strong>, tem o com o objetivo de criar especificações de  interfaces e padrões de intercâmbio de dados geoespaciais.</p>
<p>O <strong>OGC</strong> é hoje uma entidade internacional com mais de 350 companhias, agências governamentais e universidades, que tem o intuito de <strong>promover o desenvolvimento de tecnologias</strong> que facilitem a <strong>interoperabilidade </strong>entre diferentes sistemas que trabalhem com informação e  localização espacial.</p>
<p>Asim, o OGC define especificações, ou padrões (como o WMS, WFS, WCS, etc) aos quais produtos e serviços precisam se adequar para que a interação entre diversas fontes de dados e informações espaciais seja facilitada, independente de fatores como a plataforma utilizada. A partir de agora vamos começar a compreender três das especificações do OGC.</p>
<h3><em>Web Map Service</em> (WMS)</h3>
<p>O padrão <strong>WMS</strong> define um serviço para a produção de mapas que serão apenas uma representação visual dos dados espaciais e não os dados em si. Estas representações serão geradas no formato de imagem, como JPEG, PNG e GIF ou em formato vetorial, como o<em> Scalable Vector Graphics</em> (SVG).</p>
<p>Este padrão especifica como o cliente deve requisitar as informações para o servidor e como este deve responder ao cliente. As operações WMS podem ser realizadas a partir de um navegador comum que fará a submissão das requisições sob a forma de uma URL.</p>
<p>É importante destacarmos que o conteúdo da URL dependerá da operação solicitada. Em outras palavras, através da URL, indica-se qual a informação que deve ser exibida (região geográfica e dado de interesse), bem como o sistema de referência espacial, além das características da imagem de saída (altura e largura).</p>
<h3><em>Web Feature Service</em> (WFS) e<em> Web Coverage Service</em> (WCS)</h3>
<p>A especificação de serviço <strong>WFS</strong> define um serviço para que clientes possam recuperar feições especiais em formato <strong>GML</strong> (você terá mais detalhes sobre GML na segunda parte desta série sobre o OGC).  O WFS pode ser implementado pelo servidor em duas versões:</p>
<ul>
<li><strong>Básica</strong> - Neste caso, basicamente funções de <strong>consulta</strong> ficam disponíveis, ou</li>
</ul>
<ul>
<li><strong>Transacional</strong> - Implementa o serviço completo, incluindo operações de <strong>inserção</strong>, <strong>deleção</strong>, <strong>edição</strong> e, claro,<strong> consulta</strong> à objetos espaciais.</li>
</ul>
<p>Assim, podemos afirmar que o WFS apresenta maior interatividade que o WMS, pois este primeiro possibilita não apenas a visualização das feições geográficas, mas também sua manipulação.</p>
<p>Já<em> </em>o padrão <strong>WCS</strong> define o acesso aos dados que representam fenômenos com variação contínua no espaço. Este serviço é especificado para<br />
tratamento de dados modelados como geocampos.</p>
<h3>Breves Comparações entre WMS, WFS e WCS</h3>
<p>Uma diferença marcante entre o WMS e o WCS é que este último retorna ao usuário dados sobre a semântica original dos fenômenos representados, ao invés de imagens. Em outras palavras, o WCS fornece os dados disponíveis de imagens, juntamente com detalhes descritivos sobre as mesmas, como a grade.</p>
<p>Já em uma comparação entre o WFS e o WCS notamos que o primeiro retorna os chamados geo-objetos, já no caso do WCS retorna geocampos, conforme mencionado anteriormente.</p>
<p>Assim, chegamos a conclusão de que o serviço WCS pode ser utilizada para enquadrar aplicações do <strong>Sensoriamento Remoto</strong> (pois em geral o SR está relacionado com geocampos) no contexto da interoperabilidade.</p>
<h3>Conclusão e o que vem por ai</h3>
<p>Dessa nossa breve análise sobre estes três dos diversos padrões do OGC podemos notar que cada um terá sua aplicabilidade, sendo interpretado e explorado de maneira diferente dependendo dos objetivos de seu projeto.</p>
<p>Programas como o<strong> <em>gvSIG</em></strong> e o <em><strong>Udig</strong></em> permitem interações com <em>webservices</em> que sigam as especificações <strong>WMS</strong>, <strong>WFS</strong> e <strong>WCS</strong>.</p>
<p>Na segunda parte desse <em>post </em>veremos mais sobre as padrões da OGC, com ênfase nas especificações <strong>GML</strong>, <strong>SLD</strong> e <strong>KML</strong>.</p>
<p>Fiquem na expectativa...</p>
<p>--</p>
<p>Anderson Maciel Lima de Medeiros</p>
<p>Tecnólogo em Geoprocessamento</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/04/ogc-parte2/' rel='bookmark' title='Permanent Link: Padrões Open Geospatial Consortium – Parte 2'>Padrões Open Geospatial Consortium – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/03/monografias-geoprocessamento/' rel='bookmark' title='Permanent Link: Monografias Geoprocessamento &#8211; IFPB'>Monografias Geoprocessamento &#8211; IFPB</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/03/ogc-parte1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>shp2pgsql: Você conhece esta fantástica ferramenta?</title>
		<link>http://blog.geoprocessamento.net/2010/03/meettheshp2pgsql/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=meettheshp2pgsql</link>
		<comments>http://blog.geoprocessamento.net/2010/03/meettheshp2pgsql/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 04:25:00 +0000</pubDate>
		<dc:creator>Vicente Martins</dc:creator>
				<category><![CDATA[Vicente Martins]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[PostGIS]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=469</guid>
		<description><![CDATA[Olá pessoal, boa noite. É tempo de retomar a implementação de antigos projetos no trabalho (isso soa estranho né?), para poder mostrar que existem ferramentas livres, super-poderosas e que trazem respostas a várias perguntas de "onde" estão os problemas. Neste trabalho que estou reiniciando na Companhia, estamos implementando um DB (Data Base) que guardará um [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/' rel='bookmark' title='Permanent Link: PostGIS WKT Raster'>PostGIS WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/04/agricultura-familiar-e-geoprocessamento/' rel='bookmark' title='Permanent Link: Agricultura Familiar e Geoprocessamento'>Agricultura Familiar e Geoprocessamento</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Olá pessoal, boa noite.</p>
<p style="text-align: justify;">É tempo de retomar a implementação de antigos projetos no trabalho (isso soa estranho né?), para poder mostrar que existem ferramentas livres, super-poderosas e que trazem respostas a várias perguntas de "onde" estão os problemas.</p>
<p style="text-align: justify;">Neste trabalho que estou reiniciando na Companhia, estamos implementando um DB (<em>Data Base</em>) que guardará um monte de informações que estavam soltas nas mãos de todos os seus "donos".</p>
<p style="text-align: justify;">Com estas informações, será possível fazer várias análises, inclusive espaciais, e diponibilizá-las em um ambiente interno [intranet] a partir de uma aplicação <em>WebGIS</em>, o que facilitará o acesso a informação de interesse comum, bem como facilitará o planejamento das decisões a serem tomadas. É sim um projeto extravagante, uma vez que um "novato" vai mexer com o lugar e "poder" de muita gente lá dentro, mas em contra-partida, tenho certeza que isso trará melhorias para a Companhia, o que é na verdade o objetivo do mesmo.</p>
<p style="text-align: justify;">Para vocês hoje, trago uma ferramenta que a muito tempo não utilizava, mas que é extremamente importante quando falamos de PostGIS: shp2pgsql. O Anderson a um tempo atrás disponibilizou um mini-tutorial no ClickGeo[1], que inclusive serviu de fonte de pesquisa para mim, e que recomendo para quem quer utilizar shp2pgsql. Algumas outras pesquisas na documentação oficial da extensão[2], mais algumas conversas com o próprio Anderson e outros amigos da área, me vi "obrigado" a compartilhar mais um pouco de conhecimento.</p>
<p style="text-align: justify;">A shp2pgsql, como o prórpio nome sugere, é um aplicativo que transforma arquivos <em>shapefile</em> da ESRI em <em>sql</em>, em que os antigos dados em formato <em>shapefile</em> são inseridos dentro das tabelas de um <em>Data Base </em>em PostgeSQL/PostGIS da maneira correta.</p>
<p style="text-align: justify;">Para tanto, é necessário conhecer alguns parametros que precisamos informar ao aplicativo. De maneira geral, a utilização do shp2pgsql se dá da seguinte forma:</p>
<p><code># shp2pgsql /path/do/shape/dado.shp nome_tabela &gt; nome_arquivo.sql<br />
# psql -d nome_DB -f nome_arquivo.sql</code></p>
<p>Convenções:</p>
<ul>
<li>"#" você precisa estar logado como super-usuário para utilizar esta ferramenta;</li>
<li>"/path/do/shape/dado.shp" é o caminho onde está guardado o dado em <em>shapefile</em>;</li>
<li> "psql -d" define o <em>Data Base</em> utilizado;</li>
<li> "psql - f" executa o arquivo .sql indicado. Talvez seja necessário informar o caminho total do arquivo ".sql", caso não se esteja dentro do <em>path</em> indicado.</li>
</ul>
<p>Porém, é possível informar alguns parametros para o aplicativo shp2pgsql que facilita a inserção dos dados desejados. Dentre os principais (ao menos para mim, foram os mais utilizados) cito:</p>
<p>-s: Este parametro define o SRID (<em>Spatial Reference System Identifier</em>)que será utilizado.</p>
<p><code># shp2pgsql -s &lt;SRID&gt; dado.shp nome_tabela &gt; nome_arquivo.sql</code></p>
<p>-W: Este parametro informa a codificação em que está o seu <em>Data Base</em>, inserindo os dados na mesma codificação.</p>
<p><code># shp2pgsql -s &lt;SRID&gt; -W &lt;encoding&gt; dado.shp nome_tabela &gt; nome_arquivo.sql</code></p>
<p>Bem, fora estes, o carregador de dados shp2pgsql traz outros parametros de inserção de dados que vale a pena ser consultado. De qualquer forma, é interessante consultar a documentação.</p>
<p>Vou ficando por aqui.</p>
<p>Abraço a todos.</p>
<p>Vicente Martins.</p>
<p>Referências:</p>
<p>[1]<a href="http://www.clickgeo.com.br/ImportarSHPparaPostGis.pdf"> ClickGeo - Importando Arquivos <em>Shapefile</em> para PostGIS 8.1 via <em>prompt</em> do DOS</a></p>
<p>[2] <a href="http://www.geoprocessamento.net/downloads/visit.php?cid=13&amp;lid=17">Documentação PostGIS</a></p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/01/geo-e-suas-tecnologias2/' rel='bookmark' title='Permanent Link: O Geoprocessamento e Suas Tecnologias – Parte 2'>O Geoprocessamento e Suas Tecnologias – Parte 2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/07/postgis-wkt-raster/' rel='bookmark' title='Permanent Link: PostGIS WKT Raster'>PostGIS WKT Raster</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/04/agricultura-familiar-e-geoprocessamento/' rel='bookmark' title='Permanent Link: Agricultura Familiar e Geoprocessamento'>Agricultura Familiar e Geoprocessamento</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/03/meettheshp2pgsql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
