quarta-feira, 12 de agosto de 2009

#Python parte 2 - utilizando objetos de geoprocessamento

Buenas pessoal,

Bem, Python, como expliquei no post passado é uma linguagem de alto nível e muito recomendada pela ESRI para se construir modelos de geoprocessamento (semelhantes aos construídos no ModelBuilder) e scripts para processamento de informações.

Primeiro, para quem deseja aprender Python:

python.org e python.org.br

Aqui encontramos algumas coisas fundamentais, como documentação e links para trocar idéias com a comunidade que desenvolve em Python.

Segundo: irc.freenode.net nos canais #python e #python-br . Nestes locais é possível conversar com desenvolvedores brasileiros e internacionais e resolver possíveis dúvidas.

Terceiro: este aplicado a quem quer integrar esta poderosa ferramenta aos seus métodos de trabalho - WebHelp ESRI e WebHelp Esri 2.

Não tenha medo de errar e não tenha medo de buscar ajuda.

Então vamos lá.

Para qualquer coisa que você queira fazer em python, é necessário importar o módulo que cuida dos objetos geográficos da ESRI, o arcgisscripting.

#importando o módulo arcgisscripting
import arcgisscripting

Quando um script .py contém esta instrução (ela deve ser feita no ínicio do seu script), o python deixa a sua disposição os objetos da ESRI. No webhelp você pode encontrar uma descrição ampla de TODOS eles, bem como exemplos.

Certo, mas depois que este módulo está disponível, o que fazemos para começar a mexer com o ArcGIS?

É necessário criar um objeto do tipo geoprocessing, fornecido pelo módulo arcgisscripting. Olhem o exemplo

gp = arcgisscripting.create()
#este método, sem parâmetros serve tanto para 9.2 quanto para 9.3
#para 9.3, é melhor especificar o paramêtro 9.3 e.g.: gp = arcgisscripting.create(9.3)

O que podemos fazer com o Python? Bem, em teoria, tudo o que estiver disponível dentro de uma Toolbox do ArctoolBox também está disponível para o Python. O Python na verdade, consegue fazer qualquer coisa que esteja em uma toolbox e ainda mais!

Lembre-se que o Python contém muitos módulos, como acesso à sítios remotos, módulos para gerenciar emails, matemáticos, FTP, conversores para PDF, acesso à banco de dados (MSSQL, PostgreSQL, SQLite, entre outros), manipuladores XML...ou seja, é muito flexível e extensível.

Para realizarmos operações dentro do ArcGIS, temos que utilizar o módulo sys e geralmente o módulo os, ambos nativos no Python. Hoje não falarei de como construir scripts que rodam à partir do ArcGIS, apenas scripts que rodam diretamente da shell python (alguém conhece alguma utilidade pra isso? acessar objetos geográficos sem abrir o ArcGIS?)

Bem, imaginemos que queremos Projetar ou Definir projeção de diversos itens, ao mesmo tempo:

#projetar diversos shapefiles para uma única projeção
import sys, os, arcgisscripting

Caminho = "C:\\Pasta\\Shapefiles\\"
#no Python, temos de duplicar as barras, pois uma barra \ é interpretada como alguns
#caracteres especiais, como nova linha, tabulação, entre outros

gp = arcgisscripting.create(9.3)

#vamos projetar shapefiles/featureclasses. temos de utilizar
#as toolboxes correspondentes, entao vamos adicioná-las

gp.AddToolbox("C:\\CaminhoAtéAToolbox\\Nome da Toolbox.tbx")

#podemos adicionar tantas toolboxes quanto precisarmos
#só devemos lembrar que mesmo através de scripts Python, as licensas de extensões
#SÃO CHECADAS. se você não tiver o spatial analyst, o Python irá dar um chilique

gp.Workspace = Caminho
#vamos definir o workspace. No ArcGIS + Python, muita coisa depende do workspace.
#ele é basicamente um apontamento para o diretório correto.

ListaShapefiles = gp.ListDatasets("*","ALL")
#vamos criar um objeto do tipo lista, e inserir nela todos os objetos do arcgis.
#os parametros "*" e "ALL" está dizendo para o ArcGIS inserir na lista todos
#os objetos, sem especificação de tipo (que podem ser Feature, TIN, Raster e CAD)

print ListaShapefiles
#me mostre o que será projetado

projecao = "C:\\CaminhoAteAProjecao\\Projecao.prj"

for Shapefile in ListaShapefiles:
----gp.Project_management(Shapefile,Shapefile+"_projetado",projecao)
----print "Projetei " + Shapefile

#considere os quatro - como uma identação, um toque na tecla tab (o blog está engolindo os espaços)
#fim

Este script é bem simples, deve ser salvo como .py, e ser rodado através da shell python ou com dois cliques no mesmo (desde que o Python esteja devidamente e corretamente instalado).

Algumas notas no entanto: note a forma que duplicamos as barras. Se você utilizar somente uma barra o Python não conseguirá achar os caminhos corretamente.

Os nomes de saída da função project são Shapefile_projetado.

A identação no trecho "gp.Project_management..." é PROPOSITAL E DEVE ESTAR LÁ. SEM ELA O SCRIPT NÃO FUNCIONARÁ. O Python usa a identação obrigatória como forma de controle de código.

Não se esqueça, tudo o que vem depois de # é considerado pelo Python um comentário, não influenciando no programa.

Note que para projetar uma pasta/set de shapefiles diferentes, temos que alterar a variável Caminho, lá em cima. O que podemos fazer para dinamizar esta questão? Como podemos perguntar ao usuário qual é a pasta que precisamos projetar? E a projeção, como definir ela dinamicamente? Essa fica de dever de casa :P

E agora senhores, o que podemos fazer com Python? Podemos utilizar todas as Toolboxes do ArcGIS para realizar milhares de operações com diversos shapes/featureclasses, e até mesmo cosntruir modelos complexos, do tipo que vemos em ModelBuilder, simulando eventos.

Vamos aprender Python?

5 comentários:

  1. George,

    Acho excelente a temática que estás a abordar neste teu blog! Já existem muitos (e alguns muito bons) blogs abordando questões de geoprocessamento de nível básico e intermédio, mas este é o primeiro que eu conheço (pelo menos em portugues) a abordar estas questões de desenvolvimento sobre ArcGIS, ainda para mais com linguagem de scripting, o que permite agilizar muitas tarefas, como é o caso do exemplo neste post!

    Podes contar com as minhas vizitas frequentes! ;)

    Abraço!

    Pedro
    Portugal

    ResponderExcluir
  2. Olá George!

    Quando vai postar a solução para o dever de casa?! :)

    No aguardo!

    Parabéns!

    ResponderExcluir
  3. Olá anônimo. Vou postar amanhã a solução. Não tinha visto teu comentário antes. Mas e aí, conseguiu pensar em algo?

    ResponderExcluir
  4. Olá George,
    Vou dar uma opinião sobre tua pergunta
    "...scripts que rodam diretamente da shell python (alguém conhece alguma utilidade pra isso? acessar objetos geográficos sem abrir o ArcGIS?..."

    Não necessáriamente vc pode querer utilizar um script pra rodar um determinado processo e imediatamente ver o resultado. Existem sistuações onde as etapas de processamento ja estão tão bem consolidadas que vc pode seguir por vários passos sem necessidade de verificar o resultado.

    Como exemplo, cito o processo de geração de focos de queima da vegetação que desenvolvemos aqui no INPE. Depois que os Satélites enviaram os dados e as imagens já estão disponíveis, então automaticamente um conjunto de scripts feitos em CShell inciam a rodar os Algorítimos.

    A implementação vária um pouco conforme o Satélite mais temos várias rotinas escritas em diferentes linguagens, Fortran, C, C++, e mais recentemente tenho migrado algumas para Python.

    O mais importante desta história é que podemos sim ter necessidades específicas de correr os processos, principalmente em sistemas corporativos e/ou em servidores que suportam ambientes web.

    Estou gostando muito do tema e pretendo semear uma idéia aqui, que tal extender-mos estas discussões propondo exercícios e buscando soluções. Da mesma forma que vc fez neste post?

    ResponderExcluir
  5. Então Fabiano.

    Justamente isso! Os scripts que tenho sugerido rodam diretamente do shell do python ou do DOS. Não é necessário abrir o ArcGIS para rodá-los.

    Em todo caso é isto que queria dizer! ahaha.

    Poxa Fabiano, será que posso conhecer a estrutura que estão utilizando aí? Os scripts executam através de agendamentos? Vou te mandar um email :P

    Abraços

    ResponderExcluir