<?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; ArcGIS</title>
	<atom:link href="http://blog.geoprocessamento.net/tag/arcgis/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.geoprocessamento.net</link>
	<description>Geoprocessamento, SIG e Sensoriamento Remoto</description>
	<lastBuildDate>Wed, 21 Sep 2011 12:00:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Diquinhas de ArcGIS #3</title>
		<link>http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=diquinhas-de-arcgis-3</link>
		<comments>http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-3/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 13:05:27 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[arctoolbox]]></category>
		<category><![CDATA[Geoprocessamento]]></category>
		<category><![CDATA[geoprocessing]]></category>

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


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #1'>Diquinhas de ArcGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-2/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #2'>Diquinhas de ArcGIS #2</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>Olá pessoal,</p>
<p>Continuando a série de diquinhas de ArcGIS!</p>
<p>Algumas pessoas fazem bastante uso de ferramentas de geoprocessamento, especialmente para análise espacial. Neste quesito, a ferramenta mais utilizada do ArcMap é o ArcToolbox.</p>
<p>Existem processos, que invariavelmente são: rodar ferramenta de geoprocessing, conferir resultados, refinar análise, etc. São tantos arquivos gerados que podemos ficar facilmente perdidos.</p>
<p>Uma das coisas legais que temos no ArcToolbox (acho que a partir da versão 9.3) é o histórico de ferramentas (tanto no ArcMap, quanto no ArcCatalog). Podemos precisar de um processo de foi rodado à algumas horas e onde está o tal arquivo?</p>
<p>Bem, para acabar com os problemas, o histórico vem ao resgate.</p>
<div id="attachment_1330" class="wp-caption aligncenter" style="width: 130px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2011/07/screen2.png"><img class="size-medium wp-image-1330" title="Aba Results no ArcToolbox" src="http://blog.geoprocessamento.net/wp-content/uploads/2011/07/screen2-120x300.png" alt="Aba Results no ArcToolbox" width="120" height="300" /></a><p class="wp-caption-text">Aba Results no ArcToolbox</p></div>
<p>Para cada processo que rodamos, ele guarda um registro da entrada, dos parâmetros e da saída. Através disso é possível re-rodar o processo ou então arrastar o resultado (desde que não tenha sido fisicamente deletado do PC!) par ao mapa novamente e pronto. Está lá denovo.</p>
<p>O post de hoje foi patrocionado pelo...silêncio.</p>
<p>Abraços</p>
<p>George Rodrigues da Cunha Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #1'>Diquinhas de ArcGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-2/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #2'>Diquinhas de ArcGIS #2</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/2011/07/diquinhas-de-arcgis-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diquinhas de ArcGIS #2</title>
		<link>http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=diquinhas-de-arcgis-2</link>
		<comments>http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-2/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 19:34:35 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[diquinhas-arcgis]]></category>
		<category><![CDATA[ESRI]]></category>
		<category><![CDATA[GIS]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=1318</guid>
		<description><![CDATA[Novas diquinhas frescas para você! Boa tarde pessoal, uma coisa legal que o ArcMap tem de MONTE são atalhos. Atalhos, são...atalhos. Faça o que você precisa fazer, mas mais rápido. Isso não é bom? Ah, estas dicas são para versão 9.3.1; Portanto, hoje vou falar de alguns, pois existem muitos: Atalhos comuns à todas as [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #1'>Diquinhas de ArcGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-3/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #3'>Diquinhas de ArcGIS #3</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>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Novas diquinhas frescas para você!</p>
<p>Boa tarde pessoal, uma coisa legal que o ArcMap tem de MONTE são atalhos. Atalhos, são...atalhos. Faça o que você precisa fazer, mas mais rápido. Isso não é bom? Ah, estas dicas são para versão 9.3.1;</p>
<p>Portanto, hoje vou falar de alguns, pois existem muitos:</p>
<h3>Atalhos comuns à todas as ferramentas de edição</h3>
<ul>
<li>Z (Zoom Mais);</li>
<li>X (Zoom Menos);</li>
<li>C (Navegação);</li>
<li>B (Navegação contínua);</li>
<li><strong>V (Mostrar vértices);</strong></li>
<li>Esc<strong> </strong>(Cancela operação);</li>
<li>Ctrl+Z (desfazer);</li>
<li><strong>Ctrl+Y (</strong><strong>refazer);</strong></li>
<li><strong>Segurar Barra de Espaço (suspende snapping);</strong></li>
</ul>
<p>Os mais demais são os em negrito. Mãozassa na roda.</p>
<p>Post de hoje foi patrocinado por The Prodigy e Sublime.</p>
<p>Abraços</p>
<p>George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #1'>Diquinhas de ArcGIS #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-3/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #3'>Diquinhas de ArcGIS #3</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>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Diquinhas de ArcGIS #1</title>
		<link>http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=diquinhas-de-arcgis-1</link>
		<comments>http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 14:13:49 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[diquinhas-arcgis]]></category>
		<category><![CDATA[ESRI]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=1314</guid>
		<description><![CDATA[Olá pessoal, Bem vindos ao primeiro post da (espero que longa) série de dicas de ArcGIS. O objetivo é mostrar algo que salva a vida do peão em pouco tempo. Hoje vamos falar de uma opção bem escondida do Editor que força ao usuário inserir os dados em uma nova feição antes que o ArcGIS [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-3/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #3'>Diquinhas de ArcGIS #3</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-2/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #2'>Diquinhas de ArcGIS #2</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>Olá pessoal,</p>
<p>Bem vindos ao primeiro post da (espero que longa) série de dicas de ArcGIS. O objetivo é mostrar algo que salva a vida do peão em pouco tempo.</p>
<p>Hoje vamos falar de uma opção bem escondida do Editor que força ao usuário inserir os dados em uma nova feição antes que o ArcGIS a crie de verdade.</p>
<p>O fluxo comum é:</p>
<ul>
<li>Criar feição;</li>
<li>Feição vai para o banco de dados (ou shapefile);</li>
<li>Editar atributos;</li>
</ul>
<p>Desta forma, podemos esquecer alguma coisa, ou se existirem campos que são obrigatórios, mas não tem valor <em>default</em>, causar um erro.</p>
<p>No ArcMap é possível pedir para "<em>promptar"</em> o usuário antes de armazenar a feição em nosso repositório de dados</p>
<p>O fluxo alternativo, portanto:</p>
<ul>
<li>Criar feição;</li>
<li>Receber entrada de dados básica;</li>
<li>Feição vai para o banco de dados (ou shapefile);</li>
</ul>
<p>Perceba que a entrada de dados foi realizada anteriormente à ida da feição ao banco de dados. Isto ajuda a economizar até um cadinho de banda.</p>
<p>Para habilitar:</p>
<p>Editor &gt; Options &gt; Aba Attributes</p>
<div id="attachment_1315" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.geoprocessamento.net/wp-content/uploads/2011/07/diquinha1.png"><img class="size-medium wp-image-1315" title="Diquinha de ArcGIS" src="http://blog.geoprocessamento.net/wp-content/uploads/2011/07/diquinha1-300x297.png" alt="Diquinha de ArcGIS #1 - Editar feição" width="300" height="297" /></a><p class="wp-caption-text">Diquinha de ArcGIS #1 - Editar feição</p></div>
<p>Agora é só editar!</p>
<p>É bastante útil em projetos de edição em que se precisa estar atento <strong>o tempo todo.</strong></p>
<p>Post de hoje patrocinado por Velhas Virgens e The Offspring.</p>
<p>Abraços</p>
<p>George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-3/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #3'>Diquinhas de ArcGIS #3</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-2/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #2'>Diquinhas de ArcGIS #2</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/2011/07/diquinhas-de-arcgis-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ArcGIS Online recebe grande atualização</title>
		<link>http://blog.geoprocessamento.net/2011/07/arcgis-online-recebe-grande-atualizacao/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arcgis-online-recebe-grande-atualizacao</link>
		<comments>http://blog.geoprocessamento.net/2011/07/arcgis-online-recebe-grande-atualizacao/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 17:00:40 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[ESRI]]></category>
		<category><![CDATA[esri-uc]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=1288</guid>
		<description><![CDATA[Boa tarde pessoal, Pegando o embalo da ESRI User Conference que está sendo realizada esta semana, em San Diego, o site ArcGIS Online recebeu uma grande atualização de funcionalidades. Agora é possível construir seus mapas utilizando webservices WMS, renomear camadas, importar KMLs e outras delícias mais. Estas eram funcionalidades há muito esperadas! Para quem não [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/arcgis-10-disponivel-para-venda/' rel='bookmark' title='Permanent Link: ArcGIS 10 disponível para venda'>ArcGIS 10 disponível para venda</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>
<li><a href='http://blog.geoprocessamento.net/2010/10/integracao-cadgis/' rel='bookmark' title='Permanent Link: Integração CAD/GIS'>Integração CAD/GIS</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Boa tarde pessoal,</p>
<p>Pegando o embalo da <a rel="nofollow" target="_blank" title="esriuc" href="http://www.esri.com/events/user-conference/index.html" target="_blank">ESRI User Conference</a> que está sendo realizada esta semana, em San Diego, o site <a rel="nofollow" target="_blank" title="agonline" href="http://www.arcgis.com/home/" target="_blank">ArcGIS Online</a> recebeu uma grande atualização de funcionalidades.</p>
<p>Agora é possível construir seus mapas utilizando webservices WMS, renomear camadas, importar KMLs e outras delícias mais. Estas eram funcionalidades há muito esperadas!</p>
<p>Para quem não sabe, <a rel="nofollow" target="_blank" title="agonline" href="http://www.arcgis.com/home/" target="_blank">ArcGIS Online</a> é uma plataforma na web, que permite que o usuário envie seus dados ou colete dados de outros usuários para montar mapas e mini-SIGs de maneira extremamente fácil e intuitiva. E o melhor, seu mapa pode ser compartilhado com usuários, clientes, etc. É uma plataforma amigável para publicação de informações geográficas.</p>
<p>Nunca testou? Corra até o <a rel="nofollow" target="_blank" title="agonline" href="http://www.arcgis.com/home/" target="_blank">site</a> e teste! Acredito que ficarão surpreendidos.</p>
<p>Abraços,</p>
<p>George R. C. Silva</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/07/arcgis-10-disponivel-para-venda/' rel='bookmark' title='Permanent Link: ArcGIS 10 disponível para venda'>ArcGIS 10 disponível para venda</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>
<li><a href='http://blog.geoprocessamento.net/2010/10/integracao-cadgis/' rel='bookmark' title='Permanent Link: Integração CAD/GIS'>Integração CAD/GIS</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2011/07/arcgis-online-recebe-grande-atualizacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ArcObjects e Class Extensions #1</title>
		<link>http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arcobjects-e-class-extensions-1</link>
		<comments>http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/#comments</comments>
		<pubDate>Sat, 11 Dec 2010 20:53:10 +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>
		<category><![CDATA[ESRI]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/</guid>
		<description><![CDATA[Boa noite senhores e senhoras, Class Extensions é um assunto relativamente antigo. Quem já desenvolveu para ArcObjects às conhecem razoavelmente bem e são implementadas em larga escala como forma de customização avançada dos famosos geodatabases (qualquer um deles, seja Personal, File ou ArcSDE). Bem, as class extensions são implementadas através de algumas interfaces especiais e [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/02/arcobjects-e-class-extensions-2/' rel='bookmark' title='Permanent Link: ArcObjects e Class Extensions #2'>ArcObjects e Class Extensions #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/03/padro-de-projeto-activerecord-e-arcobjects/' rel='bookmark' title='Permanent Link: Padr&atilde;o de Projeto ActiveRecord e ArcObjects'>Padr&atilde;o de Projeto ActiveRecord e ArcObjects</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/cascading-class-extensions/' rel='bookmark' title='Permanent Link: Cascading Class Extensions'>Cascading Class Extensions</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<div align="justify">
Boa noite senhores e senhoras,</p>
<p><i>Class Extensions</i> é um assunto relativamente antigo. Quem já desenvolveu para <i>ArcObjects</i> às conhecem razoavelmente bem e são implementadas em larga escala como forma de customização avançada dos famosos <i>geodatabases</i> (qualquer um deles, seja <i>Personal</i>, <i>File</i> ou <i>ArcSDE</i>).</p>
<p>Bem, as <i>class extensions</i> são implementadas através de algumas interfaces especiais e devem ser registradas em uma categoria apropriada (o assunto das categorias de objetos ESRI merece um post sozinho!), <i>GeoObjectClassExtensions</i> para funcionarem e além disso devem ser aplicadas à uma <i>Feature Class</i> ou <i>Table</i> para rodarem apropriadamente. E outra coisa: elas só funcionam com quem possui o código cliente (da <i>Class Extension</i>) instalado na máquina. Para quem não possui o cliente elas se comportam de maneira comum.</p>
<p>Com <i>Class Extensions</i> é possível customizar o inspetor de objetos (aquele carinha utilizado para editar os objetos), customizar a renderização de objetos (isso é poderoso!) e customizar a validação realizada pelo <i>ArcGIS</i> antes da <i>feature</i> receber uma chamada no método Store() (ou seja, antes de ir para o banco);</p>
<p>Existem diversas coisas legais que podemos fazer com estas <i>class extensions</i> e não existe muita dificuldade de implementação (claro, quanto mais requisitos ou quanto mais complexos, mais complicado é de implementar e manter uma CE.).</p>
<p>As <i>CEs</i> podem existes para os seguintes tipos:</p>
<ul>
<li>Features</li>
<li>Rows</li>
<li>Quaisquer tipos derivados de IRow</li>
</ul>
<p>O que isto quer dizer? Bem, tanto tabelas, quanto <i>feature classes</i> e qualquer objeto derivado disto podem ter <i>CEs</i>.</p>
<p>Os requerimentos/limitações para <i>Class Extensions</i> são:</p>
<ul>
<li>Feature classes e tabelas só podem ter uma <i>class extension;</i></li>
<li>A <i>CE</i> precisa ser registrada na categoria apropriada (<i>GeoObjectClassExtensions</i>)</li>
<li>A funcionalidade não está presente no repositório de dados e sim no cliente. Sempre será necessário realizar o <i>deploy</i> de todo o código das <i>CEs</i> em <b>todos</b> os clientes;</li>
</ul>
<p>Não são requerimentos/limitações muito pesadas, portanto é uma alternativa viável para customizações mais complexas do procedimento de edição/criação/deleção de objetos.</p>
<p>Obrigatoriamente, o desenvolvedor <b>precisa implementar as seguintes interfaces</b>: IObjectClassExtension (e IFeatureClassExtension, caso seja uma extensão para <i>feature classes</i>). Neste ponto, nossa <i>CE</i> não tem nenhuma funcionalidade. Ela apenas existe.</p>
<p>Para adicionar funcionalidade, podemos implementar outras interfaces, listadas à seguir:</p>
<ul>
<li>IObjectClassEvents</li>
<li>IObjectClassValidation</li>
<li>IObjectClassInfo</li>
<li>IRelatedObjectClassEvents</li>
<li>IConfirmSendRelatedObjectEvents</li>
<li>IFeatureClassEdit</li>
<li>IFeatureClassDraw</li>
<li>IFeatureClassCreation</li>
<li>IObjectInspector</li>
</ul>
<p>Estas interfaces são opcionais, cada uma oferencendo um pouquinho de funcionalidade customizada. Hoje falaremos sobre IObjectClassEvents, que é uma das interfaces mais comum de se implementar. Ao longo de uma pequena série tentarei demonstrar a funcionalidade de algumas destas interfaces.</p>
<h3>IObjectClassEvents</h3>
<p>Esta interface é responsável por nos fornecer métodos para lidar com os eventos de criação, atualização e deleção de um registro. Pense em uma <i>trigger</i> de um banco de dados. Sempre que o evento disparar, determinado método será disparado em sequência.</p>
<p>Os métodos que devem ser implementados para total aderência ao contrato (a interface <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) são:</p>
<ul>
<li>OnCreate(IObject obj);</li>
<li>OnChange(IObject obj);</li>
<li>OnDelete(IObject obj);</li>
</ul>
<p>Um exemplo de implementação de uma <i>CE</i> com a interface IObjectClassEvents. Note que esta implementação não é completa, ou seja, faltam métodos para o registro da <i>CE</i>, inicialização correta, etc;</p>
<p>Imagine que temos uma tabela log de operação. Nela salvamos os registros relativos às operações realizadas por todos operadores durante o dia. Sua estrutura é a seguinte (em SQL, mas devemos considerar que a tabela está presente em um ambiente ArcGIS - Geodatabases de qualquer tipo);</p>
<pre name="code" class="sql">
CREATE TABLE LOG_OPERACAO(
OBJECTID serial NOT NULL,
NOME_TABELA VARCHAR(100) NOT NULL,
NOME_USUARIO VARCHAR(100) NOT NULL,
TIPO_OPERACAO VARCHAR(20) NOT NULL,
OID_ORIGINAL integer NOT NULL,
DATA_HORA_OPERACAO timestamp NOT NULL default now()
CONSTRAINT LOG_OPERACAO_PK PRIMARY KEY (OBJECTID)
);
</pre>
<pre name="code" class="c#">
    public class LogUsuario:IObjectClassExtension,IObjectClassEvents
    {
        public void OnCreate(IObject obj)
        {
            // vamos adicionar um registro à uma tabela de log de operações
            // precisamos de nosso workspace para abrir a tabela
            IFeatureWorkspace workspace = ((IDataset)obj.Class).Workspace;
            ITable logTable = workspace.OpenTable("LOG_OPERACAO");

            // só vamos tentar adicionar se a tabela existir no geodatabase!
            if (logTable != null)
            {
                // ok, a tabela existe. caso não existisse, ela seria nula
                // portanto, vamos criar um novo registro
                IRow novoRegistroLog = logTable.CreateRow();

                novoRegistroLog.set_Value(1,((IDataset)obj.Class).Name); // nome da tabela que estamos modificando
                novoRegistroLog.set_Value(1,Environment.UserName); // nome do usuario
                novoRegistroLog.set_Value(2,"INSERCAO"); // tipo da operacao
                novoRegistroLog.set_Value(3,obj.OID); // id no geodatabase
                novoRegistroLog.set_Value(4,DateTime.Now); // data e hora
                novoRegistroLog.Store();
           }
     }

        public void OnChange(IObject obj)
        {
            // vamos adicionar um registro à uma tabela de log de operações
            // precisamos de nosso workspace para abrir a tabela
            IFeatureWorkspace workspace = ((IDataset)obj.Class).Workspace;
            ITable logTable = workspace.OpenTable("LOG_OPERACAO");

            // só vamos tentar adicionar se a tabela existir no geodatabase!
            if (logTable != null)
            {
                // ok, a tabela existe. caso não existisse, ela seria nula
                // portanto, vamos criar um novo registro
                IRow novoRegistroLog = logTable.CreateRow();

                novoRegistroLog.set_Value(1,((IDataset)obj.Class).Name); // nome da tabela que estamos modificando
                novoRegistroLog.set_Value(1,Environment.UserName); // nome do usuario
                novoRegistroLog.set_Value(2,"ATUALIZACAO"); // tipo da operacao
                novoRegistroLog.set_Value(3,obj.OID); // id no geodatabase
                novoRegistroLog.set_Value(4,DateTime.Now); // data e hora
                novoRegistroLog.Store();
           }
     }

        public void OnDelete(IObject obj)
        {
            // vamos adicionar um registro à uma tabela de log de operações
            // precisamos de nosso workspace para abrir a tabela
            IFeatureWorkspace workspace = ((IDataset)obj.Class).Workspace;
            ITable logTable = workspace.OpenTable("LOG_OPERACAO");

            // só vamos tentar adicionar se a tabela existir no geodatabase!
            if (logTable != null)
            {
                // ok, a tabela existe. caso não existisse, ela seria nula
                // portanto, vamos criar um novo registro
                IRow novoRegistroLog = logTable.CreateRow();

                novoRegistroLog.set_Value(1,((IDataset)obj.Class).Name); // nome da tabela que estamos modificando
                novoRegistroLog.set_Value(1,Environment.UserName); // nome do usuario
                novoRegistroLog.set_Value(2,"INSERCAO"); // tipo da operacao
                novoRegistroLog.set_Value(3,obj.OID); // id no geodatabase
                novoRegistroLog.set_Value(4,DateTime.Now); // data e hora
                novoRegistroLog.Store();
           }
     }
}
</pre>
<p>Bem, este é um exemplo de implementação da interface IObjectClassEvents. Poderiamos ter deixado o código muito mais limpo (escrevendo uma função à parte para a criação de um registro na tabela de log, por exemplo) e implementado outras funcionalidades. O que importa é que você já sabe como implementar algumas funcionalidades extras dentro do <i>ArcGIS</i>. Lembrando que para esta <i>CE</i> funcionar precisamos aplicar a mesma à uma <i>feature class</i>. Para aplicar uma <i>class extension</i> programaticamente, preciso utilizar algo similar à isto:</p>
<pre name="code" class="c#">
public void ChangeClassExtension(IObjectClass objectClass, String extensionUID,IPropertySet extensionProperties)
{
    ISchemaLock schemaLock = (ISchemaLock)objectClass;

    try
    {
        // Attempt to get an exclusive schema lock.
        schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);

        // Cast the object class to the IClassSchemaEdit2 interface.
        IClassSchemaEdit2 classSchemaEdit = (IClassSchemaEdit2)objectClass;

        if (!extensionUID.Equals(""))
        {
            // Create a unique identifier (UID) object and change the extension.
            UID extUID = new UIDClass();
            extUID.Value = extensionUID;
            classSchemaEdit.AlterClassExtensionCLSID(extUID, extensionProperties);
        }
        else
        {
            // Clear the class extension.
            classSchemaEdit.AlterClassExtensionCLSID(null, null);
        }
    }
    catch (COMException comExc)
    {
        throw new Exception("Could not change class extension.", comExc);
    }
    finally
    {
        schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
    }
}
</pre>
<p>Este <i>snippet</i> de código tirado da documentação da <i><b>EDN (ESRI Developer Network)</b></i>, instalado junto com o <i>SDK</i> faz as seguintes operações:</p>
<ol>
<li>Tenta assumir um <i>lock</i> <b>exclusivo</b> sobre a <i>ObjectClass</i> (veja a interface IObjectClass);</li>
<li>Converte a <i>object class</i> para um <i>class schema edit</i> (veja IClassSchemaEdit2), para poder acessar os membros (métodos e propriedades) de edição;</li>
<li>Acha a extensão através do código GUID (é o carinho que se vê como um atributo de classe, localizado acima da declaração comum de classe, no seu projeto do <i>Visual Studio</i>;</li>
<li>Altera a <i>class extension</i>;</li>
<li>Libera o <i>lock</i> exclusivo (feito na chamada <i>finally</i> para termos garantia que o <i>lock</i> não ficará por lá, atoa);</li>
</ol>
<p>O que acharam pessoal? Não é exatamente um bixo de sete cabeças, mas precisamos aprofundar nos <i>ArcObjects</i> para ter sucesso na implementação de <i>class extensions</i> úteis. O exemplo fornecido é bobo, pode ter utilidade, mas existem milhares de possibilidades com esses diabinhos. Vários produtos de nível corporativo (soluções de energia, da Miner&#038;Miner por exemplo), apostam pesado na customização de <i>feature classes</i> como saída  para problemas <b>complexos</b>.</p>
<p>Tentem brincar um pouquinho com as <i>class extensions</i>. É bem divertido e rende um trabalho interessante.</p>
<p>Vou ficar por aqui!</p>
<p>Um abraço,</p>
<p>George R. C. Silva
</p></div>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/02/arcobjects-e-class-extensions-2/' rel='bookmark' title='Permanent Link: ArcObjects e Class Extensions #2'>ArcObjects e Class Extensions #2</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/03/padro-de-projeto-activerecord-e-arcobjects/' rel='bookmark' title='Permanent Link: Padr&atilde;o de Projeto ActiveRecord e ArcObjects'>Padr&atilde;o de Projeto ActiveRecord e ArcObjects</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/cascading-class-extensions/' rel='bookmark' title='Permanent Link: Cascading Class Extensions'>Cascading Class Extensions</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VideoAula &#8211; ArcGIS 9.3 &#8211; Elementos de mapas e layout</title>
		<link>http://blog.geoprocessamento.net/2010/10/videoaula-arcgis-9-3-elementos-de-mapas-e-layout/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=videoaula-arcgis-9-3-elementos-de-mapas-e-layout</link>
		<comments>http://blog.geoprocessamento.net/2010/10/videoaula-arcgis-9-3-elementos-de-mapas-e-layout/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 19:38:30 +0000</pubDate>
		<dc:creator>Alex Tinoco</dc:creator>
				<category><![CDATA[Alex Tinoco]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[video aula]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=994</guid>
		<description><![CDATA[Hoje instalei um software para capturar a tela de trabalho e fiz uma vídeo aula para vocês. Nesse vídeo abordei ferramentas básicas de edição de mapas tais como: legenda, grid, operações gráficas, orientação de página, etc. Para pedidos de tutorial favor deixar um comentário. Abraços, Alex Tinoco. Related posts:Brincando com ArcObjects #2 ArcGIS Online recebe [...]


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/2011/07/arcgis-online-recebe-grande-atualizacao/' rel='bookmark' title='Permanent Link: ArcGIS Online recebe grande atualização'>ArcGIS Online recebe grande atualizaçã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>Hoje instalei um software para capturar a tela de trabalho e fiz uma vídeo aula para vocês.</p>
<p>Nesse vídeo abordei ferramentas básicas de edição de mapas tais como: legenda, grid, operações gráficas, orientação de página, etc.</p>
<p style="text-align: left;">Para pedidos de tutorial favor deixar um comentário.</p>
<p style="text-align: left;">Abraços, Alex Tinoco.</p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/8EZMxKsGAtY" /><embed type="application/x-shockwave-flash" width="425" height="350" src="http://www.youtube.com/v/8EZMxKsGAtY"></embed></object></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/2011/07/arcgis-online-recebe-grande-atualizacao/' rel='bookmark' title='Permanent Link: ArcGIS Online recebe grande atualização'>ArcGIS Online recebe grande atualizaçã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/10/videoaula-arcgis-9-3-elementos-de-mapas-e-layout/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Integração CAD/GIS</title>
		<link>http://blog.geoprocessamento.net/2010/10/integracao-cadgis/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=integracao-cadgis</link>
		<comments>http://blog.geoprocessamento.net/2010/10/integracao-cadgis/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 04:19:32 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[ArcSDE]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[ESRI]]></category>
		<category><![CDATA[PLTS]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=992</guid>
		<description><![CDATA[Boa noite pessoal, Faz um tempo que não apareço, mas é por um bom motivo. Estou completamente atolado de trabalho e tenho passado a maior parte de meus dias em Manaus. É uma ótima cidade, apesar do calor que vem fazendo e das constantes quedas de energia que sofremos no escritório. Esquenta, ligam mais ar-condicionados, [...]


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/2011/03/padro-de-projeto-activerecord-e-arcobjects/' rel='bookmark' title='Permanent Link: Padr&atilde;o de Projeto ActiveRecord e ArcObjects'>Padr&atilde;o de Projeto ActiveRecord e ArcObjects</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/' rel='bookmark' title='Permanent Link: ArcObjects e Class Extensions #1'>ArcObjects e Class Extensions #1</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Boa noite pessoal,</p>
<p style="text-align: justify;">Faz um tempo que não apareço, mas é por um bom motivo. Estou completamente atolado de trabalho e tenho passado a maior parte de meus dias em Manaus. É uma ótima cidade, apesar do calor que vem fazendo e das constantes quedas de energia que sofremos no escritório. Esquenta, ligam mais ar-condicionados, a rede não aguenta e todo mundo fica sem luz e sem ar. É divertido ver como essas coisas funcionam <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> .</p>
<p style="text-align: justify;">Hoje gostaria de falar um pouquinho sobre as dificuldades da integração de produtos CAD com SIGs ou <em>GIS</em>s. É um assunto, como sempre, extenso, mas como está me tomando um bocado de tempo, achei que seria bastante apropriado comentar alguma coisa sobre isso.</p>
<p style="text-align: justify;">Gostaria de começar explicitando que o CAD é um excelente programa: <strong>para o que ele foi construído</strong>. Ele não foi desenvolvido para construção ou armazenamento de feições geográficas. O CAD é um programa de <strong>desenho e apenas isso.</strong> Ele entende o básico, pontos, linhas, polígonos e anotações. Não tem a menor idéia de <strong>semântica.</strong> Quando digo semântica, ele não compreende o que cada linha significa ou o que pode ser. O <em>GIS</em> também não é muito esperto neste ponto, mas o número de regras de negócio que podem ser representadas é maior e mais consistente.</p>
<p style="text-align: justify;">Então imaginem, um projeto enorme, que requer que se levante uma área extensa, tudo feito em CAD. O CAD dá produtividade, é mais fácil de arrumar mão de obra, por aí vai. Tudo bem, mas quando chegamos na parte de conversão de dados para o <em>ArcGIS</em> ou qualquer outro software, ficamos em uma saia justíssima. Porque?</p>
<ul>
<li style="text-align: justify;">As plantas em CAD <strong>em geral</strong> são mal construídas. Isto significa que veremos muitos polígonos não fechados, vértices duplicados em uma mesma linha, <em>self-intersections</em> (é quando dentro de um polígono ou uma linha, temos uma auto-inteseção, a geometria se cruza - gerando um erro difícil de detectar e causador de inúmeros problemas, como no cálculo de área);</li>
<li style="text-align: justify;">Plantas em CAD <strong>sempre</strong> terão <strong>inúmeras versões</strong>. Mas muitas mesmo. Não estou falando de três ou quatro. São três ou quatro - por dia. Pelo menos <strong>uma por usuário</strong> trabalhando na mesma área geográfica.</li>
<li style="text-align: justify;">Os objetos CAD (pontos, linhas e polígonos) não possuem atributos. É difícil identificá-los unicamente num mar de geometrias. Dependemos unicamente de <em>labels</em> estrategicamente posicionados e milhares de <em>joins</em> espaciais para tentar identificar um objeto corretamente.</li>
</ul>
<p>Bem, estes são alguns dos problemas que existem em ambientes mistos, mas temos de tolerá-los, correto?</p>
<p>A melhor maneira de lidar com este <em>workflow</em> é a criação de um <em>modelbuilder</em> (quando estamos falando de <em>ArcGIS</em>, claro) ou algum <em>script</em> esperto em Python para cuidar dos detalhes chatos.</p>
<p style="text-align: justify;">Foi o que fizemos, mas outros problemas de gerenciamento de dados e <em>workflow</em> nos deram bastante trabalho. Mas está tudo mudando - existe uma salvação! ArcSDE ao resgate. Apesar do que dizem, que <em>geodatabases</em> são lentos, difíceis de se trabalhar, etc. montamos um <em>mini</em> ambiente em menos de um dia e conseguimos colocar todo mundo trabalhando em cima de uma pequena máquina DELL - que já conseguiu seu próprio no-break e vou pedir mais alguns GB de RAM nesta semana.</p>
<p style="text-align: justify;">Mudou de ambiente, mudou de problema, mas pelo menos é um problema que eu consigo resolver com trabalho de máquina <img src='http://blog.geoprocessamento.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> , ao invés de trabalho "braçal".</p>
<p style="text-align: justify;">Até comecei um pequeno novo projeto para ajudar nas (infinitas) correções dos problemas CAD. Estou montando uma pequena extensão do ArcMap para gerenciar usuários e correções, com áreas assinaladas à usuários, prazos, entre outras coisinhas mais para facilitar a (nossa) vida. Por ser um projeto da empresa, não posso comentar, mas vou dando pequenos detalhes assim que possível (o ArcMap já possui uma extensão oficial da ESRI para cuidar disso, é a PLTS - <em>Production Line Tool Set</em> - mas como não preciso de todos os recursos e não tenho tempo ($) para isso, vou criar uma coisinha mais simples).</p>
<p style="text-align: justify;">Bem pessoal, vou nessa. Amanhã é preto na folhinha.</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/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/2011/03/padro-de-projeto-activerecord-e-arcobjects/' rel='bookmark' title='Permanent Link: Padr&atilde;o de Projeto ActiveRecord e ArcObjects'>Padr&atilde;o de Projeto ActiveRecord e ArcObjects</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/12/arcobjects-e-class-extensions-1/' rel='bookmark' title='Permanent Link: ArcObjects e Class Extensions #1'>ArcObjects e Class Extensions #1</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.geoprocessamento.net/2010/10/integracao-cadgis/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Usando Python e o geoprocessing framework #2</title>
		<link>http://blog.geoprocessamento.net/2010/07/usando-python-e-o-geoprocessing-framework-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=usando-python-e-o-geoprocessing-framework-2</link>
		<comments>http://blog.geoprocessamento.net/2010/07/usando-python-e-o-geoprocessing-framework-2/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 18:44:39 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[Banco de Dados Geográficos]]></category>
		<category><![CDATA[Geo Aplicado]]></category>
		<category><![CDATA[Geoprocessamento]]></category>
		<category><![CDATA[Python]]></category>

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


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

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

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

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

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

        self.buildGeoprocessorOptions(toolboxList)

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

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

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

# para acessar o geoprocessor do nosso wrapper, use:

listaDeFeatureClasses = g.gp.ListFeatureClasses()

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

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

        self.geoprocessorWrapperClass = geoprocessor

        self.inputShapefile = inputShapefile

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

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

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

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

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

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

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

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

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

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

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

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


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2010/06/python-geoprocessing-framework1/' rel='bookmark' title='Permanent Link: Usando Python e o Geoprocessing Framework #1'>Usando Python e o Geoprocessing Framework #1</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/01/python-pt2/' rel='bookmark' title='Permanent Link: #Python &#8211; pt2'>#Python &#8211; pt2</a></li>
<li><a href='http://blog.geoprocessamento.net/2010/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/07/usando-python-e-o-geoprocessing-framework-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ArcGIS 10 disponível para venda</title>
		<link>http://blog.geoprocessamento.net/2010/07/arcgis-10-disponivel-para-venda/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=arcgis-10-disponivel-para-venda</link>
		<comments>http://blog.geoprocessamento.net/2010/07/arcgis-10-disponivel-para-venda/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 03:45:53 +0000</pubDate>
		<dc:creator>George Rodrigues da Cunha Silva</dc:creator>
				<category><![CDATA[George Silva]]></category>
		<category><![CDATA[ArcGIS]]></category>
		<category><![CDATA[ArcGIS 10]]></category>
		<category><![CDATA[ArcPy]]></category>
		<category><![CDATA[ESRI]]></category>

		<guid isPermaLink="false">http://blog.geoprocessamento.net/?p=877</guid>
		<description><![CDATA[Boa noite pessoal! O ArcGIS 10 finalmente foi lançado para venda oficialmente durante esta semana. Nos Estados Unidos, pelo menos. O novo ArcGIS promete muita coisa, ArcCatalog integrado com ArcMap, capacidade de edição em três dimensões (dentro do ArcMap!), entre outras coisinhas bastante interessantes. Temos agora uma nova API para programação em Python, a ArcPy, [...]


Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/arcgis-online-recebe-grande-atualizacao/' rel='bookmark' title='Permanent Link: ArcGIS Online recebe grande atualização'>ArcGIS Online recebe grande atualização</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #1'>Diquinhas de ArcGIS #1</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 style="text-align: justify;">Boa noite pessoal!</p>
<p style="text-align: justify;">O ArcGIS 10 finalmente foi lançado para venda oficialmente durante esta semana. Nos Estados Unidos, pelo menos.</p>
<p style="text-align: justify;">O novo ArcGIS promete muita coisa, ArcCatalog integrado com ArcMap, capacidade de edição em três dimensões (dentro do ArcMap!), entre outras coisinhas bastante interessantes.</p>
<p style="text-align: justify;">Temos agora uma nova API para programação em Python, a ArcPy, que pelo visto é bastante poderosa. Criaram novas classes, interfaces e funcionalidades, incluindo a capacidade de automatizar a produção de mapas com Python - o que é uma excelente notícia.</p>
<p style="text-align: justify;">A ESRI já até mudou a cara do site deles para o anúncio. Aqui temos <a rel="nofollow" target="_blank" href="http://www.esri.com/software/arcgis/arcgis10/index.html" target="_blank">um link</a> com as novas funcionalidades.</p>
<p style="text-align: justify;">George</p>


<p>Related posts:<ol><li><a href='http://blog.geoprocessamento.net/2011/07/arcgis-online-recebe-grande-atualizacao/' rel='bookmark' title='Permanent Link: ArcGIS Online recebe grande atualização'>ArcGIS Online recebe grande atualização</a></li>
<li><a href='http://blog.geoprocessamento.net/2011/07/diquinhas-de-arcgis-1/' rel='bookmark' title='Permanent Link: Diquinhas de ArcGIS #1'>Diquinhas de ArcGIS #1</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/07/arcgis-10-disponivel-para-venda/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&#038;utm_medium=rss&#038;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>
	</channel>
</rss>

