<?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; dev</title>
	<atom:link href="http://blog.geoprocessamento.net/tag/dev/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>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[


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>GeoInfo 2010</title>
		<link>http://blog.geoprocessamento.net/2010/07/geoinfo-2010/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=geoinfo-2010</link>
		<comments>http://blog.geoprocessamento.net/2010/07/geoinfo-2010/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 02:34:56 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[GeoInfo2010]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=920</guid>
		<description><![CDATA[Recebi recentemente uma email falando sobre o GeoInfo 2010 - o simpósio brasileiro de GeoInformática. O GeoInfo é um congresso voltado para desenvolvimento e soluções em geotecnologias, abrangendo diversas áreas. Este ano será realizado em Campos do Jordão, entre 28 de novembro à 01 de dezembro. Me parece que é um congresso que vale a [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Recebi recentemente uma email falando sobre o GeoInfo 2010 -<a title="GeoInfo2010" href="http://www.geoinfo.info/portuguese/geoinfo2010/index.php" target="_blank"> o simpósio brasileiro de GeoInformática</a>.</p>
<p>O GeoInfo é um congresso voltado para desenvolvimento e soluções em geotecnologias, abrangendo diversas áreas. Este ano será realizado em Campos do Jordão, entre 28 de novembro à 01 de dezembro.</p>
<p>Me parece que é um congresso que vale a pena comparecer e publicar. As áreas para publicação são as seguintes:</p>
<p>- Bancos de dados espaciais e  espaço-temporais; - Modelagem de dados espaciais e espaço-temporais;<br />
- Mineração de dados espaciais e espaço-temporais;<br />
- Data warehouses espacias e espaço-temporais;<br />
- Múltiplas representações em bancos de dados espaciais;<br />
- Análise de dados sobre objetos móveis;  					- Métodos de acesso espaciais, espaço-temporais e  multidimensionais;<br />
- Processamento e otimização de consultas espaciais;<br />
- Estruturas de dados espaciais;<br />
- Geometria computacional aplicada;<br />
- Visualização de dados espaciais;<br />
- Ontologias para dados espaciais;<br />
- Interoperabilidade e padrões para SIG;<br />
- Metadados espaciais;<br />
- Propagação de erros e controle de qualidade;<br />
- Geoestatística;<br />
- Análise espacial e estatística espacial;<br />
- Modelagem dinâmica e aplicações em SIG de autômatas celulares;<br />
- Sistemas espaciais de apoio à decisão;<br />
- Bibliotecas digitais para SIG;<br />
- Projeto e implementação de SIG;<br />
- Novas aplicações de tecnologia de geoprocessamento;<br />
- Fusão de dados;<br />
- Mapeamento e sensoriamento remoto;<br />
- Integração sensoriamento remoto e SIG;<br />
- Recuperação de imagens baseada em conteúdo;<br />
- Cartografia digital;<br />
- Interfaces web para SIG;<br />
- Realidade virtual e SIG 3D; - Serviços de informação geográfica móveis e distribuídos.<br />
Bastante coisa não? Com certeza conseguiremos encaixar um projeto em algum dos temas.</p>
<p>Confiram o site. É uma boa oportunidade para conhecer mais o pessoal da área, conhecer Campos do Jordão e publicar um artigo!</p>
<p>Fica a dica.</p>
<p>Abraços</p>
<p>George</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/07/geoinfo-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brincando com ArcObjects #2</title>
		<link>http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=brincando-com-arcobjects-2</link>
		<comments>http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects-2/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 21:52:35 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[ArcObjects]]></category>
		<category><![CDATA[dev]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=870</guid>
		<description><![CDATA[No último post sobre ArcObjects, falamos como construir pontos de uma maneira simples. Hoje vamos brincar com alguns polígonos e polilinhas. Qual é a diferença? Bem, como explicado anteriormente, um polígono é uma coleção de anéis (rings), formados por pontos ou por segmentos. As polilinhas funcionam quase da mesma maneira, só que ao invés de [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects'>Brincando com ArcObjects</a></li>
<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/01/arcobjects1/' rel='bookmark' title='Permanent Link: ArcObjects #1 &#8211; introdução'>ArcObjects #1 &#8211; introdução</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No último post sobre <em>ArcObjects</em>, falamos como construir pontos de uma maneira simples. Hoje vamos brincar com alguns polígonos e polilinhas. Qual é a diferença? Bem, como explicado anteriormente, um polígono é uma coleção de anéis (<em>rings</em>), formados por pontos ou por segmentos. As polilinhas funcionam quase da mesma maneira, só que ao invés de anéis, as polilinhas são formadas por uma coleção de caminhos (<em>paths</em>).</p>
<p style="text-align: justify;">Não podemos criar estas geometrias de alto nível, sem criar antes as geometrias de baixo nível que as compõe. É a maneira na qual o ArcGIS trabalha, e é a mais sã, do ponto de vista de desenvolvimento.</p>
<p style="text-align: justify;">Primeiro vamos construir um polígono. Podemos construir os anéis separadamente, de pontos ou de segmentos e logo depois, adicionar à uma coleção de geometrias, na qual o próprio <em>ArcGIS</em> irá entender como um polígono.</p>
<pre name="code" class="c#">
public static IPolygon ConstruirPolígono()
    {
        object _missing = Type.Missing;

        IGeometryCollection poligonoFinal = new PolygonClass();

        // vamos criar primeiro nosso anel exterior
        // perceba com estamos utilizando uma interface IPointCollection

        IPointCollection anelExterior = new RingClass();

        // lembram da função BuildPoint do post anterior?

        anelExterior.AddPoint(BuildPoint(0,0,0),ref _missing, ref _missing);
        anelExterior.AddPoint(BuildPoint(0,1,0),ref _missing, ref _missing);
        anelExterior.AddPoint(BuildPoint(1,1,0),ref _missing, ref _missing);
        anelExterior.AddPoint(BuildPoint(1,0,0),ref _missing, ref _missing);

        // o último ponto deve ser sempre igual ao primeiro - somente assim
        // o polígono está fechado
        // podemos utilizar também uma outra técnica para usar o primeiro ponto
        // sem duplicar o ponto inicial - muito útil se você não sabe de antemão qual é o primeiro ponto.
        // anelExterior.AddPoint(anelExterior.get_Point(0),ref _missing, ref _missing);

        anelExterior.AddPoint(BuildPoint(0,0,0));

        poligono.AddGeometry(anelExterior as IGeometry, ref _missing, ref _missing);

        // definir a referência espacial - sem a referência espacial o ArcGis não realiza operações espaciais direitinho!

        return poligono as IPolygon;
}
</pre>
<div id="attachment_871" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/poligono_simples.png"><img class="size-full wp-image-871" title="BrincandoArcObjects_Figura01" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/poligono_simples.png" alt="Polígono construído com o código anterior" width="300" height="300" /></a><p class="wp-caption-text">Polígono construído com o código anterior</p></div><br />
Este é um código simples para a criação de um polígono igualmente simples. Vamos aumentar um pouco a dificuldade inserindo outros anéis.</p>
<pre name="code" class="c#">
public static IPolygon ConstruirPolígono()
    {
        object _missing = Type.Missing;

        IGeometryCollection poligonoFinal = new PolygonClass();

        // vamos criar primeiro nosso anel exterior
        // perceba com estamos utilizando uma interface IPointCollection

        IPointCollection anelExterior = new RingClass();

        // lembram da função BuildPoint do post anterior?

        anelExterior.AddPoint(BuildPoint(0,0,0),ref _missing, ref _missing);
        anelExterior.AddPoint(BuildPoint(0,10,0),ref _missing, ref _missing);
        anelExterior.AddPoint(BuildPoint(10,10,0),ref _missing, ref _missing);
        anelExterior.AddPoint(BuildPoint(10,0,0),ref _missing, ref _missing);

        // o último ponto deve ser sempre igual ao primeiro - somente assim
        // o polígono está fechado
        // podemos utilizar também uma outra técnica para usar o primeiro ponto
        // sem duplicar o ponto inicial - muito útil se você não sabe de antemão qual é o primeiro ponto.
        anelExterior.AddPoint(anelExterior.get_Point(0),ref _missing, ref _missing);

        IPointCollection anelInterior = new RingClass();
        anelInterior.AddPoint(BuildPoint(1,1,0), ref _missing, ref _missing);
        anelInterior.AddPoint(BuildPoint(1,2,0), ref _missing, ref _missing);
        anelInterior.AddPoint(BuildPoint(2,2,0), ref _missing, ref _missing);
        anelInterior.AddPoint(BuildPoint(2,1,0), ref _missing, ref _missing);
        anelInterior.AddPoint(anelInterior.get_Point(0),ref _missing, ref _missing);

        // nao é permitido sobrepor anéis, à menos que eles tenham orientações contrárias
        // nosso anel exterior tem orientação horária - todos os anéis exteriores devem ter orientação horária!
        // anéis interiores, que descrevem buracos em nossos polígonos devem ter orientação anti-horária!
        ICurve curva = anelInterior as ICurve;
        curva.ReverseOrientation();

        poligono.AddGeometry(anelExterior as IGeometry, ref _missing, ref _missing);
        poligono.AddGeometry(anelInterior as IGeometry, ref _missing, ref _missing);

        // definir a referência espacial - sem a referência espacial o ArcGis não realiza operações espaciais direitinho!

        return poligono as IPolygon;
}
</pre>
<p><div id="attachment_872" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/poligono_simples2.png"><img class="size-full wp-image-872" title="BrincandoArcObjects2_Figura02" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/poligono_simples2.png" alt="Polígono simples criado pelo código acima" width="300" height="300" /></a><p class="wp-caption-text">Polígono simples criado pelo código acima (fora de escala)</p></div>
<p style="text-align: justify;">Bem, é fácil trabalhar com geometrias da <em>ESRI</em>. Claro, quanto mais complexa a geometria, mais complexo deverá ser o código para cuidar da mesma. Mas não é nenhum bixo de 7 cabeças. Um outro detalhe interessante é que revertemos a orientação da geometria interna usando uma outra interface, e adicionamos nosso anel original. Por que funciona? A biblioteca <em>ArcObjects</em> fica responsável por notificar a geometria original de que certa operação ocorreu e a realiza de acordo.</p>
<p style="text-align: justify;">Em geral, os passos para se trabalhar com geometrias complexas é construir anéis ou segmentos, criados através da interface IPointCollection, pois assim podemos ir adicionando os pontos que temos interesse e depois ajeitar a orientação de cada anel para nos dar o resultado desejado.</p>
<p style="text-align: justify;">Certo, mas e um polígono que contenha curvas? O formato <em>shapefile</em> não suporta(va) o desenho delas e estão disponíveis à partir dos <em>geodatabases</em> (as curvas são convertidas em diversos segmentos, aproximando o resultado. Mas podemos criar um polígon com curvas via código? Sim, claro! O segredo, neste caso, é separar cada segmento em um anel, mesmo que ele, no final, seja parte de uma coisa só.</p>
<p style="text-align: justify;">Vamos criar dois anéis, um para nosso segmento curvo e o outro para nossos segmentos retos. Juntaremos os dois em apenas um anel e depois adicionaremos este anel ao polígono.</p>
<p style="text-align: justify;">Para construir segmentos curvos, existem diversas interfaces do tipo <em>IConstruct*</em> (<em>IConstructCircularArc, IConstructBezierCurve</em>, etc.), cada uma com suas particularidades.</p>
<pre name="code" class="c#">
object _missing = Type.Missing;

        IGeometryCollection polygon = new PolygonClass();

        // building circular arc

        IPoint p1 = PointPolygonBuilder.BuildPoint(1, 2);
        IPoint p2 = PointPolygonBuilder.BuildPoint(1, 1);
        IPoint p3 = PointPolygonBuilder.BuildPoint(1, 0);
        IPoint p4 = PointPolygonBuilder.BuildPoint(0, 0);
        IPoint p5 = PointPolygonBuilder.BuildPoint(0, 1);

        IConstructCircularArc constructCircularArc = new CircularArcClass();
        constructCircularArc.ConstructThreePoints(p5, p2, p1, true);
        ICircularArc circularArc = constructCircularArc as ICircularArc;
        // end circular Arc

        ISegmentCollection finalRing = new RingClass();
        ISegmentCollection ring1 = new RingClass();
        IPointCollection ring2 = new RingClass();

        ring1.AddSegment(circularArc as ISegment, ref _missing, ref _missing);
        ring2.AddPoint(p1, ref _missing, ref _missing);
        ring2.AddPoint(p3, ref _missing, ref _missing);
        ring2.AddPoint(p4, ref _missing, ref _missing);
        ring2.AddPoint(p5, ref _missing, ref _missing);

        finalRing.AddSegmentCollection(ring1);
        finalRing.AddSegmentCollection(ring2 as ISegmentCollection);
        polygon.AddGeometry(finalRing as IGeometry, ref _missing, ref _missing);
</pre>
<div id="attachment_873" class="wp-caption aligncenter" style="width: 190px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/poligono_curva.png"><img class="size-medium wp-image-873" title="BrincandoArcObjects2_PoligonoCurva" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/poligono_curva-180x300.png" alt="Polígono resultante do código acima" width="180" height="300" /></a><p class="wp-caption-text">Polígono resultante do código acima</p></div>
<p style="text-align: justify;">Note que deu um trabalhinho à mais para montar este segmento curvo. É bom deixar claro também, que o ponto (1,1) representado na figura, não entra no anel feito de segmentos retos, ele é apenas utilizado para construir o segmento curvo.</p>
<p style="text-align: justify;">Outra coisa legal é ver que para acessar alguns métodos, você tem que instanciar certas interfaces. Notem que o <em>finalRing</em> e <em>ring1</em> possuem propriedades semelhantes, pois têm a mesma interface. Já <em>ring2</em> possui outros membros, pois é de interface diferente. Classes iguais, interfaces diferentes = propriedades diferentes.</p>
<p style="text-align: justify;">E aí, o que acharam?</p>
<p style="text-align: justify;">Abraços pessoal!</p>
<p style="text-align: justify;">George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects'>Brincando com ArcObjects</a></li>
<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/01/arcobjects1/' rel='bookmark' title='Permanent Link: ArcObjects #1 &#8211; introdução'>ArcObjects #1 &#8211; introdução</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usando Python e o Geoprocessing Framework #1</title>
		<link>http://blog.geoprocessamento.net/2010/06/python-geoprocessing-framework1/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=python-geoprocessing-framework1</link>
		<comments>http://blog.geoprocessamento.net/2010/06/python-geoprocessing-framework1/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 15:07:34 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[geoprocessing]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=866</guid>
		<description><![CDATA[Boa noite pessoal, Hoje quero falar um pouquinho do framework de geoprocessamento do ArcGIS, disponível em Python. Python, como sabem, é uma linguagem de alto nível, orientada à objetos e muito - mas muito fácil de se aprender. Existem tarefas extremamente repetitivas que podem ser facilmente automatizadas com um pouquinho de Python e o tal [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/usando-python-e-o-geoprocessing-framework-2/' rel='bookmark' title='Permanent Link: Usando Python e o geoprocessing framework #2'>Usando Python e o geoprocessing framework #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/' rel='bookmark' title='Permanent Link: Configure o TerraLib 3.3 no Visual Studio 2003'>Configure o TerraLib 3.3 no Visual Studio 2003</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 noite pessoal,</p>
<p>Hoje quero falar um pouquinho do framework de geoprocessamento do ArcGIS, disponível em Python. Python, como sabem, é uma linguagem de alto nível, orientada à objetos e muito - mas muito fácil de se aprender.</p>
<p>Existem tarefas extremamente repetitivas que podem ser facilmente automatizadas com um pouquinho de Python e o tal Geoprocessing. O ArcGIS, basicamente faz uso do Python em toda a command-line e em algumas ferramentas da toolbox. Tudo que é feito no ModelBuilder é convertido em código Python.</p>
<p>Bem, vamos à proposta: imagine que você tenha necessidade de atualizar dados disponibilizados como shapefiles, por um órgão do governo, de forma periódica e em um banco de dados (ArcSDE, Personal GDB, File GDB, etc.). Será possível?</p>
<p>Bem, isto é possível pois o Python conta com milhares de bibliotecas para acesso à páginas da web, compressão/descompressão de arquivos .zip, entre outras. Este foi um requerimento real de um trabalho antigo.</p>
<p>Bem, imaginemos o site do DNPM, que disponibiliza shapefiles dos direitos minerários, de tempos em tempos (o DNPM também publica um serviço web, mas nem sempre é um bom caminho). No site <a title="SIGMINE" href="http://sigmine.dnpm.gov.br/" target="_blank">SIGMINE</a> você pode puxar separado por estados o shape atualizado e alimentar um banco. Mas é muito trampo para ser feito toda semana. Ainda mais se tua base não for centralizada. Todo mundo tem atualizar milhares de mxds, mapas, etc.</p>
<p>Quais são nossos passos?</p>
<ul>
<li>Fazer o download do shapefile em .zip</li>
<li>Descompactar nosso arquivo em disco</li>
<li>Atualizar o banco de dados</li>
</ul>
<p>Podemos realizar o passo número 3 de várias formas, deletando a Feature Class antiga ou então atualizando registro por registro. Para nosso exercício, vamos deletar todos os registros e inseri-los novamente. Em ambientes mais controlados, com outras necessidades, talvez isto não seja o ideal.</p>
<p>Para contemplar nosso objetivo, iremos criar algumas classes:</p>
<ul>
<li>leecherHandler - responsável pelo download de arquivos da web;</li>
<li>folderHandler - responsável pela criação/deleção de pastas;</li>
<li>zipHandler - responsável pela compressão/descompressão de arquivos .zip;</li>
<li>logger - responsável por guardar mensagens importantes para controle do que está acontecendo;</li>
<li>geoprocessor - responsável por realizar as operações e interfaces com o ArcGIS;</li>
</ul>
<p>Vamos começar pela classe leecherHandler, que é o coração de nosso pequeno sistema:</p>
<pre>import sys, urllib2, logHandler

class leecherHandlerClass():

    def __init__(self,webAddress,tempFolder):
        self.logs = logHandler.logHandlerClass()
        # Startup the log object.

        self.webAddress = webAddress
        self.tempFolder = tempFolder
        self.localFile = self.buildLocalFile(self.downloadWebFile())

    def buildFileName(self,webAddress):
        fileName = "\\" + webAddress.split(r"/")[-1]
        return fileName

    def downloadWebFile(self):
        try:
            self.logs.newLogMessage(self,"Starting download...","Information")
            # @eventoLogged: Start download.
            webFile = urllib2.urlopen(self.webAddress)
            # Opening the URL chosen.
            self.logs.newLogMessage(self,"Finished download.","Information")
            # @eventLogged: Download finished. Return a file object type.
            return webFile
        except:
            self.logs.newLogMessage(self,"It was not possible to download file.\n" + str( sys.exc_info()[0]),"Error")
            # @eventLogged: Error downloading file from URL

    def buildLocalFile(self,webFile):
        try:
            self.logs.newLogMessage(self,"Writing file to disk...","Information")
            # @eventLogged: Start writing to a local file.
            fileName = self.buildFileName(self.webAddress)
            localFile = open(self.tempFolder + fileName,"wb")
            # Get the filename and open a localfile.

            localFile.write(webFile.read())
            # Write to brand new file.
            # @todo: find a better way to write the file to disk

            webFile.close()
            localFile.close()
            # Close both files. Clean-up action.
</pre>
<p>Esta classe é bastante simples. Ela usa o módulo urllib2 para fazer os downloads, além de construir um novo arquivo em disco, na pasta especificada. Vejam que o código da função downloadWebFile é muito simples. Apenas precisamos apontar qual é o arquivo que queremos puxar e ela já o constrói em disco, com um nome alterado com data - para não nos perdemos.</p>
<p>Você não precisa fazer mais nada, pois no construtor da classe, ela já dispara todas as ações de download e construção de arquivo em disco. Pode levar um tempo para puxar os arquivos, mas em geral é bastante rápido. Caso seja necessário, você terá de montar e inicializar um proxy - que também será mostrado.</p>
<p>A forma de uso é bastante simples:</p>
<pre>    shapeLeecher = leecherHandler.leecherHandlerClass('endereco do arquivo web','pasta temporaria de destino')
    # para acessarmos o arquivo local em disco, utilzamos a seguinte sintaxe:
    # shapeLeecher.localFile
</pre>
<p>Teremos agora um arquivo .zip em disco. Precisamos descompactá-lo. Crie uma nova classe, com a seguinte definição:</p>
<pre>import sys, zipfile, logHandler

class zipHandlerClass():

    def __init__(self,tempFolder,zipFilePathname,watchFileFormat="shp"):
        self.logs = logHandler.logHandlerClass()
        # Startup the log object

        self.tempFolder = tempFolder
        self.zipFilePathname = zipFilePathname
        self.watchFileFormat = watchFileFormat
        # Basic properties

        self.containedFiles = []
        # Generated file list inside zip archive
        self.outputWatchFile = watchFileFormat
        # outputInformation

    def testZipFile(self):
        if self.zipFilePathname == None or zipfile.is_zipfile == False:
            self.logs.newLogMessage(self,"File pointed is not a valid zipfile" + str(sys.exc_info()[0]),"Error")
            return False
        else:
            return True

    def readContainedFiles(self,zipFile):
            return zipFile.namelist()

    def extractFiles(self):
        try:
            if self.testZipFile()== True:
                extractingFile = zipfile.ZipFile(self.zipFilePathname,"r")
                self.containedFiles = self.readContainedFiles(extractingFile)
                # Defines a zipFile object using pathname for further manipulation. Read the files inside archive.
                for zippedFile in self.containedFiles:
                    unpackedFile = open(self.tempFolder + "\\" + zippedFile, "wb")
                    unpackedFile.write(extractingFile.read(zippedFile))
                    unpackedFile.close()
                    # Unpack and write file to disk
                    self.logs.newLogMessage(self,"File " + zippedFile + " unpacked and written to disk.","Information")
                    # @eventLogged: Zip file unpacked and written in disk with success.

                    if zippedFile[-3:] == self.watchFileFormat:
                        self.outputWatchFile = zippedFile
                    else:
                        self.outputWatchFile = self.tempFolder
                    # Test to see if any of these files is of type watched.
                    # @todo: make this classe output a list of watched files.
                extractingFile.close()
                # close extracted file. CleanUp.
                return True
            else:
                return False
            # Test to see if it is a valid zipfile. If not, return false.
        except zipfile.BadZipfile:
            self.logs.newLogMessage(self,"Corrupted zipfile. Please download it again.","Error")
            return False
</pre>
<p>Esta classe é um pouco mais complicada. Temos de monitorar um arquivo mestre (em nosso caso, um shapefile) para que possamos iniciar os próximos passos. Olhem a definição da classe - ela pede uma pasta temporária (a mesma que você usou com o leecher), uma localização do arquivo .zip e um formato. Este formato, tem como default a extensão .shp, mas você pode especificar outro.</p>
<pre>    # a idéia é que se use os resultados armazenados na classe leecher para alimentar
    # o construtor da classe zipHandler, criando um processo encadeado
    zipH = zipHandler.zipHandlerClass('pasta temporaria','arquivo.zip');
    zipH.extractFiles()
</pre>
<p>No frigir dos ovos, esta classe testa o arquivo zip, confere se o mesmo é válido, extrai os arquivos para a pasta selecionada, e guarda uma referência ao arquivo com a extensão escolhida.</p>
<p>Vamos mostrar agora a clase folderHandler. Ela irá criar nossas pastas para nós:</p>
<pre>import sys, os,datetime, shutil, logHandler

class folderHandlerClass():
    def __init__(self,tempFolder):
        self.logs = logHandler.logHandlerClass()
        self.tempFolder = tempFolder

    def generateTempFolderName(self):
        dataHora = datetime.date.today()
        folderName = self.tempZipFile[:-4] + "_" + str(dataHora)
        return folderName

    def createTempFolder(self):
        try:
            if os.path.exists(self.tempFolder):
                if os.path.isdir(self.tempFolder):
                    return True
                else:
                    self.logs.newLogMessage(self,"The specified folder is not a valid folder.","Error")
                    # @eventLogged: Folder is not valid.
                    return False
            else:
                os.mkdir(self.tempFolder,222)
                self.logs.newLogMessage(self,"Folder " + self.tempFolder + " created with success.","Information")
                # @eventLogged: Folder create with success.
                return True
        except:
            self.logs.newLogMessage(self,"An unexpected error occurred while creating the specified folder.\n" + str(sys.exc_info()[0]),"Error")
            # @eventLogged: Error while creating folder. More info on sys.exc_info()

    def deleteTempFolder(self):
        try:
            shutil.rmtree(self.tempFolder)
        except:
            self.logs.newLogMessage(self,"An unexpected error occurred while deleting the specified folder.\n" + str(sys.exc_info()[0]),"Error")
            # @eventLogged: Error while deleting folder. More info on sys.exc_info()
</pre>
<p style="text-align: justify;">
<p style="text-align: justify;">Esta classe tem dois métodos principais: um para criar pastas e outro para deletá-las. A classe executa uma verificação básica para saber se a pasta existe ou é uma pasta. Em caso de positivo a pasta não é criada, apenas usada como destino dos arquivos. Caso ela não exista, a classe tenta criá-la. Isto é feito para economizarmos uma operação e evitar de criar uma pasta com um nome já existente, o que nos daria um erro.</p>
<p style="text-align: justify;">O método que deleta a pasta é radical. Ele remove tudo que existe dentro da pasta. Sub-pastas, arquivos, não importa. Ele irá deletar tudo. Cuidado ao usá-lo com outros arquivos. O ideal para se trabalhar com este script é uma pasta separada só para ele. Para usar esta classe, faça assim:</p>
<p style="text-align: justify;">
<pre>    # como usar:
    folderH = folderHandler.folderHandlerClass('pasta temporaria')
    folderH.createTempFolder()
    # ele irá tentar criar a pasta
    folderH.deleteTempFolder()
    # ele irá tentar deletar a pasta e seu conteúdo
</pre>
<p style="text-align: justify;">
<p style="text-align: justify;">Bem, com estas classes conseguimos construir um pequeno framework para atualizarmos os dados em um banco do ArcGIS. São coisas simples, mas que ajudam bastante. No próximo post, teremos a classe que cuida das operações de geoprocessamento, interfaceando com o ArcGIS - e uma classe "mestra" que faz todas estas classes conversarem.</p>
<p>Como utilizar as três classes juntas?</p>
<pre>import sys,folderHandler,zipHandler,leecherHandler

    # primeiro tentamos acessar/criar a pasta que queremos
    # lembrem-se que um r antes de uma string, significa raw
    # não sendo necessário escapar os caracteres \
    folderH = folderHandler.folderHandlerClass(r"C:\temporario")
    folderH.createTempFolder()

    # é só inicializar o leecher Handler. seu construtor cuida do restante para nós
    shpLeecher = leecherHandler.leecherHandlerClass("ftp://sigmine.dnpm.gov.br/Brasil.zip",folderH.tempFolder)

    # podemos inicializar o zipHandler de duas maneiras
    # com uma chamada explícita
    zipH = zipHandler.zipHandlerClass(folderH.tempFolder,shpLeecher.localFile,"shp")

    # ou implicita, caso a extensao seja shapefile - pois é um parametro com uma entrada
    # default. se nada for especificado, .shp irá cair em seu lugar
    # zipH = zipHandler.zipHandlerClass(folderH.tempFolder,shpLeecher.localFile)
    zipH.extractFiles()
</pre>
<p style="text-align: justify;">
<p style="text-align: justify;">Com o código acima e as três classes descritas,  já conseguimos puxar um arquivo da web e descompactá-lo para uma pasta qualquer.</p>
<p style="text-align: justify;">Vocês podem notar que existem outras classes envolvidas aqui, especialmente o tal de LogHandler. Irei disponibilizar todo o projeto no próximo post <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">Quaisquer dúvidas, estou à disposição!</p>
<p style="text-align: justify;">Abraços</p>
<p style="text-align: justify;">George</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/usando-python-e-o-geoprocessing-framework-2/' rel='bookmark' title='Permanent Link: Usando Python e o geoprocessing framework #2'>Usando Python e o geoprocessing framework #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/' rel='bookmark' title='Permanent Link: Configure o TerraLib 3.3 no Visual Studio 2003'>Configure o TerraLib 3.3 no Visual Studio 2003</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/06/python-geoprocessing-framework1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Brincando com ArcObjects</title>
		<link>http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=brincando-com-arcobjects</link>
		<comments>http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 19:53:32 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[ArcObjects]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[ESRI]]></category>
		<category><![CDATA[Geometria]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=834</guid>
		<description><![CDATA[Boa tarde pessoal, ArcObjects é algo relativamente difícil. É complicado pois temos muitas formas de se fazer o que queremos, a documentação - apesar de razoável, não é excelente (existem detalhes importantes que podem estar escondidos em outras páginas) e não existe uma comunidade forte que trate destas questões. Gostaria de mostrar um pouco de [...]


Related posts:<ol><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>
<li><a href='http://blog.geoprocessamento.net/2010/01/arcobjects1/' rel='bookmark' title='Permanent Link: ArcObjects #1 &#8211; introdução'>ArcObjects #1 &#8211; introdução</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/arcgis-com-lancado/' rel='bookmark' title='Permanent Link: ArcGIS.com lançado'>ArcGIS.com lançado</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Boa tarde pessoal,</p>
<p style="text-align: justify;">ArcObjects é algo relativamente difícil. É complicado pois temos muitas formas de se fazer o que queremos, a documentação - apesar de razoável, não é excelente (existem detalhes importantes que podem estar escondidos em outras páginas) e não existe uma comunidade forte que trate destas questões.</p>
<p style="text-align: justify;">Gostaria de mostrar um pouco de ArcObjects aos iniciantes, em especial um <em>namespace</em> complicadinho: <strong>ESRI.ArcGIS.Geometry</strong>. Não tenho domínio do namespace suficiente para dizer que sou um <em>expert</em>, mas consigo me virar.</p>
<p style="text-align: justify;">O <em>namespace Geometry</em> é o responsável por cuidar de todas as operações com as geometrias, sejam elas de quaisquer tipos. Primeiramente gostaria de apresentaar à vocês aos tipos de geometria de <strong>alto-nível</strong>. Isto é importante pois algumas funções ou interfaces, só estão disponíveis nas geometrias de alto nível, outras somente nas de baixo nível.</p>
<p style="text-align: justify;">Todas as geometrias de alto nível tem à sua disposição um <em>set </em>teórico de operações possíveis, tais como interseção, união, diferença, diferença simétrica, entre outros. Outras interfaces/classes do <em>namespace</em> ESRI.ArcGIS.Geometry são responsáveis por estas operações.</p>
<h3 style="text-align: justify;">Geometrias de Alto Nível</h3>
<p>As geometrias de alto nível são:</p>
<ul>
<li>Points;</li>
<li>Multipoints;</li>
<li>Polylines;</li>
<li>Polygons;</li>
<li>MultiPatches;</li>
</ul>
<p>Ponto é o tipo de geometria mais simples que podemos encontrar no modelo do ArcGIS. É basicamente composta de uma coordenada X e uma coordenada Y. Opcionalmente os pontos podem ser <em>IdAware, ZAware</em> e <em>MAware</em>, ou seja: podem ter um Id, Z e M. Todas os tipos de geometrias podem ter estes atributos em seus vértices, que em suma, são pontos.</p>
<p>Multipontos é um tipo de geometria representado por uma coleção de pontos. Da mesma maneira que um ponto, cada ponto desta única geometria tem seus atributos.</p>
<p>Polilinhas são composta pela união de diversos <em>paths</em> (uma geometria de nível mais baixo) que são compostos por sua vez de diversos <em>segments</em>, que podem ser dos tipos: <strong>linha</strong>, <strong>arco circular</strong>, <strong>curva bezier</strong> ou <strong>arco elíptico</strong>.</p>
<p>Polígonos são geometrias compostas por <em>rings, </em>que são compostos por <em>segments</em>, dos tipos citados acima. A ordem de cada <em>ring</em> e o sentido de construção (horário/ante-horário) determinar o comportamento de cada <em>ring</em>. Exemplo: todos os <em>rings</em> externos são ordenados em sentido horário, indicando que o interior dele é o polígono. Caso um <em>ring </em>seja ordenado em <strong>anti-horário</strong> você está dizendo ao ArcGIS que ele é <em>hole</em> - com área negativa.</p>
<p>No caso dos polígonos, isso pode ocorrer indefinidamente, sendo determinado pela ordem em que cada <em>ring</em> aparece na <strong>coleção</strong>.</p>
<div id="attachment_861" class="wp-caption aligncenter" style="width: 291px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/untitled.png"><img class="size-full wp-image-861" title="ESRI_RingsPolygons" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/untitled.png" alt="Ilustração do funcionamento de rings e polígonos - Fonte: ESRI" width="281" height="227" /></a><p class="wp-caption-text">Ilustração do funcionamento de rings e polígonos - Fonte: ESRI</p></div>
<p><em>Multipatches</em> são geometrias compostas e são em três dimensões. São geometrias que podem ter múltiplas superfícies, com textura. É a forma como o ArcGIS representa objetos em três dimensões. São compostas de <em>Triangles, TriangleStrips </em>e <em>TriangleFans</em>.</p>
<p>Todas as geometrias de nível mais baixo são construídas necessáriamente por pontos. É o bloco de construção do ArcGIS.</p>
<h3>Geometrias de Baixo Nível</h3>
<ul>
<li><em>Paths</em></li>
<li><em>Rings</em></li>
<li><em>Segments</em></li>
<li><em>TriangleStrips</em></li>
<li><em>TriangleFans</em></li>
<li><em>Triangles</em></li>
</ul>
<div id="attachment_859" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/polyline.png"><img class="size-medium wp-image-859" title="UMLDiagram_ESRI_Polyline" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/polyline-300x170.png" alt="Diagrama mostrando a estrutura de Polyline - Fonte: ESRI" width="300" height="170" /></a><p class="wp-caption-text">Diagrama mostrando a estrutura de Polyline - Fonte: ESRI</p></div>
<div id="attachment_858" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/polygon.png"><img class="size-medium wp-image-858" title="UMLDiagram_ESRI_Polygon" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/polygon-300x170.png" alt="Diagrama mostrando à estrutura de Polygon - Fonte: ESRI" width="300" height="170" /></a><p class="wp-caption-text">Diagrama mostrando à estrutura de Polygon - Fonte: ESRI</p></div>
<p>Pela estrutura que temos aí dá pra entender melhor não?</p>
<p>Vamos começar brincando com os pontinhos, já que são as estruturas básicas de trabalho.</p>
<h3 style="text-align: justify;">Classes e Interfaces</h3>
<p style="text-align: justify;">Para simplificar para os iniciantes, classe é um projeto de um objeto. Quando criamos um novo, aquele projeto é "materializado" na memória do computador.</p>
<p style="text-align: justify;">Interface é um contrato. Quando dizemos que uma classe implementa uma interface, queremos dizer que aquela classe assinou um contrato de funcionalidade com aquela interface - ou seja, tudo que realiza operações na interface ou em algum membro da interface, está também disponível na classe, sendo possível utilizar aquela classe em alguma função que requer a interface.</p>
<h3 style="text-align: justify;">PointClass</h3>
<p>Esta classe implementa diversas interfaces (ou contratos) do <em>namespace Geometry</em>. As interfaces definem as funcionalidades que a PointClass terá. Caso você tenha o <em>Help</em> de desenvolvimento do ArcGIS instalado, abra o mesmo e procure esta URL ms-help://ESRI.EDNv9.3/esriGeometry/html/Point.htm .</p>
<p>Caso não tenha o help instalado</p>
<p>Como criamos um novo ponto? É bem simples, vejam só.</p>
<pre name="code" class="c#">
    IPoint ponto = new PointClass();
    ponto.PutCoords(10,10);
</pre>
<p>Vamos criar uma novo projeto C# do tipo ArcGIS&gt;Console Application. Adicione as referências:</p>
<ul>
<li>ESRI.ArcGIS.Geometry;</li>
<li>ESRI.ArcGIS.Framework;</li>
<li>ESRI.ArcGIS.esriSystem;</li>
</ul>
<p>Você verá que o Visual Studio já criou algumas linhas código para nós. Este é o código para buscar a licença na máquina. Em qualquer tipo de aplicação que você for construir, você deve ter um código similar para buscar uma licença, senão ele é automaticamente desligado.</p>
<pre name="code" class="c#">
namespace DesktopConsoleApplication1
{
    class Program
    {
        private static LicenseInitializer m_AOLicenseInitializer = new DesktopConsoleApplication1.LicenseInitializer();

        [STAThread()]
        static void Main(string[] args)
        {
            //ESRI License Initializer generated code.
            m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeArcView },
            new esriLicenseExtensionCode[] { });
            //ESRI License Initializer generated code.
            //Do not make any call to ArcObjects after ShutDownApplication()
            m_AOLicenseInitializer.ShutdownApplication();
        }
    }
}
</pre>
<p>Este é como meu código se parece. O método Main é o que executa o programa de verdade. Para demonstrar o funcionamento da interface IPoint e da PointClass, vamos escrever algo bem simples, para ilustrar.</p>
<p>Acima do <em>namespace</em>, adicione as seguintes linhas:</p>
<pre name="code" class="c#">
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Framework;
</pre>
<p>Elas são necessárias para utilizarmos os objetos contidos nestes <em>namespaces</em> sem qualificá-los totalmente, ex: ESRI.ArcGIS.Geometry.IPoint. Após a adição destas linhas, podemos utilizar somente IPoint, diretamente, pois estes objetos estão à nossa disposição.</p>
<p>Crie um novo método dentro desta classe (isto não é o ideal em código de produção - estude orientação à objetos. este é apenas um <strong>exemplo</strong>) chamado <em>BuildPoint</em>. Este método deve ser estático (não queremos ter de criar uma outra classe <em>Program</em> para acessá-lo), ou seja, pode ser acessado no "projeto" da classe (ao invés de funcionar no objeto). Neste método, queremos construir um ponto, designar suas coordenadas x, y e z e queremos que esta função nos devolva este ponto.</p>
<p>Ficaria assim:</p>
<pre name="code" class="c#">
        static IPoint BuildPoint(double x, double y, double z)
        {
            IPoint ponto = new PointClass();
            ponto.PutCoords(x, y);
            ponto.Z = z;

            return ponto;
        }
</pre>
<p>Sugiro que você não façam somente um Ctrl-C + Ctrl-V dos códigos. Teste isto no Visual Studio. O <em>Intelllisense</em> irá lhe mostrar algumas outras coisinhas interessantes. Não esqueça de consultar a documentação para saber mais sobre cada um dos membros e métodos.</p>
<p>Bem, o que este método faz? Ele simplesmente instancia um novo ponto, atualiza as coordenadas conformes passadas nos argumentos da função e nos devolve o ponto. Para que fazer uma função assim? Bem, são somente 4 linhas de código, mas imagine se você precisa criar 80000 pontos? Certo, então temos nossa primeira função pronta.</p>
<p>O que faremos com ela? Vamos modificar nosso método Main, para ler diversas coordenadas e criar um monte de pontos para nós. Depois iremos pedir para nosso método Main nos mostrar os pontos criados. Além de modificar o Main, vamos construir um segundo método para nos ajudar a criar os pontos.</p>
<p>Vamos lá:</p>
<pre name="code" class="c#">
        [STAThread()]
        static void Main(string[] args)
        {
            //ESRI License Initializer generated code.
            m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeArcView },
            new esriLicenseExtensionCode[] { });
            //ESRI License Initializer generated code.
            //Do not make any call to ArcObjects after ShutDownApplication()
            m_AOLicenseInitializer.ShutdownApplication();

            // após a inicialização da licença, vamos brincar
            string finaliza = "s";
            string leitura;

            // aqui guardaremos nossos pontos
            List listaDePontos = new List();

            // enquanto finaliza for diferente de n, repita:
            while (finaliza.Substring(0,1).ToLower() != "n")
            {
                // vamos dizer ao usuário o que precisamos.
                Console.WriteLine("Digite as coordenadas de seu ponto. Utilize vírgulas para separá-las");
                Console.WriteLine("X,Y,Z");

                // leitura guardará o resultado que nosso usuário digitar!
                leitura = Console.ReadLine();

                // temos uma string. precisamos de um método para quebrá-la
                // e nos devolver um ponto - que será inserido na listaDePontos
                listaDePontos.Add(TraduzirStringPonto(leitura));

                // será que o usuário quer digitar mais pontos?
                Console.WriteLine("Você deseja criar mais pontos? n para não");
                // vamos alterar o valor de finaliza, que será testa mais à frente.
                // note que esta rotina não cobre TODAS AS POSSIBILIDADES
                finaliza = Console.ReadLine();
            }

            // agora que o usuário terminou de criar seus pontos,
            // vamos mostrá-los à ele.
            Console.WriteLine();
            Console.WriteLine("Lista de Pontos:\n");

            // para cada variável do tipo IPoint em listaDePontos, faça
            foreach (IPoint p in listaDePontos)
            {
                // \t é caractere de tabulação.
                Console.Write("ID " + p.ID.ToString() + "\t");
                Console.Write("X " + p.X.ToString() + "\t");
                Console.Write("Y " + p.Y.ToString() + "\t");
                Console.Write("Z " + p.Z.ToString() + "\t");
                Console.WriteLine();
            }
            // vamos esperar o usuário ler os dados e assim que ele teclar denovo
            // finalizamos o programa
            Console.WriteLine();
            Console.WriteLine("Aperte qualquer botão do teclado para finalizar...");
            Console.ReadLine();
        }
</pre>
<p>No meio da função está a lógica do programa. Queremos ler dados, até o usuário dizer não. Note que este programa é bastante simples, não realiza verificação de erros nem os trata. Não deve ser feito <strong>assim</strong> na vida real!</p>
<p>Mostramos para o usuário algumas propriedades da classse IPoint, algumas setadas por nós, outras não. Viram que todos os IDs são iguais à zero?</p>
<p>Agora vou lhes mostrar a função TraduzirStringPonto. Ela envolve mais programação comum, do que ArcObjects. Vou mostrá-la só para não ficarem no escuro <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<pre name="code" class="c#">
        static IPoint TraduzirStringPonto(string s)
        {
            // recebemos nesta função uma string e queremos transformá-la em números
            // vamos usar o método Split, que tem como argumentos um array de caracteres
            // delimitados como as strings, com a exceção de que usamos aspas simples!
            string[] arrayDeStrings = s.Split(new Char[]{','},3);

            // vamos criar uma array com três posições para receber nossos números!
            double[] arrayDeDoubles = new double[3];

            // para i = 0 até i = 2
            for(int i = 0; i &lt;= 2; i++)
            {
                // assinale o valor da posição i em arrayDeDoubles
                // para ser igual ao valor da posição i em arrayDeStrings,
                // convertendo-os para um objeto do tipo Double
                arrayDeDoubles[i] = Double.Parse(arrayDeStrings[i]);
            }

            // vamos criar nosso ponto. lembra de BuildPoint?
            IPoint ponto = BuildPoint(arrayDeDoubles[0],arrayDeDoubles[1],arrayDeDoubles[2]);

            // nos devolva nosso ponto para que possamos inseri-lo na lista
            return ponto;
        }
</pre>
<p>Novamente um aviso: esta função também não tem identificação de erros ou tratamento dos mesmos. Recomendo ao interessado em desenvolver seu método de validação da entrada de dados, pois se inserirmos em nosso programa os valores:</p>
<blockquote><p>10,eitcha,100</p></blockquote>
<p>ele irá simplesmente travar - no momento da conversão de string para double.</p>
<p>Esta foi uma gentil introdução à manipulação de geometrias em ArcObjects. Os próximos passos são um pouco mais cabeludos, mas nada que seja impossível.</p>
<p>O que acharam?</p>


<p>Related posts:<ol><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>
<li><a href='http://blog.geoprocessamento.net/2010/01/arcobjects1/' rel='bookmark' title='Permanent Link: ArcObjects #1 &#8211; introdução'>ArcObjects #1 &#8211; introdução</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/05/arcgis-com-lancado/' rel='bookmark' title='Permanent Link: ArcGIS.com lançado'>ArcGIS.com lançado</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Configure o TerraLib 3.3 no Visual Studio 2003</title>
		<link>http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=configure-o-terralib-3-3-no-visual-studio-2003</link>
		<comments>http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 03:50:18 +0000</pubDate>
		<dc:creator>João Tácio</dc:creator>
				<category><![CDATA[João Tácio Silva]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[TerraLib]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=835</guid>
		<description><![CDATA[Boa noite pessoal, Este é o primeiro post de uma série sobre como utilizar a biblioteca TerraLib para desenvolver suas próprias aplicações. Espero que gostem! O tutorial apresentado é um complemento da documentação disponibilizada pelo INPE , que ensina como configurar a biblioteca TerraLib 3.3.1 no Visual Studio 2003. 1 - Requisitos para executar os [...]


Related posts:<ol><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>
<li><a href='http://blog.geoprocessamento.net/2010/02/hello-world-arcgis-style/' rel='bookmark' title='Permanent Link: Hello World, ArcGIS style!'>Hello World, ArcGIS style!</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>
</ol>]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<div class="mceTemp mceIEcenter" style="text-align: justify;">Boa noite pessoal,</div>
</div>
<p>Este é o primeiro post de uma série sobre como utilizar a biblioteca TerraLib para desenvolver suas próprias aplicações. Espero que gostem!</p>
<p style="text-align: justify;">O tutorial apresentado é um complemento da documentação disponibilizada pelo INPE , que ensina como configurar a biblioteca TerraLib 3.3.1 no Visual Studio 2003.</p>
<h3>1 - Requisitos para executar os exemplos</h3>
<ul>
<li>Visual Studio C++ 2003;</li>
<li>MySQL Administrator 5.o;</li>
<li>Driver MySQL para Windows;</li>
<li>Banco de Dados MySQL 5.1;</li>
<li>Biblioteca TerraLib para Windows, 3.3 ou superior;</li>
</ul>
<h3 style="text-align: justify;">2 - Instruções gerais de instalação</h3>
<p style="text-align: justify;">O primeiro software a instalar é o Visual Studio 2003. Utilize a instalação personalizada e <strong>desmarque o suporte a todas as outras linguagens diferentes do C++,</strong> por exemplo: C# e VB. A seguir, instale o MySQL, Driver do MySQL e o MySQL Administrator.</p>
<p style="text-align: justify;">Após instalar com sucesso os softwares descritos acima, crie uma pasta no disco C, por exemplo C:/TerraDir e descompacte todo o conteúdo do arquivo TerraLib_win_v_3_3_1.zip. Após descompactar, a árvore de pastas deve seguir o formato da figura 1.</p>
<div id="attachment_836" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/1.png"><img class="size-medium wp-image-836" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/1-300x80.png" alt="Árvore de pastas do TerraLib" width="300" height="80" /></a><p class="wp-caption-text">Árvore de pastas do TerraLib</p></div>
<h3 style="text-align: justify;">3 - Compilando a biblioteca TerraLib</h3>
<p style="text-align: justify;">O primeiro passo é compilar toda biblioteca TerrLib. Para isso, abra o Visual Studio, clique em File/Open Project / e escolha a solution, referente à biblioteca que será executada. No exemplo abaixo será compilado a solution createDatabase.sln.</p>
<p style="text-align: justify;"><strong>1) File/Open project/ ou Ctrl+Shift+O</strong><br />
C:\TerraDir\examples\createDatabase\createDatabase.sln. Certifique-se que o arquivo escolhido possui a extensão.sln, porque na pasta createDatabase, também possui um arquivo chamado createDatabase.dsw.</p>
<p style="text-align: justify;"><strong>2) Build/Build Solution ou Ctrl+Shitf+B</strong><br />
Build Sucessfull -&gt; Essa mensagem é indício que está indo tudo muito bem, parabéns!</p>
<p style="text-align: justify;">Faça este mesmo procedimento para todas as bibliotecas abaixo na ordem que estão listadas.</p>
<ul>
<li>createLayer;</li>
<li>createTable;</li>
<li>importMIDMIF;</li>
<li>importShape;</li>
<li>importDBF;</li>
<li>importJPEG;</li>
<li>copyLayer;</li>
<li>importGeoTab;</li>
<li>convertCoordinates;</li>
<li>databaseQuery;</li>
<li>databaseSQLQuery;</li>
<li>spatialQuery;</li>
<li>addGeomRepresentation;</li>
<li>createTheme;</li>
<li>themeGrouping;</li>
<li>createSTElementSet;</li>
<li>mosaicTIFFImages;</li>
<li>importCSV;</li>
<li>importGridData;</li>
<li>rasterSlicing;</li>
<li>querierFromTheme;</li>
<li>proxMatrixAndSpatialStatistics;</li>
<li>spatialQueryAndBuffer;</li>
<li>querierFromLayer;</li>
<li>createSTElementSetFromLayer;</li>
<li>image_processing.</li>
</ul>
<p style="text-align: justify;">Após compilar todas as bibliotecas acima sem erros, pode fechar o Visual Studio. A próxima etapa consiste em codificar alguns trechos de códigos para iniciar o aprendizado na biblioteca TerraLib. No tutorial do INPE  existem diversas páginas com trechos de código.</p>
<p style="text-align: justify;"><strong>4 - Configurar o projeto</strong></p>
<p style="text-align: justify;">Este tutorial ficará limitado em explicar detalhadamente apenas os passos necessários para criar um projeto.</p>
<p style="text-align: justify;">O primeiro passo é criar um novo projeto, para isso abra o Visual Studio. Escolha File/New/Project, conforme a figura 2 e coloque o nome no projeto de Primeiro Exemplo.</p>
<div id="attachment_837" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/2.png"><img class="size-medium wp-image-837" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/2-300x236.png" alt="Criar um novo projeto" width="300" height="236" /></a><p class="wp-caption-text">Criar um novo projeto</p></div>
<p> Escolha o template Console Application (.NET), conforme imagem 3.</p>
<div id="attachment_838" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/3.png"><img class="size-medium wp-image-838" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/3-300x204.png" alt="Figura 3 - Escolher Template" width="300" height="204" /></a><p class="wp-caption-text">Figura 3 - Escolher Template</p></div>
<p style="text-align: justify;">Após criar o projeto PrimeiroExemplo, é necessário várias configurações. A primeira é adicionar os projetos existentes do TerraLib. Para isso clique na solution e escolha add e selecione Existing Project. Veja nas figuras 4, 5 e 6 como adicionamos o projeto terralib.</p>
<div id="attachment_839" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/4.png"><img class="size-medium wp-image-839" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/4-300x263.png" alt="Figura 04  - Adicionar projeto existente" width="300" height="263" /></a><p class="wp-caption-text">Figura 04 - Adicionar projeto existente</p></div>
<div id="attachment_840" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/5.png"><img class="size-medium wp-image-840" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/5-300x193.png" alt="Figura 05 - Adicionar projeto existente  (2° passo)" width="300" height="193" /></a><p class="wp-caption-text">Figura 05 - Adicionar projeto existente (2° passo)</p></div>
<div id="attachment_841" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/6.png"><img class="size-medium wp-image-841" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/6-300x193.png" alt="Figura 06 - Adicionar projeto existente (3° passo)" width="300" height="193" /></a><p class="wp-caption-text">Figura 06 - Adicionar projeto existente (3° passo)</p></div>
<div id="attachment_842" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/7.png"><img class="size-medium wp-image-842" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/7-300x193.png" alt="Figura 07 - Adicionar projeto existente (4° passo)" width="300" height="193" /></a><p class="wp-caption-text">Figura 07 - Adicionar projeto existente (4° passo)</p></div>
<p style="text-align: justify;">Além do projeto terralib, é necessário adicionar os projetos libjpeg e tiff, que estão respectivamente nos caminhos C:\TerraDir\terralibw\libjpeg  e C:\TerraDir\terralibw\tiff. Após adicionar os três projetos, faça um Build na solution.</p>
<p style="text-align: justify;">Além desses três projetos que foram incorporados ao projeto PrimeiroExemplo, outros projetos do TerraLib poderão ser agregados conforme a necessidade.</p>
<p style="text-align: justify;">O procedimento a seguir objetiva configurar o projeto PrimeiroExemplo. Clique nas propriedades do projeto, conforme na figura 08.</p>
<div id="attachment_843" class="wp-caption aligncenter" style="width: 224px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/8.png"><img class="size-medium wp-image-843" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/8-214x300.png" alt="Figura 08 - Propriedades do Projeto" width="214" height="300" /></a><p class="wp-caption-text">Figura 08 - Propriedades do Projeto</p></div>
<p style="text-align: justify;">Insira o caminho para os diversos diretórios adicionais do projeto. Para realizar essa operação, copie e cole toda a linha a seguir no campo Additional Include Directories. A figura 09 detalha o que precisa ser feito.</p>
<blockquote><p>.;..\..\src\terralib\kernel;..\..\src\terralib\drivers\MySQL;..\..\src\terralib\drivers\MySQL\include</p></blockquote>
<div id="attachment_844" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/9.png"><img class="size-medium wp-image-844" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/9-300x201.png" alt="Figura 09 - Adicionar Diretórios Adicionais" width="300" height="201" /></a><p class="wp-caption-text">Figura 09 - Adicionar Diretórios Adicionais</p></div>
<p style="text-align: justify;">Desabilite o Precompiled headers. Não feche a janela de propriedades. Configure o Linker do projeto PrimeiroExemplo. Esse procedimento é necessário para que o projeto criado consiga referenciar as classes do TerraLib. Inclua as dependências adicionais conforme ilustra a figura 10. Para isso copie as linhas abaixo e cole em Additional Dependencies.</p>
<div id="attachment_845" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/10.png"><img class="size-medium wp-image-845" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/10-300x201.png" alt="Figura 10 - Desabilite os precompiled headers" width="300" height="201" /></a><p class="wp-caption-text">Figura 10 - Desabilite os precompiled headers</p></div>
<div id="attachment_846" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/11.png"><img class="size-medium wp-image-846" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/11-300x201.png" alt="Figura 11 - Additional dependencies" width="300" height="201" /></a><p class="wp-caption-text">Figura 11 - Additional dependencies</p></div>
<blockquote><p>../../Debug/terralib/terralib.lib ../../Debug/libjpeg/libjpeg.lib ../../Debug/tiff/tiff.lib</p>
<p>../../terralibw/zlib/zlibdll.lib ../../terralibw/MySQL/libMySQL.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib imm32.lib winmm.lib wsock32.lib winspool.lib delayimp.lib</p></blockquote>
<p style="text-align: justify;">Após realizar todos os procedimentos acima, faça um build do projeto. Caso ocorrer algum erro, tente remover e copiar novamente as linhas que foram inseridas nas propriedades do projeto. Atenção ao copiar essas linhas, espaços não podem ser retirados ou inseridos.</p>
<p style="text-align: justify;">Os procedimentos abaixo consistem em adicionar itens existentes ao projeto. Para o projeto PrimeiroProjeto, será adicionado as bibliotecas TeMySQL.h e TeMySQL.cpp. As figuras de 12 14 demonstram como adicionar o item TeMySQL.cpp ao Source File do Projeto.</p>
<div id="attachment_847" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/12.png"><img class="size-medium wp-image-847" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/12-300x192.png" alt="Figura 12 - Adicionar itens existentes do 1° passo" width="300" height="192" /></a><p class="wp-caption-text">Figura 12 - Adicionar itens existentes do 1° passo</p></div>
<div id="attachment_848" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/13.png"><img class="size-medium wp-image-848" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/13-300x192.png" alt="Figura 13 - Adicionar Itens existentes (2° passo)" width="300" height="192" /></a><p class="wp-caption-text">Figura 13 - Adicionar Itens existentes (2° passo)</p></div>
<p> A figura 13 apresenta os dois arquivos da biblioteca TerraLib que deverão ser inseridos ao projeto. Inicialmente escolha apenas TeMySQL.cpp a selecione Open.</p>
<div id="attachment_849" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/14.png"><img class="size-medium wp-image-849" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/14-300x290.png" alt="Figura 14 - Arquivos existentes da biblioteca" width="300" height="290" /></a><p class="wp-caption-text">Figura 14 - Arquivos existentes da biblioteca</p></div>
<p style="text-align: justify;">Para adicionar o arquivo TeMySQL.h ao projeto, click sobre Header Files do projeto PrimeiroProjeto. A figura 14 demonstra como fazer isso. Os próximos passos para adicionar TeMySQL.h são os mesmos das figuras 12 e 13, porém escolha TeMySQL.h e pressione open.</p>
<p style="text-align: justify;">Ao final de todos esses procedimentos, realize um build de todo o projeto PrimeiroProjeto para certificarmos que todos as configurações estão corretas.</p>
<h3 style="text-align: justify;">5 – Codificar o primeiro exemplo</h3>
<p style="text-align: justify;">Para iniciar a codificação do primeiro exemplo, click duas vezes sobre a classe PrimeiroExemplo.cpp, conforme a imagem 15 e adicione as bibliotecas e os métodos criarBancoDeDados e conectar. Após a figura 15 tem o código completo da classe PrimeiroExemplo.cpp. Após codificar a classe, realize um build no projeto e execute-o.</p>
<div id="attachment_850" class="wp-caption aligncenter" style="width: 266px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/15.png"><img class="size-medium wp-image-850" src="http://blog.geoprocessamento.net/wp-content/uploads/2010/06/15-256x300.png" alt="Figura 15 - Alterando a classe PrimeiroExemplo.cpp" width="256" height="300" /></a><p class="wp-caption-text">Figura 15 - Alterando a classe PrimeiroExemplo.cpp</p></div>
<pre name="code" class="cpp">
#include "stdafx.h"
#include "conio.h"

#include "TeMySQL.h"
#include "TeDriverMIDMIF.h"

#using 

using namespace System;

//Declaração dos métodos
int conectar();
int criarBancoDeDados();

int _tmain()
{
    // TODO: Please replace the sample code below with your own.
    Console::WriteLine(S"Hello World");
	conectar();
	criarBancoDeDados();
	getch();
	return 0;
}

int criarBancoDeDados ()
{
	// Parâmetros do servidor de bancos de dados
	string host = "localhost";
	string dbname = "TerraTeste";
	string user = "root";
	string password = ""; 

	// Cria um novo banco
	TeDatabase* db = new TeMySQL();
	if (!db-&gt;newDatabase(dbname,user, password, host))
	{
	cout &lt;&lt; "Erro: " &lt;&lt; db-&gt;errorMessage() &lt;&lt; endl;
	return 1;
	} 

	cout &lt;&lt; "O banco de dados \"" &lt;&lt; dbname;
	cout &lt;&lt;"\" foi criado com sucesso no servidor MySQL localizado em\""
		&lt;&lt; host;
	cout &lt;&lt; "\" para o usuario \"" &lt;&lt; user &lt;&lt; "\"!"  &lt;&lt; endl;  	// Fecha o banco de dados  	db-&gt;close();
	delete db;
	return 0;
}

int conectar()
{
	// Cria uma conexão a um servidor de banco de dados
	TeDatabase* db = new TeMySQL();
	// Parametros do servidor de bancos de dados
	string host ="localhost";
	string dbname = "TerraTeste";
	string user = "root";
	string password = "";
	if (!db-&gt;connect(host,user, password,dbname,0))
	{
	cout&lt;&lt; "Erro: " &lt;&lt; db-&gt;errorMessage() &lt;&lt; endl;
	return 0;
	}
	cout &lt;&lt; "Aberta conexão ao banco: " &lt;&lt; dbname;
             db-&gt;close();
	delete db;
  }
</pre>
<p>É isso aí pessoal! O que acharam? Abraços e comentem!</p>
<p>João Tácio Silva</p>


<p>Related posts:<ol><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>
<li><a href='http://blog.geoprocessamento.net/2010/02/hello-world-arcgis-style/' rel='bookmark' title='Permanent Link: Hello World, ArcGIS style!'>Hello World, ArcGIS style!</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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/06/configure-o-terralib-3-3-no-visual-studio-2003/feed/</wfw:commentRss>
		<slash:comments>2</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>Python QuantumGIS Cookbook</title>
		<link>http://blog.geoprocessamento.net/2010/05/pyqgis-cookbook/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pyqgis-cookbook</link>
		<comments>http://blog.geoprocessamento.net/2010/05/pyqgis-cookbook/#comments</comments>
		<pubDate>Wed, 12 May 2010 13:32:23 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[QGIS]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=704</guid>
		<description><![CDATA[Boa tarde pessoal, A comunidade internacional lançou à poucos dias um livro de receitas de como programar/extender o QuantumGIS. Vale a pena dar uma olhada. Para os interessados é uma mão na roda para ajudar a começar. Check it out. Tem uma excelente introdução, passando por tópicos sobre como mexer em camadas vetoriais, raster, construção [...]


Related posts:<ol><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>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-o-que-e/' rel='bookmark' title='Permanent Link: #Python &#8211; o que é?'>#Python &#8211; o que é?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Boa tarde pessoal,</p>
<p>A comunidade internacional lançou à poucos dias um livro de receitas de <strong>como programar/extender</strong> o <a title="QuantumGIS" href="http://www.qgis.org/" target="_blank">QuantumGIS</a>. Vale a pena dar uma olhada. Para os interessados é uma mão na roda para ajudar a começar. <em>Check it out.</em></p>
<p>Tem uma excelente introdução, passando por tópicos sobre como mexer em camadas vetoriais, raster, construção de geometrias, projeções e por fim como construir um <em>plugin.</em></p>
<p><a title="PyQgis CookBook" href="http://mapserver.sk/~wonder/qgis/html/" target="_blank">Python QuantumGIS Cookbook</a></p>
<p>Abraços</p>
<p>George R. C. Silva</p>


<p>Related posts:<ol><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>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-o-que-e/' rel='bookmark' title='Permanent Link: #Python &#8211; o que é?'>#Python &#8211; o que é?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/05/pyqgis-cookbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Máquina Virtual e Desenvolvimento para ArcObjects</title>
		<link>http://blog.geoprocessamento.net/2010/03/maquina-virtual-e-desenvolvimento-para-arcobjects/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=maquina-virtual-e-desenvolvimento-para-arcobjects</link>
		<comments>http://blog.geoprocessamento.net/2010/03/maquina-virtual-e-desenvolvimento-para-arcobjects/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 15:57:05 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcObjects]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[VM]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=442</guid>
		<description><![CDATA[Boa tarde pessoal, Sejam bem-vindos à mais nova série de postagens do Blog Geo.NET: Congonha's Post. Bem, ela tem esse nome porque estou postando do aeroporto de Congonhas e hoje vamos falar, rapidinho, sobre máquinas virtuais e o desenvolvimento para ArcObjects. (estava postando do aeroporto de Congonhas, mas meu voô ia sair sem mim, então [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/01/arcobjects1/' rel='bookmark' title='Permanent Link: ArcObjects #1 &#8211; introdução'>ArcObjects #1 &#8211; introdução</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects'>Brincando com ArcObjects</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 style="text-align: justify;">Boa tarde pessoal,</p>
<p style="text-align: justify;">Sejam bem-vindos à mais nova série de postagens do Blog Geo.NET: <strong>Congonha's Post</strong>.</p>
<p style="text-align: justify;">Bem, ela tem esse nome porque estou postando do aeroporto de Congonhas e hoje vamos falar, rapidinho, sobre máquinas virtuais e o desenvolvimento para <em>ArcObjects</em>. (estava postando do aeroporto de Congonhas, mas meu voô ia sair sem mim, então tive de deixar para hoje <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<p style="text-align: justify;">Desenvolver para <em>ArcObjects </em>é complicado. Temos de referenciar diversas bibliotecas, instalar diversos softwares para nos auxiliar e temos, no final de tudo, de fazer o <em>deploy</em> de nossos componentes customizados.</p>
<p style="text-align: justify;">Estes dias anteriores, durante um trabalho em um dos clientes, tive de realizar o <em>deploy</em> de um componente customizado, que cuida de simbologia de algumas camadas (em torno de 200).</p>
<p style="text-align: justify;">Estava me dando um trabalhão. Montava um executável, enviava o executável para um máquina de testes, instalava o software, testava. Deu erro? Desinstala o software e começa tudo denovo.</p>
<p style="text-align: justify;">Aí me sugeriram: pegue uma máquina virtual e monte um ambiente similar ao em que realizaremos o <em>deploy</em> final.</p>
<p style="text-align: justify;">Existem diversos softwares para montarmos máquinas virtuais, mas existe um simples, gratuito e da <em>Microsoft</em> que resolve horrores. Virtual PC. Só fazer o download e instalar o sistema (<em>Windows</em>) que você quiser. Do 95 ao 7 <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Você pede para criar a máquina virtual, aloca uma certa quantidade de RAM e HD para a mesma, e voilá, você tem um PC dentro do seu PC.</p>
<p style="text-align: justify;">Como isto facilitou minha vida? Ganhei no mínimo, uns quatros dias de trabalho. Instalei a VM (<em>Virtual Machine)</em>, abri uma instância do Windows XP, coloquei um ArcGIS 9.3 e fui realizando os ajustes até finalizar.</p>
<p style="text-align: justify;">Agora, o que é legal é que você pode montar diversas instâncias e testar a <em>backwards compatibility (</em>compatibilidade retroativa - ou algo do tipo) com outras versões, de ArcGIS, de ArcServer, enfim, de diversos ambientes diferentes.</p>
<p style="text-align: justify;">Estou com duas máquinas virtuais, as duas com WinXP SP3, uma com ArcGIS 9.3 e a outra com ArcGIS 9.2.</p>
<p style="text-align: justify;">Fica aí a dica.</p>
<p style="text-align: justify;">George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/01/arcobjects1/' rel='bookmark' title='Permanent Link: ArcObjects #1 &#8211; introdução'>ArcObjects #1 &#8211; introdução</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/06/brincando-com-arcobjects/' rel='bookmark' title='Permanent Link: Brincando com ArcObjects'>Brincando com ArcObjects</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/03/maquina-virtual-e-desenvolvimento-para-arcobjects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
