Você está na página 1de 13

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio

Introduo programao em SIG


Ano letivo 2014/2015

Faculdade de Letras

Definio de reas potenciais para a construo de novas linhas frreas no Norte e


Centro de Portugal usando a linguagem Python
Palavras Chave: Python, Arcpy, Toolbox, ArcGis, Script, Spatial Analysis
Trabalho elaborado por: Antnio Jos Silva, Jos Antnio Teixeira e Luciano Duarte
Docentes: Ricardo Baptista, Antnio Coelho e Daniel Catalo
Maio 2015

Introduo, Metodologia e Objetivos:


No mbito da unidade curricular de Introduo programao em SIG do
Mestrado de Sistemas de Informao Geogrfica e Ordenamento do Territrio foi
proposto aos discentes o desenvolvimento de uma biblioteca Python capaz de
executar um conjunto de operaes especficas e o tratamento de modelos digitais de
terreno que permitam a definio do traado de uma nova linha frrea. Para a criao
desta biblioteca foi sugerido que se recorresse biblioteca Arcpy integrada no
software ArcGis 10.1. Todo o cdigo foi criado, desenvolvido e testado na Software
Eclipse.
Como dados de partida foram fornecidos os ficheiros referentes altimetria,
CAOP, linhas frreas nacionais, estaes de comboio e COS em formato shapefile. A
regio de estudo o Norte e Centro de Portugal Continental, mas a biblioteca foi
elaborada com o intuito de operar sobre quaisquer outros conjuntos de dados
altimtricos referentes a outras regies do pas.
A forma como projectamos o script inicialmente tinha o objectivo de
construirmos apenas um script e respectiva toolbox, no entanto ao longo do projeto
surgiram alguns prolemas e erros diferentes de computador para computador, sendo
assim decidimos dividir o script em duas partes e em duas toolbox e desta forma
melhoramos a velocidade de processamento dos dados e conseguimos obter os
resultados finais.
Funcionalidades e Detalhes do Programa
Na primeira parte do programa foram importadas todas as bibliotecas
necessria para que funcionassem todas as operaes, como por exemplo operaes
do ArcGis/ArcPy, do Sistema Operativo, a capacidade de fazer listas virtuais e updates.
Pgina | 1

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

Tambm importa realar que nas duas primeiras linhas foi introduzido um cdigo que
permite ao software ler expresses com acentos e cedilhas.
#!/usr/bin/env python
#-*- coding: utf-8 -*import arcpy, os, shutil
from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor

De seguida procedemos definio dos caminhos para as diferentes pastas: a


pasta dos dados originais, a dos resultados intermdios e a dos resultados finais.
Definimos dois parametros para a Toolbox, o primeiro reflete a area de trabalho onde
sero criadas as pastas de processamento, tabela e resultados final, e o segundo
define a pasta onde esto os ficheiros originais. Nesta parte tambm procedemos
verificao se as duas pastas de resultados existem e no caso de existirem apagar todo
o seu contedo. Isto permite que o programa corra vrias vezes sem estar a repetir
informao ou com nomes de ficheiro iguais que iria fazer com que o processamento
encravasse.
CaminhoR=arcpy.GetParameterAsText(0)
Caminho=arcpy.GetParameterAsText(1)
CaminhoOut= CaminhoR + "\\DadosIntermedios"
CaminhoDest=CaminhoR+"\\DadosFinais"
CaminhoTab=CaminhoR + "\\Tabela Excel(GDB)\\DadosPopINE2011.dbf"
VerificarPasta(CaminhoOut, "Intermedios")
VerificarPasta(CaminhoDest, "Finais")
VerificarPasta(CaminhoR + "\\Tabela Excel(GDB)\\DadosPopINE2011.dbf")
arcpy.env.workspace = Caminho
env.overwriteOutput= True

Como temos trs verificaes e para no estar a repetir cdigo, criamos uma
funo no inicio do script que verifica se a pasta existe, se existir elimina-a, se no
existir cria uma pasta nova:
def VerificarPasta(Caminho, Dados):
if os.path.exists(Caminho):
shutil.rmtree(Caminho)
os.mkdir(Caminho)
arcpy.AddMessage("Pasta Dados "+ Dados + " vazia.")
else:
os.mkdir(Caminho)
arcpy.AddMessage("Pasta Dados criada.")

De seguida tnhamos de definir o sistema de coordenadas para as shapefiles


que no tinham projeo, ou seja, vinham sem o ficheiro .prj. Para isso preciso que
o programa encontre e reconhea as Feature Class que no tinham sistema de
projeo. Por isso criamos uma nova funo, que recebe um caminho, uma lista com
Pgina | 2

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

valores e uma lista vazia, utilizando o ciclo for vamos percorrer todos os valores da
lista e com aliando os.path.basename conseguimos seguido do splitext obtemos o
nome do ficheiro sem a terminaao correspondente ao tipo de ficheiro. Este nome vai
ser guardado na lista vazia. Tivemos de criar duas listas de entrada, numa lista esto
contidas todas as .shp e na outra todos os .prj, desta maneira, executando um ciclo for
de verificaao sempre que ele encontra dois nomes iguais (shp+prj) ele apaga o valor
da lista e vai apenas deixar na lista o nome dos ficheiros shp que no tm sistema de
coordenadas (pois no encontrou o seu homnimo .prj).
Assim utilizando uma nova condiao, se a lista tiver resultados fazemos logo um
Define Projection para esses ficheiros, caso contrario emite uma mensagem que diz
que todos os ficheiros tem sistema de coordenadas, como a priori sabiamos que
tinhamos ficheiros sem sistema de coordenadas procedemos a sua definiao sendo o
sistema de coordenas utilizado o Lisboa Hayford Gauss IGeoE, decidimos fazer um
parametro desta condio nesta Toolbox para o utilizador poder definir o sistema de
coordenadas em falta nos elementos.
def CorrerListaReterNome(Cam,Lista,ListaOut):
for i in Lista:
NFicheiro=os.path.basename(Cam + "\\" + i)
lfi= os.path.splitext(NFicheiro)[0]
ListaOut.append(lfi)
LFprj= ListFiles("*.prj")
LFCprj=ListFeatureClasses()
listaprj1=[]
listaprj2=[]
CorrerListaReterNome(Caminho,LFprj,listaprj1)
CorrerListaReterNome(Caminho,LFCprj,listaprj2)
for n in listaprj1:
for nn in listaprj2:
if n == nn:
listaprj2.remove(nn)
if len(listaprj2)!= 0:
arcpy.AddMessage("Os Ficheiros "+ str(listaprj2)+" nao tem projecao.")
#Definir a projecao dos dados:
CoordSys=arcpy.GetParameterAsText(2)
for elemento in listaprj2:
arcpy.DefineProjection_management(elemento+".shp", CoordSys)
arcpy.AddMessage("Adicionada Projecao aos Ficheiros que nao tinham
Sistema de Coordenadas.")
else:
arcpy.AddMessage("Todos os ficheiros tem projecao.")

O prximo passo foi projetar os dados para o sistema de referncia European


Terrestrial Reference System1989. Para isso voltamos a usar o ciclo for para que a
Pgina | 3

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

cada feature class da pasta ele fizesse um Project. O sistema de coordenadas


tambem um parametro que achamos importante pois assim o utilizador pode
escolher o sistema de coordenadas que pretende.
OutCoordSys = arcpy.GetParameterAsText(3)
LFCOr= ListFeatureClasses()
for fc in LFCOr:
arcpy.Project_management(fc, CaminhoOut + "\\PRJ_" + fc, OutCoordSys)
arcpy.AddMessage("Project da feature "+ fc + " realizado.")

A prxima tarefa foi agrupar os ficheiros shapefile da CAOP com dados


tabulares das tabelas do INE para calcular a densidade populacional. Como a CAOP
vinha dividida em freguesias e os dados tabulares estavam por municpio era
necessrio fazer um Dissolve mas antes de usar esta ferramenta adicionamos um
campo para calcular o DICO, ou seja, o cdigo dos municpios sem os dois ltimos
algarismos das freguesias para ser coincidente com o cdigo da tabela e assim fazer o
Join. Esse campo foi definido como sendo de texto para coincidir com a tabela.
Um outro passo preliminar, antes do Join foi converter a tabela do Excel para uma
tabela do formato .dbf.
#Fazer o Dissolve da CAOP e calcular o campo para o Join
arcpy.env.workspace = CaminhoOut
arcpy.AddField_management(CAOP, "DICO", "TEXT", "", "", "", "", "NULLABLE")
arcpy.CalculateField_management(CAOP, "DICO", "LEFT([DICOFRE],4)", "VB")
arcpy.Dissolve_management(CAOP,"CAOP2014_Concelhos.shp",["DICO","Municipio"],
[["Area_T_Ha", "SUM"], ["Distrito", "FIRST"]])
arcpy.AddMessage("Dissolve executado")
#apenas na versao 10.2
arcpy.ExcelToTable_conversion("F:\\TrabalhoPratico_IPSIG\\DadosOriginais\\INE
_DadosPopulacionais_Concelhos_2011.xls", "F:\\TrabalhoPratico_IPSIG\\Tabela
Excel(GDB)\\" + "DadosPopINE2011.dbf", "TabelaFinal")
#Fazer o Join da CAOP com os dados da tabela
arcpy.JoinField_management("CAOP2014_Concelhos.shp", "DICO", CaminhoTab,
"dico")
arcpy.AddMessage("Join executado")

Como o nosso objetivo era trabalhar sobre os dados da regio Norte e Centro
foi necessrio preparar a shapefile para o clip definindo os limites desta mesma regio
no entanto como este script o utilizado na Toolbox e como queremos que seja
possivel ao utilizador escolher a area para obteno de resultados trabalhamos um
pouco os dados para que atravs de uma expressao SQL fosse possivel definir a area.
O primeiro passo passou por criar uma funao que recebe um texto e uma lista,
o texto refere-se Area e a lista contem os municipios que pertencem a esta NUT. a
funao cria um feature layer para cada municipio e guarda numa lista, depois
Pgina | 4

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

procedendo ao merge dessa lista ficamos com a Area, depois adicionamos um campo a
essa Feature Classe e calculamos o campo para que fique com o valor da NUT. No final
faz-se o merge de todas estas NUT e voltamos a ficar com um Shapefile do pais inteiro.
def FCalculator(Area, Lista):
MunList=[]
for elem in Lista:
AreaIn= elem + ".lyr"
AreaOut = str(Area) + ".shp"
Field = "NUT"
arcpy.MakeFeatureLayer_management(CAOP, AreaIn, '"Distrito" LIKE ' +
"'" + elem + "'",CaminhoOut)
MunList.append(AreaIn)
arcpy.Merge_management(MunList, CaminhoOut + "\\" + AreaOut)
arcpy.AddField_management(AreaOut, Field, "TEXT", "", "", "", "",
"NULLABLE")
arcpy.CalculateField_management(AreaOut, Field, '"' + Area + '"' , "VB")
arcpy.AddMessage("Feature Classe "+Area+ " exportada")
#Preparar a shp para o clip
arcpy.env.workspace = CaminhoOut
CAOPFeat="CAOP_Merge.shp"
Norte = ["BRAGA","VIANA DO CASTELO", "PORTO", "VILA REAL", "BRAGAN%"]
Centro = ["AVEIRO", "VISEU", "GUARDA", "COIMBRA", "CASTELO BRANCO", "LEIRIA"]
Lisboa=["LISBOA","SET%"]
Alentejo=["SANTAR%", "PORTALEGRE", "%VORA", "BEJA"]
Algarve = ["FARO"]
FCalculator("Norte", Norte)
FCalculator("Centro", Centro)
FCalculator("Lisboa", Lisboa)
FCalculator("Alentejo", Alentejo)
FCalculator("Algarve", Algarve)
arcpy.Merge_management(["Norte.shp","Centro.shp","Lisboa.shp","Alentejo.shp",
"Algarve.shp"], CaminhoOut + "\\"+ CAOPFeat)
arcpy.Dissolve_management(CAOPFeat,"CAOP2014_Concelhos.shp",["DICO","Municipi
o","NUT"] [["Area_T_Ha", "SUM"], ["Distrito", "FIRST"]])
arcpy.AddMessage("Dissolve executado")

O proximo parametro corresponde a expressao que o utilizador vai inserir, esta


expressao servira de critrio para o Select by Atributes e depois de exportar para uma
nova feature e depois de feito o dissolve servir de shapefile para o Clip. Depois
procede-se ao clip de todas as Feature Classes que estao na pasta de Dados
intermdios, excesso da Feature dos prprios Limites e a Feature de Altimetria.
#Area Norte e Centro para fazer Clip das features
EscUtiliz= arcpy.GetParameterAsText(6)
MOut="LAdmin.shp"
SByAtributes("Feature", "lAdmin.lyr", "CAOP2014_Concelhos.shp",
"NEW_SELECTION", EscUtiliz, CaminhoOut, MOut)
arcpy.Dissolve_management(MOut, "Limites.shp")
#Clean up feature layers
arcpy.Delete_management(MOut)
arcpy.AddMessage("Feature Class Limites Criada")

Pgina | 5

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

#Fazer o Clip das Features:


shpClip="Limites.shp"
LFCInt= ListFeatureClasses()
clipFeature=CaminhoOut +"\\"+ shpClip
for fcInt in LFCInt:
if fcInt != Altimetria and fcInt != shpClip:
arcpy.Clip_analysis(fcInt, clipFeature, CaminhoOut +"\\Clip_"+fcInt)
arcpy.AddMessage("Clip da feature "+ fcInt + " realizado.")
arcpy.AddMessage("Clip Executado")

Agora que temos a rea delimitada regio Norte e Centro podemos proceder
anlise propriamente dita. Recorrendo Carta de Ocupao do Solo de 2007,
selecionamos as reas potenciais de indstria e comrcio (como o Nvel 2 definido
como 1.2) e exportmo-las.
AIndeCom= "Areas_IndeCom.shp"
SByAtributes("Feature","AreasPotenciais.Lyr","Clip_PRJ_COS2007N2.shp",
"NEW_SELECTION", '"COSN2" = \'1.2\'',CaminhoOut, AIndeCom)
arcpy.AddMessage("Areas Potenciais de Industria e Comercio exportadas")

De seguida tnhamos de calcular a densidade populacional dos concelhos.


Primeiro foi necessrio calcular o valor da rea por km2 pois o campo originalmente
vinha com os valores em hectares, nesse sentido recalculamos o campo dividindo os
valores por 100. Tendo estes dados, criamos um novo campo de caractersticas
numricas para se poder efetuar o clculo da populao a dividir pela rea.
Posto isto, fez-se o Select By Location dos concelhos a mais de 100 metros de
uma estao e sobre esta seleo, fizemos o Select By Attributes dos concelhos com
150 mil habitantes ou mais por km2. Tendo esta seleo final, exportamos a shapefile
da mesma.
arcpy.CalculateField_management(CAOPClip, "SUM_Area_T", "[SUM_Area_T] / 100",
"VB")
arcpy.AddField_management(CAOPClip, "DP_2011", "DOUBLE", "", "", "", "",
"NULLABLE")
arcpy.CalculateField_management(CAOPClip, "DP_2011",
"[pop_res]/[SUM_Area_T]", "VB")
arcpy.AddMessage("Campo Densidade POpulacional 2011 criado")
ConcPopm150="Concelhos_1000Est.shp"
OutLayer1="Concelhos_1000mEst.lyr"
SelFeatures=CaminhoOut + "\\Clip_PRJ_EstacoesCP.shp"
arcpy.MakeFeatureLayer_management(CAOPClip, OutLayer1)
arcpy.SelectLayerByAttribute_management(OutLayer1, "NEW_SELECTION",'"pop_res"
>= 0')
arcpy.SelectLayerByLocation_management(OutLayer1,"WITHIN_A_DISTANCE",SelFeatu
res,"1000","REMOVE_FROM_SELECTION")
arcpy.SelectLayerByAttribute_management(OutLayer1,"SUBSET_SELECTION",'"DP_201
1" >= 150')
arcpy.FeatureClassToFeatureClass_conversion(OutLayer1,CaminhoOut, "\\" +
ConcPopm150 )

Pgina | 6

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

arcpy.AddMessage("Concelhos com mais de 150 habitantes por km2 e a mais de


1000m de uma estacao, exportados")

Foi tambm necessrio identificar as reas de excluso entre 500 e 2000


metros das estaes de comboio. Para realizar esta tarefa efetuamos um Multiple
Ring Buffer que nos permite fazer vrios buffers ao mesmo tempo, neste caso, para a
distncia de 500 e 2000 metros em simultneo. Depois disto foi necessrio selecionar
as reas que esto entre os 500 e 2000 mil metros, no caso do Multiring Buffer so
selecionar o segundo buffer e exportar. Este ltimo passo foi efetuado atravs de uma
funo denominada SByAtributes. Esta funao serve para Features e para Rasters, a
criao desta funo tambem se prendeu pelo facto de evitar a repetiao e reduzir as
linhas de codigo.
def
SByAtributes(type,
OutShape):

OutLayer,Origem,

Selecao,

Expressao,CaminhoOut,

if type== "Feature":
arcpy.MakeFeatureLayer_management(Origem, OutLayer)
arcpy.SelectLayerByAttribute_management(OutLayer, Selecao, Expressao)
arcpy.FeatureClassToFeatureClass_conversion(OutLayer,CaminhoOut,
"\\"+ OutShape )
else:
arcpy.MakeRasterLayer_management(Origem, OutLayer)
arcpy.SelectLayerByAttribute_management(OutLayer, Selecao, Expressao)
arcpy.RasterToPolygon_conversion(OutLayer, CaminhoOut+"\\"+OutShape,
"NO_SIMPLIFY",
"VALUE")
AExclusaoBuff="Buffer.shp"
arcpy.MultipleRingBuffer_analysis(SelFeatures, CaminhoOut + "\\"+
AExclusaoBuff, [500,2000],"meters", "", "ALL")
SByAtributes("Feature", "Buffer.lyr", AExclusaoBuff, "NEW_SELECTION",
'"distance" = 2000',CaminhoOut, "AreaExclusao500_2000.shp")
arcpy.AddMessage("Areas de Exclusao entre 500 e 2000 metros das estacoes
exportadas")

Chega agora a parte da anlise sobre a altimetria e, como sabemos, a primeira


coisa a fazer a TIN quando a mesma ainda no se encontra criada.
Em primeiro lugar fizemos um CheckOutExtensionpois para o programa
correr necessrio desligar as extenses do ArcGis 3D e Spatial. No fim, devemos
voltar a ligar estas extenses. Ao criar a TIN no conseguimos cria-la a partir dos
limites da regio Norte e Centro, ento, primeiro criamos a TIN para o pas todo
atravs das curvas de nvel fornecidas e depois fizemos um Edit_TIN para voltar a
gerar uma nova TIN para a nossa rea de estudo.
#Criar a TIN
arcpy.CheckOutExtension("3D")

Pgina | 7

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

arcpy.CheckOutExtension("Spatial")
TIN_Path=CaminhoOut + "\\TIN_Norte"
Raster="Rast_Norte.tif"
if(os.path.exists(TIN_Path)):
shutil.rmtree(TIN_Path)
arcpy.CreateTin_3d(TIN_Path, OutCoordSys, Altimetria + " ELEV Soft_Line
<None>;", "DELAUNAY")
arcpy.EditTin_3d(TIN_Path, shpClip + " <None> <None> hardclip false;
","DELAUNAY")
arcpy.AddMessage("TIN Criada")
arcpy.AddMessage("Primeira fase do processo concluida")

Devido ao facto de em alguns computadores onde testamos o programa ele dar


erro no fim desta fase por falta de memria Out of Memory, achamos por bem
dividir o programa nesta fase e continuar num novo Pydev Module. Por este motivo foi
necessrio voltar a configurar as definies iniciais e definir alguns caminhos
entretanto criados.
Como sabemos, para se procederem a outro tipo de anlises relacionadas com
a altitude necessrio converter a TIN para uma malha regular (Raster). Coma a rea
de estudo bastante extensa usamos o tamanho do pixel de 200 metros. Definimos o
tamanho do pixel como um parametro tambem da Toolbox para o utilizador poder
definir o tamanho que pretende
#Fazer o Tin to Raster
arcpy.env.workspace=CaminhoOut
Cellsize = arcpy.GetParameterAsText(4)
arcpy.TinRaster_3d(TIN_Path, Raster, "INT", "LINEAR", "CELLSIZE "+
str(Cellsize), 1)arcpy.AddMessage("TIN to Raster executado")

Agora que temos o modelo altimtrico em raster podemos realizar um Slope


que nos calcula os declives da rea de estudo. Neste caso, devido ao enunciado do
trabalho, optou-se por calcular em graus.
Slope="DeclivesGR.tif"
arcpy.Slope_3d(Raster,Slope, "DEGREE", 1)
arcpy.AddMessage("Mapa de Declives executado")

Como queremos definir quais as reas aptas e quais as de excluso a nvel de


declive, tem de se proceder a um Reclassify e definir os declives de 0 a 5 graus com o
valor 1 e os declives maiores que 5 graus com o valor 2. Assim obtemos a
representao dividida em apenas duas categorias, as reas aptas e as inaptas.
RecSlope="Rec_Declives.tif"
arcpy.Reclassify_3d(Slope, "Value", "0 5 1;5.0001 90 2", RecSlope)
arcpy.AddMessage("Reclassify executado")

Pgina | 8

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

Como nas operaes de anlise no podemos misturar dados raster com


vetoriais procedeu-se transformao das reas de declive inaptas em polgonos para
se poder fazer um Merge com as restantes reas inaptas j calculadas em passos
anteriores.
Foi necessrio ento fazer um Select By Attributes das reas com valor 2
exporta-las no formato .shp. O Merge efetuado foi das reas de excluso do Buffer
de 500 a 2000 metros das estaes com a rea de excluso ao nvel de declives.
#Selecionar areas de Exclusao e converter para poligonos
DecExclusao="AExclusao_Dec.shp"
SByAtributes("Raster","Areas_Exclusao.tif",RecSlope, "NEW_SELECTION",
'"Value" = 2',CaminhoOut, DecExclusao)
arcpy.AddMessage("Poligonos das areas de exclusao (Declives > 5 graus)
exportados")
#Definicao das areas de exclusao
AExclusao= "Areas_Exclusao.shp"
arcpy.Merge_management([AExclusaoBuff,DecExclusao], CaminhoOut + "\\"+
AExclusao)
arcpy.AddMessage("Areas de Exclusao exportados")

Para definir as reas potenciais, fez-se um Intersect entre as Areas industriais


e Comerciais com os concelhos com ou mais 150 habitantes por km2. pois desta forma
permite-nos obter as reas que cumprem todos os requisitos. As que falham nalgum
requisito ficam de fora.
APotenciais="AreasPotenciais.shp"
arcpy.Intersect_analysis([AIndeCom,ConcPopm150], CaminhoOut+"\\"+APotenciais,
"ALL")
arcpy.AddMessage("Areas Potenciais exportados")

Tendo as reas que cumprem os requisitos positivos, foi ainda necessrio


eliminar dessas reas, as que tm fatores de excluso. Fizemos ento um Erase e
obtivemos o nosso mapa final.
AreasPossiveis="AreasPossiveis.shp"
arcpy.Erase_analysis(APotenciais, AExclusao, CaminhoDest + "\\" +
AreasPossiveis)
arcpy.CheckInExtension("3D")
arcpy.CheckInExtension("Spatial")

Por fim decidimos criar a opao de eliminar todos os dados intermedios


gerados ao longo do processo, para isso criamos um novo parametro para a Toolbox
onde o utilizador pode definir se quer ou no eliminar os ficheiros intermedios.
Desta forma o utilizador fica apenas com os ficheiros originais e com o
resultado final.
Pgina | 9

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

#Eliminar dados Intermedios


Opcao=arcpy.GetParameterAsText(5)
if Opcao == "Sim" or Opcao == "sim":
arcpy.Delete_management(RecSlope)
shutil.rmtree(CaminhoOut)
arcpy.AddMessage("Processo de detecao de areas para a construcao de uma
nova Linha Ferroviaria concluido")
else:
else:
arcpy.AddMessage("Processo de detecao de areas para a construcao de uma
nova Linha Ferroviaria concluido")

Toolbox:
Conforme descrito ao longo do relatorio decidimos dividir o script em dois e
entao criamos duas toolbox.

Figura 1 - Parametros das Toolbox

Figura 2 - Detalhe da Primeira Toolbox

Pgina | 10

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

Os parametros que o utilizador deve inserir na Toolbox so os seguintes:


- No primeiro campo deve inserir a pasta base, pasta esta onde sero armazenados
todos os ficheiros do processo.
- No segundo campo deve inserir a pasta onde estao todos os dados originais.
- No terceiro deve colocar o Sistema de Coordenadas das Shapes que no tem
- No quarto deve colocar o Sistema de Coordenadas para o projeto
- No quinto devera colocar a Feature Class de Altimetria original, que no ser utilizada
diretamente no projeto mas um passo para saber o nome da Feature
- A semelhana do anterior este parametro permite saber o nome da Feature Class
relativa aos Limites administrativos
- No setimo o utilizador devera inserir a expressao SQL para definir a rea para os
resultados.
- No oitavo novamente um parametro para saber o nome da Feature Class das
estaoes.

Figura 3 - Detalhe da Segunda Toolbox

Os parametros que o utilizador deve inserir na Toolbox so os seguintes:


- No primeiro campo deve novamente a pasta de base
- No segundo campo deve inserir a pasta dos ficheiros processados na primeira toolbox
- No terceiro devera inserir a Feature Class relativa aos Limites administrativos
- No quarto dever inserir a TIN gerada na primeira Toolbox
- No quinto parametro define o tamanho de Pixel
- No sexto parametro define se pretende ou no eliminar os dados Intermedios
Pgina | 11

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio


Introduo programao em SIG
Ano letivo 2014/2015

Faculdade de Letras

Concluso
Com este trabalho demonstraram-se algumas das potencialidades em usar a
linguagem de programao Phyton em conjugao com o ArcGis para executar rotinas
que normalmente para alm de demoradas, so repetitivas neste software. Aps a
execuo do Script, apenas necessrio definir os novos ficheiros de entrada,
gerando-se todo o sucessivo processo de comandos e funes de anlise no ArcGis,
processamento e apresentao de resultados de uma forma rpida e automtica.
A toolbox que criamos permite ainda que com a expresso SQL que serve de
parametro seja possvel atraves dos mesmos dados obter resultados para zonas
diferentes, por exemplo s Norte ou s Centro.
Ao longo deste trabalho tivemos alguns problemas, erros que foram surgindo
nuns computadores e noutros no, mas no final todos pensamos que atingimos o
objetivo pretendido com o trabalho. De realar que a ajuda do Professor Ricardo e do
Daniel foram fundamentais na deteo de pequenos erros que nos passavam ao lado,
agradecemos por isso todo o auxilio e tempo debitado em ns e com o nosso projeto.
Concluindo, sabemos que por vezes a programaao Python pode ser
complicada devido especifissidade das suas linhas de cdigo, mas terminamos este
trabalho com a certeza que o conhecimento adquirido poder ser importante no
futuro.
Bibliografia e webgrafia:
Briggs, Anthony Hello! Phyton, february 2012 - 424 pages isbn:
9781935182085
Lutz Mark Phyton pocket reference, oreilly media october 209 isbn: 9780596158088
Nathan Jennings A phyton primer for arcgis, december 2011 462 pages
isbn: 146627459x
Http://www.python.org/
Http://www.pasteur.fr/formation/infobio/python/
Http://www.rexx.com/~dkuhlman/ python_book_01.html
Http://docs.python.org/release/2.6.8/

Pgina | 12

Areas Possiveis!(!( de Implantao de uma Nova Linha Ferroviria


VILA VERDE
AMARES

(
!
( !
!
(!
(

POVOA DE LANHOSO

!
(
(
!
(
!
(
!

ESPOSENDE

POVOA DE VARZIM

VILA DO CONDE

(
!
(
(!
!
(
!
!
(
(
!
(
FAFE
(!
(!
!
(!
(
!
(!
!
(
(
!
(
!
(
!
(
!
(
!
(
(!
(
!
(!
(!
(!
FELGUEIRAS
(!
(!
(
!
(!
!
(
!
(
!
(
!
(
!
PAOS DE FERREIRA
(
!
(!
(!
(!
!
(
(
!
(
(
!
(
!
(!
!
(
!
(
!
(
!
(
!
( !
!
(
!
( !
!
(
(
!
( !
!
( (!
(
( !
(
!
(
!
(
!
(!
!
(
!
(!
(!
(
(!
(
!
(
!
MESAO
FRIO
(
(!
(!
!
(
!
(
!
(
!
(
!
(
!
(
!

Oceano Atlntico

!
(
(!
!
(!
(!
((
(
!
(!
(
!
( !
!
(!
!
(
(
!
(!
!
(
(
!
(
!
(
(!
!
(!
!
(
(
!
(
!
(
!
(
!
(!
!
(
(
!
(!
!
(
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(!
!
(!
(!
(
!
(!
(
!
(!
(
(!
(!
!
(
(
!
(
!
(!
!
(!
(
(!
(
!
(
!
(
!
(
!
(
!
(
!

(
!
(
!
(
(!
!

PESO DA RGUA

LAMEGO

VALE DE CAMBRA

VISEU

(
!
(!
!
(
((
!!
( (
!
(!
(
!!

!
((
!
(!
!
(
(
!
(!
(!
!
!
((
!
(
!
(
!
(
!
(
!
(!
(!
(!
(!
(!
(
!
(
!
(
!
(!
!
!
(
(
(
(
!
!
(!
!!
(
(
!
(
(
!
(
!
(
!
(
(
!!
!
!
(
(!
(
(!
(!
(
!
(!
(
(!
!
(
!
(
!
(
!
(
!
(
!
(!
(!
!!
(
(
!
(
(
!
(
(!
(!
(
!
!
!
(
!
(!
!
!
(
(
!
(!
(!
!
!
(
((
!
(
!
!
(
(!
!
(
(!
((
!
(!
((
!
!
(
(
!
(
!
(
(
!
!
(
!
(!
!
(
((
!
(
!
(
!
!
(!
(
!
!
(
(
!
(
!
(
!
(
!
(
!
(
!
(
!
(!
(
(
!
(
!
(
!
(
(
(!
!
(!
!!
(
(
!
!
(
(!
(!
(!
(
!
!(
(
!
!
!
((!
(
!!
(
(
(!
!
(!
(
!
(!
(
!
(
!!
(
!
!
!
(
(
(!
!
(!
(
(
(
!
(
!
!
(
(
(!
!
!
(
(
!
(
(
!
!
!
(
!
! !!
!
(!
(!
!
(
(
!
!(
(
((
(!
(
!!
(
(((!
!
(
(!
((
(!
!
!
!
(!
(
(!
(!
(!
(
!
!
!
(!
(
(
((
!
(!
!
(
!
(
!
(
!
(

P o
r t
u g
a l

(
!
(
(!
!
!
(
(
(
(!
(!
(!
!
((!
!
! !
(
(!
(!
(
!
(
( !
(!
(
!
(
!
( !
(
!
(!
!
(
!
(
!
(
!
(
!
(
!
(
!
(!
!
(!
(!
(
!
(
!
(
!
(
!
(
(!
(
!
(!
(
!
(
!
(
!
(!
(
( !
!
(
!
(
!

!
(!
(
!
(
!
(!
(
!
(
!
(
!
(
!
(
(
!
(!
!
(
!
(
!
(
!
(
!
(
!
(
(
(!
!!
((
(!
!
(!
(
!!
!(
((
!
(!
!
(
!
!
(
(!
(
!
!
(!
(
!
(
(!
!
(!
(!
(!
!
!
!
(
(
!
(
(
(
!
!
(
(
!
!
!
!
(
(
(
!
!
(!
(
(
(
!
!
(
(!
(!
(!
(!
(
(!

(
!
LEIRIA

(
!
(
!
(
!

MARINHA GRANDE

(
!
(
!

10

(
!

20 Km

!
(
(
!
BATALHA !
(
(
!
NAZAR

(
!
(
!

PENICHE

(
!

CALDAS DA RAINHA

(
!
(
!

(
!

Estaes CP

Declives

Inferior a 5 graus

Superior a 5 Graus

50

E s p a n h a

!
(
(
!
(
!
(
!
(
!
(
!
(
(!
!

100 km

Linhas CP
Areas Possiveis de Implantao
Concelhos com Areas Possiveis

Sistema de Projeao: ETRS_1989_Portugal_TM06


Elaborao Prpria
Maio 2015