Modelação Geográfica, Cidades e Ordenamento do Território

Grupo integrado no e-GEO – Centro de Estudos de Geografia e Planeamento Regional

Scripts no SEXTANTE

Leave a comment

Num post anterior, descrevia como aceder a API do SEXTANTE atraves da consola de Python do QGIS.

Neste post, vou avancar um pouco mais em termos de costumizacao e criar um script para o SEXTANTE. Atraves de scripting podemos:

  • aceder a todas as funcoes expostas pelo SEXTANTE (incluindo thrid-party providers como o R, ou o GRASS)
  • aceder as funcoes que nos acrescentamos ao SEXTANTE (incluindo modelos criados atraves do modeller, ou R scripts)
  • aceder a API do PYQT, ou do Python em geral para criar UI (entre outras coisas)
  • aceder a API do PYQGIS, acedendo a toda a funcionalidade do QGIS.

Reunindo todas estas funcionalidades pode construir-se uma aplicacao bastante poderosa, mas neste post eu vou me ficar por uma demonstracao simples: uma suite de analise exploratoria dos dados, que consiste em chamar tres dos scripts de R que criei anteriormente. Em termos de input/output, a aplicacao unifica a recepcao de parametros para os tres scripts e gera os resultados em ficheiros html, guardados no disco num local definido pelo utilizador.

Para seguir este tutorial nao sao necessarios grandes conhecimentos de Python; no entanto, se decidirem construir os vossos scripts, ja vai ser importante. Neste website podem encontrar sobre python para nao programadores (se souberem programacao, torna-se logo mais facil). Eu gosto deste em particular (from scratch!)

O procedimento para criar um novo script no SEXTANTE, ‘e semelhante ao procedimento para criar scripts de R: expandir a entrada “Scripts->Tools”, na toolbox e escolher “Create new script”.

Image

Automaticamente abrir-se-a uma janela para escrever o codigo, com um botao para escrever/editar o help (em html) e outro para gravar o script. O script sera gravado na folder definida para esse efeito na configuracao do SEXTANTE, com extensao “py” (python). O codigo do script ‘e apresentado abaixo: vamos comenta-lo com detalhe nos paragrafos seguintes.

#Definition of inputs and outputs
#==================================
##[GAM scripts]=group
##input=vector
##sst=field input
##z=field input
##clor=field input
##basefolder=folder

import os
from PyQt4.QtCore import *
from PyQt4.QtGui import *

if basefolder=="":
	QMessageBox.critical(None, "Run tests", "Empty path detected!")
else:
	progress.setPercentage(0)

	progress.setText("initializing outputs...")

	filename1 = os.path.join(basefolder, "correlation.htm")
	filename2 = os.path.join(basefolder, "scatterplot.htm")
	filename3 = os.path.join(basefolder, "plot_z.htm")
	filename4 = os.path.join(basefolder, "plot_sst.htm")
	filename5 = os.path.join(basefolder, "plot_clor.htm")

	progress.setText("running algorithms...")

	sextante.runalg("r:scatterplot",input,filename2)
	progress.setPercentage(20)
	sextante.runalg("r:correlation",input,sst,z,clor,filename1)
	progress.setPercentage(40)
	sextante.runalg("r:plotz",input,filename3)
	progress.setPercentage(60)
	sextante.runalg("r:plotsst",input,filename4)
	progress.setPercentage(80)
	sextante.runalg("r:plotclor",input,filename5)
	progress.setPercentage(100)

	QMessageBox.information(None, "Run tests", "All files were saved in: "  + str(basefolder))

Ate a linha 9, nao temos mais do que definicoes do SEXTANTE. A linha 3 estabelece em que grupo o scripts vai ser listado no menu da toolbox. As linhas 4-8 establecem os inputs a serem usados tanto pelos algoritmos, como pelo proprio SEXTANTE para criar dialogos de input (podem ler o manual do QGIS, para uma descricao mais completa dos tipos de input). A partir da linha 10, temos entao o “corpo” do script,

As linhas 10-12 estabelecem que bibliotecas queremos usar neste script. Podem usar PyQt, PyQGIS, ou qualquer outra biblioteca de Python que tenham instalada (e.g.> os). Embora estejamos a usar a biblioteca do SEXTANTE, nao ‘e necessario importa-la explicitamente para o script, uma vez que o “ambiente de scripting” trata disso (as coisas serao diferentes se corrermos o script na consola de Python, ou fora do QGIS).

Uma vez que um dos parametros do script ‘e a folder onde queremos guardar os resultados, ‘e inutil correr o script se o utilizador nao definir este parametro (ficamos sem resultados). Por este motivo, criamos uma condicao na linha 14, que testa se a path esta vazia. Se esta vazia, continua a correr o script; caso contrario, termina com uma mensagem de erro (linha 15).

As linhas 21-25 estabelecem os nomes onde escreveremos os outputs, utilizando a path estabelecida pelo utilizador. Finalmente as linhas 29, 31, 33, 35 e 37 executam scripts de R, usando os inputs e nomes de outputs como argumentos. Neste tutorial ja vimos como o metodo runalg() expoe cada algoritmo do SEXTANTE (incluindo os definidos pelo utilizador) ao python. Este metodo ‘e muito util nao apenas para chamar third-party algorithms, mas tambem os nossos proprios scripts, de outro de python script (uma especie de programacao “canibalista”). Na sintaxe ‘e necessario apresentar como argumentos: o nome interno do script (tal como aparece descrito pela funcao alglist()), os inputs do script, e os outputs do script (tal como aparece descrito pela funcao alghelp()). Se observarem a chamada do algoritmo na linha 29, verao apresentado como input um layer vectorial guardado numa variavel chamada “input” (linha 4). Como output verao o nome e path de um ficheiro html; ‘e importante frisar que o *metodo runalg() nao abre nenhuns resultados no QGIS*. Se quiserem visualizar os resultados no QGIS, teem de os guardar, e  adicionar manualmente. Na linha 40 (tal como na linha 15) usamos uma classe de PyQt4, para mostrar uma message box com informacao sobre os ficheiros gravados.

Se o script demora um bocado a correr, normalmente ‘e boa ideia mostrar alguma informacao do progresso ao utilizador (nao va ele pensar que o computador “bloqueou”). o SEXTANTE expoe uma variavel chamada progress, com metodos setText() para descrever as operacoes que estao a ter lugar, e setPercentage() para preencher uma proporcao da barra de progresso. Na linha 19 teem um exemplo do setText() e na linha 30, um exemplo do setProgress().

Como ja referi antes, este script ‘e muito simples e quase nao utiliza nenhumas das capacidades espaciais do QGIS, para alem do input de layers. ‘E fortemente recomendavel fazer o browse dos exemplos (na seccao “Scripts->Example scripts” da toolbox) para ter uma ideia de como implementar features mais avancadas.

Depois de gravar o script, este sera automaticamente adicionado ao grupo definido, e podem corre-lo fazendo double-click sobre ele (como com qualquer outro algoritmo do SEXTANTE).

Image

Image

Image

Os resultados serao guardados em ficheiros de html, nas paths definidas pelo utilizador.

Para mais informacao sobre scripting em SEXTANTE, dentro do QGIS, podem consultar a ultima versao do manual do QGIS.

Author: doublebyte

H8ckr, geocoder, traceuse, skateboarder, person...

Deixe uma resposta

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s