You are on page 1of 49

Mestrado em Sistemas de Informao Geogrfica e Ordenamento do Territrio

Introduo Programao em SIG


Ano Letivo 2015/2016

Identificao do local ideal para a instalao


de um centro de logstica de distribuio de
medicamentos nas NUT III de Minho-Lima,
Cvado, Ave, Tmega e Entre Douro e Vouga
O valor da Programao em SIG na identificao das reas adequadas

Docentes:
Antnio Coelho
Ricardo Baptista

Palavras-chave:
Programao, Arcpy, Python, ArcGis, PyDev, Shapefile, Excel, Raster

Discentes:
Dulcineia Pinto
Marta Arajo
Sandra Moutinho

ndice
Introduo ..................................................................................................................................... 2
Objetivos ....................................................................................................................................... 2
Enquadramento da rea de Estudo .............................................................................................. 3
Metodologia .................................................................................................................................. 6
Funcionalidades e Detalhes do Programa ................................................................................. 8
Resultados e Discusso ............................................................................................................... 46
Concluso .................................................................................................................................... 47
Blibiografia e Webgrafia .............................................................................................................. 48

ndice de Figuras
Figura 1. Mapa de Enquadramento da rea de Estudo ................................................................ 3
Figura 2. NUT III Minho-Lima (Ponte de Lima) ............................................................................. 4
Figura 3. NUT III do Cvado (Rio Cvado, Esposende) .................................................................. 4
Figura 4. NUT III do Ave (Gres) .................................................................................................... 5
Figura 5. NUT III do Tmega (Rio Douro, Cinfes)......................................................................... 5
Figura 6. NUT III Entre Douro e Vouga (Castelo de Santa Maria da Feira) ................................... 6
Figura 7. Parametros da Toolbox ................................................................................................ 45
Figura 8. Detalhe da Toolbox ...................................................................................................... 45
Figura 9. Mapa com a rea final selecionada para a localizao de um novo centro logstico de
distribuio de medicamentos .................................................................................................... 46

Introduo
No mbito da Unidade Curricular de Introduo Programao em SIG do
Mestrado de Sistemas de Informao Geogrfica e Ordenamento do Territrio foi
proposto o desenvolvimento de uma biblioteca Python, no qual fosse capaz de executar
um conjunto de operaes especficas para o tratamento de dados geogrficos e
tabulares, de rasters, de modelos digitais de terreno (MDT) para conseguir chegar
melhor localizao de um centro logstico de distribuio de medicamentos.
Seguidamente, foi a este grupo de trabalho atribuda uma rea de estudo (NUT III)
sendo estas as NUT III Minho-Lima, Cvado, Ave, Tmega e Entre Douro e Vouga.
Para conseguir criar esta biblioteca, recorreu-se biblioteca ArcPy integrada
no software ArcGis 10.3. Relativamente ao cdigo, este foi criado, desenvolvido e
testado no software Eclipse.
No que diz respeito aos dados de partida, foram disponibilizados ficheiros
referentes altimetria, CAOP2015, COS2007n2, vias rodovirias em formato shapefile,
assim como ficheiros Excel sobre dados demogrficos, localizao de hospitais, centros
hospitalares, centros de sade e farmcias de todo o pas. Toda a informao
disponibilizada foi ao nvel de Concelho.

Objetivos
Para realizar este trabalho definiu-se os seguintes objetivos:

Colocar em prtica os conhecimentos adquiridos nas aulas da unidade curricular


de Introduo Programao em SIG;

Criar uma biblioteca Python capaz de executar um conjunto de operaes


especficas para o tratamento de dados (geogrficos; tabulares; rasters; MDT);

Determinar a localizao ideal para um centro de logstica de distribuio de


medicamentos na NUT III do Minho-Lima, Cvado, Ave, Tmega e Entre
Douro e Vouga, seguindo determinados critrios de anlise gerais e trs
secundrios escolha j pr-estabelecidos, que se faz referncia a seguir na
Metodologia.
2

Enquadramento da rea de Estudo


A rea de estudo atribuda foi as das NUT III Minho-Lima, Cvado, Ave,
Tmega e Entre Douro e Vouga segundo a Organizao Administrativa do ano de 2002.

Figura 1. Mapa de Enquadramento da rea de Estudo

A NUT III Minho-Lima limitada a norte e a leste pela Galiza, a sul pela NUT III do
Cvado e a oeste pelo Oceano Atlntico. formada pelos concelhos de Arcos de
Valdevez, Caminha, Melgao, Mono, Paredes de Coura, Ponte da Barca, Ponte de
Lima, Valena, Viana do Castelo, Vila Nova de Cerveira.

Figura 2. NUT III Minho-Lima (Ponte de Lima)

No que diz respeito NUT III do Cvado esta limitada a norte pela NUT III
Minho-Lima, a leste com o Alto Trs-os-Montes, a sul com o Ave e com o Grande
Porto e a oeste pelo Oceano Atlntico. formada pelos concelhos de Amares, Barcelos,
Braga, Esposende, Terras de Bouro e Vila Verde.

Figura 3. NUT III do Cvado (Rio Cvado, Esposende)

A NUT III do Ave limitada a norte pela NUT III do Cvado, a leste pelo Alto
Tmega, a leste e a sul com o Tmega e Sousa e a sul e a oeste pela rea Metropolitana
do Porto. Esta formada pelos concelhos de Fafe, Guimares, Pvoa de Lanhoso,
Vieira do Minho, Vila Nova de Famalico, Vizela, Santo Tirso e Trofa.

Figura 4. NUT III do Ave (Gres)

Relativamente NUT III do Tmega limitada a norte com o Ave e o Alto Trsos-Montes, a leste com o Douro, a sul com o Do-Lafes e o Entre Douro e Vouga e a
oeste com o Grande Porto. formada pelos concelhos de Amarante, Baio, Cabeceiras
de Basto, Castelo de Paiva, Celorico de Basto, Cinfes, Felgueiras, Lousada, Marco de
Canaveses, Mondim de Basto, Paos de Ferreira, Paredes, Penafiel, Ribeira de Pena e
Resende.

Figura 5. NUT III do Tmega (Rio Douro, Cinfes)

E finalmente, a NUT III Entre Douro e Vouga limitada a noroeste pelo Grande
Porto e pela NUT III do Tmega, a leste por Do-Lafes e a sul e a oeste pelo Baixo
Vouga. formada pelos concelhos de Arouca, Oliveira de Azemis, Santa Maria da
Feira, So Joo da Madeira e Vale de Cambra.

Figura 6. NUT III Entre Douro e Vouga (Castelo de Santa Maria da Feira)

Metodologia
Partindo das propostas fornecidas pelo docente a biblioteca a desenvolver dever
realizar as seguintes tarefas:
- Indicar um caminho para a pasta onde obter os ficheiros de dados tabulares,
para que possa operar sobre estes;
- Indicar um caminho para uma pasta onde obter os ficheiros shapefile
disponibilizados, para que possa operar sobre estes;
- Criar vrios ficheiros shapefile do tipo pontos com as localizaes dadas em
cada um dos ficheiros (Farmcias, Centro de Sade, Hospitais e Centros Hospitalares);
- Verificar e projetar os dados disponibilizados ou criados para o sistema de
referncia ETRS 1989 Portugal TM06;
- Agrupar os ficheiros shapefile da CAOP com dados tabulares das tabelas do
INE para calcular a densidade populacional, rcios de farmcias, de centros de sade, de
hospitais e de centros hospitalares por concelho da rea a considerar;
- Agrupar os ficheiros shapefile da CAOP por NUT III com dados tabulares
referentes;
- Criar um mapa de declives de tamanho configurvel, atravs do raster do
modelo digital de elevao (MDE) fornecido:

Criar um mapa de declives do terreno, em graus, com base no MDE;


6

Operaes a realizar com o mapa de declives;

Reclassificao com apenas 2 classes (0-10 graus;> 10 graus);

Selecionar as reas de excluso com declive superior a 10;

Converter para polgonos, funcionando como reas de excluso.

Fazer operaes sobre as diversas shapefiles (buffer, intersect, dissolve, erase,


select by attributes ou location) com o objetivo de criar vrios mapas temticos para
identificar:

as reas com classe de uso de solo admissvel (Classe COSn2 Indstria,


comrcio e transportes);

os municpios com densidade superior a 150 hab/km2 que no tenham vias


rodovirias de 500 m a 3000 m do tipo IC e IP;

os municpios com maior variao positiva de populao residente superior a


65 anos que tenham vias rodovirias de 500 m a 3000 m do tipo IC e IP;

os municpios com maior variao positiva de populao residente entre 25 e


64 anos que tenham vias rodovirias de 500 m a 3000 m do tipo IC e IP;

os municpios com maior variao positiva de populao empregada entre


2001 e 2011;

o municpio com maior populao da rea de estudo;

reas com classe de uso de solo admissvel num raio de 500 m e 3000 m de
qualquer vias rodovirias do tipo IC, IP e EN.

ainda de referir que foi necessrio utilizar todos os critrios gerais definidos:

Distncia dos principais eixos virios (IC, IP e EN) entre 500m a


3000m;

Utilizao do solo (COSn2=1.2 Indstria, comrcio e transportes;

Densidade Populacional da faixa etria>=65 superior mdia nacional;

Rcio de farmcias por municpio superior a 7.0; Rcio de centros de


sade por municpio superior a 1.0;

Declive com valores inferiores a 10%;

Zonas de excluso as NUT III das zonas metropolitanas do Porto e


Lisboa).
7

E ainda se teve que optar por trs critrios secundrios, no qual se escolheu:

Variao positiva da populao empregada;

Zona NUT III com PIB por Habitante superior a 12.5;

Rcio de Hospitais e de Centros e Hospitalares superior ou igual 1.0

E desta forma conseguiu-se definir as reas de grande potencial para a melhor


localizao.

Funcionalidades e Detalhes do Programa


Primeiramente comeou-se por importar todas as bibliotecas necessrias para
que funcionassem todas as operaes, como por exemplo operaes do ArcGis/ArcPy,
do Sistema Operativo, a capacidade de fazer listas e updates.

import arcpy, os, shutil


from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor

De seguida criou-se duas pastas, uma para os ficheiros tabulares e outra para os
ficheiros shapefile e definiram-se os caminhos para cada uma delas de forma a
conseguir operar sobre estes. Nesta parte procedeu-se ainda, verificao se as duas
pastas 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.

import arcpy, os, shutil


from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG"
Caminho = arcpy.env.workspace
env.overwriteOutput= True
Dir= "FicheirosShapefile"
#verifica directorio
Caminho=os.path.join(env.workspace, Dir)
if os.path.exists(Caminho):
print"Existe"
shutil.rmtree(Caminho)
else:
print"Nao existe"
os.mkdir(Caminho)
print"Criou o diretorio"
print os.path.basename(Caminho)
print os.path.dirname(Caminho)
print "Processo completo"

Dir2= "FicheirosTabulares"
#verifica directorio
Caminho=os.path.join(env.workspace, Dir2)
if os.path.exists(Caminho):
print"Existe"
shutil.rmtree(Caminho)
else:
print"Nao existe"
os.mkdir(Caminho)
print"Criou o diretorio"
print os.path.basename(Caminho)
print os.path.dirname(Caminho)
print "Processo completo"

Criadas as pastas para as shapefiles e para os dados tabulares exportaram-se os


mesmos para a respectiva pasta. Assim, com o cdigo seguinte foi possvel passar as
shapefiles que estavam na pasta fornecida inicialmente, passou-se para a pasta
FicheirosShapefile, de forma a estarem todas juntas.
import arcpy, os, shutil
from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho"
out_folder_path=arcpy.env.workspace
out_name = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
inFeatures= arcpy.ListFeatureClasses("*.shp")
print inFeatures

for fc in inFeatures:
inShapefile= os.path.join(out_name, os.path.splitext(fc)[0])
arcpy.CopyFeatures_management(fc,inShapefile)
print "Copiou a shapefile" + fc + " para " + str(inShapefile)
print "O Processo Terminou"

Na pasta DadosTrabalho continha, tambm, a hipsometria em ficheiro Tiff.


Desta forma foi necessrio criar um outro script para conseguir passar para a pasta
FicheirosShapefile.
import arcpy, os, shutil
from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor
arcpy.env.overwriteOutput = True
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho"
out_folder_path=arcpy.env.workspace
out_name = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
tifflist= arcpy.ListRasters("","TIF")
for tiff in arcpy.ListRasters("","TIF"):
arcpy.BuildPyramids_management("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\
\SRTM_PT_25m.tif", "3", "NONE","BILINEAR", "JPEG", "50", "SKIP_EXISTING")
print tifflist

10

Posteriormente, comeou-se por criar uma Geodatabase com duas dataset:


Dados Intermdios e Resultados.
import arcpy, os, shutil
from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG"
Caminho = arcpy.env.workspace
env.overwriteOutput= True
arcpy.env.outputCoordinateSystem = arcpy.SpatialReference("ETRS 1989
Portugal TM06")
arcpy.CreateFileGDB_management("G:\\IPSIG\\TrabalhoINPSIG",
"Trabalho_INPSIG.gdb")
arcpy.CreateFeatureDataset_management("G:\\IPSIG\\TrabalhoINPSIG\\Trabalho_
INPSIG.gdb", "DadosIntermedios", "ETRS 1989 Portugal TM06")
arcpy.CreateFeatureDataset_management("G:\\IPSIG\\TrabalhoINPSIG\\Trabalho_
INPSIG.gdb", "Resultados", "ETRS 1989 Portugal TM06")
print "O processo terminou"

Depois, criou-se shapefiles do tipo ponto para cada um dos ficheiros fornecidos
(Farmcias, Centro de Sade, Hospitais e Centros Hospitalares).

11

import arcpy, os, shutil


from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor
env.overwriteOutput= True
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG"
out_path= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
out_name= "Farmacias_Portugal_SNS.shp"
geometry_type = "POINT"
template = "DISABLED"
has_m = "DISABLED"
has_z = "DISABLED"
spatialref = arcpy.SpatialReference("ETRS 1989 Portugal TM06")
arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, "",
has_m, has_z, spatialref)
out_path= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
out_name= "Hospitais.shp"
geometry_type = "POINT"
template = "DISABLED"
has_m = "DISABLED"
has_z = "DISABLED"
spatialref = arcpy.SpatialReference("ETRS 1989 Portugal TM06")
arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, "",
has_m, has_z, spatialref)
out_path= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
out_name= "Centro_Hospitalar.shp"
geometry_type = "POINT"
template = "DISABLED"
has_m = "DISABLED"
has_z = "DISABLED"
spatialref = arcpy.SpatialReference("ETRS 1989 Portugal TM06")
arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, "",
has_m, has_z, spatialref)
out_path= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
out_name= "Centro_de_Saude.shp"
geometry_type = "POINT"
template = "DISABLED"
has_m = "DISABLED"
has_z = "DISABLED"
spatialref = arcpy.SpatialReference("ETRS 1989 Portugal TM06")
arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, "",
has_m, has_z, spatialref)
print "Processo terminado"

12

O passo seguinte foi passar a informao das tabelas em Excel para shapefile de
forma a conseguir visualizar no ArcMap a localizao das Farmcias, Centros de Sade,
Centros Hospitalares e Hospitais.
import arcpy, os
from arcpy import env
env.overwriteOutput=True
InFile = "G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabelas_xls"
out_putfile = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.env.workspace = InFile
listT=arcpy.ListFiles()
for xls in listT:
arcpy.env.workspace=os.path.join(InFile,xls)
#
print arcpy.env.workspace
Tabs=arcpy.ListTables()
print Tabs
for tab in Tabs:
outFC = tab.replace('$', '')
outTab = outFC +'_TAB'
outLyr = outFC +'_lyr'
#print outFC
arcpy.MakeXYEventLayer_management(tab, 'X', 'Y', outLyr)
arcpy.FeatureClassToFeatureClass_conversion(outLyr,
os.path.join(out_putfile), outFC)
print "terminado"

13

Em seguida foi necessrio definir o sistema de coordenadas das shapefiles das


farmcias, centros de sade, centros hospitalares e hospitais. Desta forma, definiu-se a
projeo para WGS_1984 uma vez que as coordenadas vem neste sistema.
import arcpy, os
from arcpy import env
env.overwriteOutput=True
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
#aqui e onde estao as shapes criadas a partir dos dados tabulares
infc =
r"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_de_Saude.shp"
#sr =
arcpy.SpatialReference("GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID[
'WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree'
,0.0174532925199433]]")
arcpy.DefineProjection_management(infc,
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,29
8.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]")
infc =
r"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares.shp"
arcpy.DefineProjection_management(infc,
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,29
8.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]")
infc =
r"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_Portugal_SNS.sh
p"
arcpy.DefineProjection_management(infc,
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,29
8.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]")
infc = r"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais.shp"
arcpy.DefineProjection_management(infc,
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,29
8.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]")
#GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,29
8.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
print "processo terminado"

No entanto, como pretendia-se que toda a informao estivesse em


ETRS_1989_Portugal_TM06 projectou-se novamente a informao das shapefiles de
modo a que ficasse neste sistema de coordenadas.

14

import arcpy, os
from arcpy import env
env.overwriteOutput=True
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
# se criarmos uma pasta para as shapes ETRS podemos de seguida definir o
workspace nessa pasta
# Local variables:
Centro_de_Saude = "Centro_de_Saude.shp"
Centro_de_Saude_ETRS =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_de_Saude_ETRS.shp"
# Process: Project
arcpy.Project_management(Centro_de_Saude, Centro_de_Saude_ETRS,
"PROJCS['ETRS_1989_Portugal_TM06',GEOGCS['GCS_ETRS_1989',DATUM['D_ETRS_1989
',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNI
T['Degree',0.0174532925199433]],PROJECTION['Transverse_Mercator'],PARAMETER
['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Me
ridian',8.133108333333334],PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_Ori
gin',39.66825833333333],UNIT['Meter',1.0]]", "ETRS_1989_To_WGS_1984",
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298
.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]",
"NO_PRESERVE_SHAPE", "")
Centro_Hospitalares = "Centro_Hospitalares.shp"
Centro_Hospitalares_ETRS =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_ETRS.sh
p"
arcpy.Project_management(Centro_Hospitalares, Centro_Hospitalares_ETRS,
"PROJCS['ETRS_1989_Portugal_TM06',GEOGCS['GCS_ETRS_1989',DATUM['D_ETRS_1989
',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNI
T['Degree',0.0174532925199433]],PROJECTION['Transverse_Mercator'],PARAMETER
['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Me
ridian',8.133108333333334],PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_Ori
gin',39.66825833333333],UNIT['Meter',1.0]]", "ETRS_1989_To_WGS_1984",
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298
.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]",
"NO_PRESERVE_SHAPE", "")

15

Farmacias_Portugal_SNS = "Farmacias_Portugal_SNS.shp"
Farmacias_Portugal_SNS_ETRS =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_Portugal_SNS_E
TRS.shp"
arcpy.Project_management(Farmacias_Portugal_SNS,
Farmacias_Portugal_SNS_ETRS,
"PROJCS['ETRS_1989_Portugal_TM06',GEOGCS['GCS_ETRS_1989',DATUM['D_ETRS_1
989',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.
0],UNIT['Degree',0.0174532925199433]],PROJECTION['Transverse_Mercator'],
PARAMETER['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER
['Central_Meridian',8.133108333333334],PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_
Origin',39.66825833333333],UNIT['Meter',1.0]]", "ETRS_1989_To_WGS_1984",
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,
298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433
]]", "NO_PRESERVE_SHAPE", "")
Hospitais = "Hospitais.shp"
Hospitais_ETRS =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_ETRS.shp"
arcpy.Project_management(Hospitais, Hospitais_ETRS,
"PROJCS['ETRS_1989_Portugal_TM06',GEOGCS['GCS_ETRS_1989',DATUM['D_ETRS_1
989',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.
0],UNIT['Degree',0.0174532925199433]],PROJECTION['Transverse_Mercator'],
PARAMETER['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER
['Central_Meridian',8.133108333333334],PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_
Origin',39.66825833333333],UNIT['Meter',1.0]]", "ETRS_1989_To_WGS_1984",
"GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,
298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433
]]", "NO_PRESERVE_SHAPE", "")
print "processo terminado"

Posteriormente, fez-se um join espacial de forma a juntar a informao tabular


com da CAOP.

16

import arcpy, os
from arcpy import env
env.overwriteOutput=True
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
target_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_de_Saude_ETRS.shp"
join_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Cont_AAD_CAOP2015.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_de_Saude_CAOP"
#arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
target_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_ETRS.shp"
join_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Cont_AAD_CAOP2015.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_CAOP"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
target_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_Portugal_SNS_ETRS.sh
p"
join_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Cont_AAD_CAOP2015.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_Portugal_SNS_CAOP"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
target_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_ETRS.shp"
join_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Cont_AAD_CAOP2015.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_CAOP"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
print "processo terminado"

Entretanto, comeou-se por delimitar a rea de estudo, atravs de um Select by


Attributes, utilizando o campo DICO para realizar a seleo e assim sendo, selecionaram-se
os concelhos pertencentes a cada uma das NUTS atribudas a este grupo de trabalho. Desta

17

forma, obteve-se a shapefile das NUTS do Minho-Lima, Ave, Cvado, Tmega e Entre Douro e
Vouga.

import arcpy
from arcpy import env
arcpy.env.overwriteOutput = True
env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
fc=env.workspace + "\\Cont_AAD_CAOP2015.shp"
#criar a shape do Ave
try:
arcpy.MakeFeatureLayer_management(fc, "TodasClasses", "")
except:
print "Could not create feature layer"
try:
arcpy.SelectLayerByAttribute_management("TodasClasses", "NEW_SELECTION",
"DICO = '0307' OR DICO = '0308' OR DICO = '0309' OR DICO = '0311' OR DICO =
'0312' OR DICO = '0314' OR DICO = '1314' OR DICO = '1318'")
rows = arcpy.SearchCursor("TodasClasses")
row = rows.next()
while row:
print row.getValue(nameField)
row = rows.next()
del row, rows
arcpy.CopyFeatures_management(fc, "Ave")
except:
print arcpy.GetMessages()
arcpy.CopyFeatures_management("TodasClasses",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Ave.shp")

18

#criar a shape do Cavado


fc=env.workspace + "\\Cont_AAD_CAOP2015.shp"
try:
arcpy.MakeFeatureLayer_management(fc, "TodasClasses", "")
except:
print "Could not create feature layer"
try:
arcpy.SelectLayerByAttribute_management("TodasClasses", "NEW_SELECTION",
"DICO = '0301' OR DICO = '0302' OR DICO = '0303' OR DICO = '0306' OR DICO =
'0310' OR DICO = '0313'")
rows = arcpy.SearchCursor("TodasClasses")
row = rows.next()
while row:
print row.getValue(nameField)
row = rows.next()
del row, rows
arcpy.CopyFeatures_management(fc, "Cavado")
except:
print arcpy.GetMessages()
arcpy.CopyFeatures_management("TodasClasses",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Cavado.shp")
print "Shape Cavado criada"
#criar a shape do EntreDouro e Vouga
fc=env.workspace + "\\Cont_AAD_CAOP2015.shp"
try:
arcpy.MakeFeatureLayer_management(fc, "TodasClasses", "")
except:
print "Could not create feature layer"
try:
arcpy.SelectLayerByAttribute_management("TodasClasses", "NEW_SELECTION",
"DICO = '0104' OR DICO = '0109' OR DICO = '0113' OR DICO = '0116' OR DICO =
'0119'")
rows = arcpy.SearchCursor("TodasClasses")
row = rows.next()
while row:
print row.getValue(nameField)
row = rows.next()
del row, rows
arcpy.CopyFeatures_management(fc, "EntreDouroeVouga")
except:
print arcpy.GetMessages()
arcpy.CopyFeatures_management("TodasClasses",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\EntreDouroeVouga.shp")
print "Shape EntreDouroeVouga criada"

19

#criar a shape do Minho e Lima


fc=env.workspace + "\\Cont_AAD_CAOP2015.shp"
try:
arcpy.MakeFeatureLayer_management(fc, "TodasClasses", "")
except:
print "Could not create feature layer"
try:
arcpy.SelectLayerByAttribute_management("TodasClasses", "NEW_SELECTION", "DICO
= '1601' OR DICO = '1602' OR DICO = '1603' OR DICO = '1604' OR DICO = '1605' OR
DICO = '1606' OR DICO = '1607' OR DICO = '1608' OR DICO = '1609' OR DICO = '1610'")
rows = arcpy.SearchCursor("TodasClasses")
row = rows.next()
while row:
print row.getValue(nameField)
row = rows.next()
del row, rows
arcpy.CopyFeatures_management(fc, "MinhoLima")
except:
print arcpy.GetMessages()
arcpy.CopyFeatures_management("TodasClasses",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\MinhoLima.shp")
print "Shape MinhoLima criada"
#criar a shape do Tamega
fc=env.workspace + "\\Cont_AAD_CAOP2015.shp"
try:
arcpy.MakeFeatureLayer_management(fc, "TodasClasses", "")
except:
print "Could not create feature layer"
try:
arcpy.SelectLayerByAttribute_management("TodasClasses", "NEW_SELECTION", "DICO
= '0106' OR DICO = '0304' OR DICO = '0305' OR DICO = '1301' OR DICO = '1302' OR
DICO = '1303' OR DICO = '1305' OR DICO = '1307' OR DICO = '1309' OR DICO = '1310'
OR DICO = '1311' OR DICO = '1705' OR DICO = '1709' OR DICO = '1804' OR DICO =
'1813'")
rows = arcpy.SearchCursor("TodasClasses")
row = rows.next()
while row:
print row.getValue(nameField)
row = rows.next()
del row, rows
arcpy.CopyFeatures_management(fc, "Tamega")
except:
print arcpy.GetMessages()
arcpy.CopyFeatures_management("TodasClasses",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Tamega.shp")
print "Shape Tamega criada"
print "processo terminado"

20

No entanto, como a CAOP estava ao nvel das freguesias e os dados tabulares


encontravam-se por municpio foi necessrio fazer um Dissolve pela NUT uma vez que os
dados tabulares referentes esperana de vida, PIB por habitante e taxa de analfabetismo
encontravam-se por NUT e desta forma tornou-se necessrio realizar um Dissolve pelas
cinco NUTS em estudo.

import arcpy, os, shutil


from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
# shapes criadas por selecao do DICO
#Dissolver a shape do Ave
Ave = "Ave.shp"
AveDissolve_shp =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AveDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(Ave, AveDissolve_shp, "FID", "", "MULTI_PART",
"DISSOLVE_LINES")
print "shape dissolve Ave criada"
#Dissolver a shape do Cavado
Cavado = "Cavado.shp"
CavadoDissolve_shp =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\CavadoDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(Cavado, CavadoDissolve_shp, "FID", "", "MULTI_PART",
"DISSOLVE_LINES")
print "shape dissolve Cavado criada"
#Dissolver a shape do EntreDouroeVouga
EntreDouroeVouga = "EntreDouroeVouga.shp"
EntreDouroeVougaDissolve_shp =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\EntreDouroeVougaDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(EntreDouroeVouga, EntreDouroeVougaDissolve_shp,
"FID", "", "MULTI_PART", "DISSOLVE_LINES")
print "shape dissolve EntreDouroeVouga criada"
#Dissolver a shape do MinhoLima
MinhoLima = "MinhoLima.shp"
MinhoLimaDissolve_shp =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\MinhoLimaDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(MinhoLima, MinhoLimaDissolve_shp, "FID", "",
"MULTI_PART", "DISSOLVE_LINES")
print "shape dissolve MinhoLima criada"

21

#Dissolver a shape do Tamega


Tamega = "Tamega.shp"
TamegaDissolve_shp =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\TamegaDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(Tamega, TamegaDissolve_shp, "FID", "", "MULTI_PART",
"DISSOLVE_LINES")
print "shape dissolve Tamega criada"

Seguidamente, realizou-se um Merge de forma a unir as cinco NUTS.

import arcpy, os
from arcpy import env
#try:
arcpy.env.workspace= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
lista=["AveDissolve.shp","TamegaDissolve.shp","CavadoDissolve.shp","EntreDouroeVoug
aDissolve.shp","MinhoLimaDissolve.shp"]
print lista
#Variaveis
AveDissolve = "AveDissolve.shp"
CavadoDissolve = "CavadoDissolve.shp"
EntreDouroeVougaDissolve = "EntreDouroeVougaDissolve.shp"
MinhoLimaDissolve = "MinhoLimaDissolve.shp"
TamegaDissolve = "TamegaDissolve.shp"
NUT_shp = "D:\\trabalho2\\DadosTrabalho\\NUT.shp"
# Fazer o Merge das NUTS
outputShape = "NUT"
arcpy.Merge_management(lista, "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\" +
outputShape)
print "Merge Nuts shape criada"

22

De seguida, adicionou-se um campo Cod, na tabela da shapefile da NUT criada a


partir do Merge, de forma a conseguir-se juntar a informao tabular com a informao da
CAOP.
import arcpy
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.env.overwriteOutput = True
# shapes criadas por selecao do DICO
#Dissolver a shape do Ave
Ave = "Ave.shp"
AveDissolve_shp = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AveDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(Ave, AveDissolve_shp, "FID", "", "MULTI_PART",
"DISSOLVE_LINES")
print "shape dissolve Ave criada"
#inserir um campo novo AddField_management (in_table, field_name, field_type,
{field_precision}, {field_scale}, {field_length}, {field_alias},
{field_is_nullable}, {field_is_required}, {field_domain})
fieldPrecision = 5
fieldLength = 6
arcpy.AddField_management(AveDissolve_shp, "Cod", "SHORT", fieldPrecision, "",
fieldLength)
#quando e que preciso de um campo novo, crio um campo novo e vou preenche-lo com o
nome da shape
print "campo criado"
expression = 113
arcpy.CalculateField_management(AveDissolve_shp, "Cod", expression, "VB", "")
print "campo preenchido"
#Dissolver a shape do Cavado
Cavado = "Cavado.shp"
CavadoDissolve_shp = "\\CavadoDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(Cavado, CavadoDissolve_shp, "FID", "", "MULTI_PART",
"DISSOLVE_LINES")
print "shape dissolve Cavado criada"
fieldPrecision = 5
fieldLength = 6
arcpy.AddField_management(CavadoDissolve_shp, "Cod", "SHORT", fieldPrecision, "",
fieldLength)
#quando e que preciso de um campo novo, crio um campo novo e vou preenche-lo com o
nome da shape
print "campo criado"
expression = 112
arcpy.CalculateField_management(CavadoDissolve_shp, "Cod", expression, "VB", "")
print "campo preenchido"

23

#Dissolver a shape do EntreDouroeVouga


EntreDouroeVouga = "EntreDouroeVouga.shp"
EntreDouroeVougaDissolve_shp = "\\EntreDouroeVougaDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(EntreDouroeVouga, EntreDouroeVougaDissolve_shp, "FID",
"", "MULTI_PART", "DISSOLVE_LINES")
print "shape dissolve EntreDouroeVouga criada"
fieldPrecision = 5
fieldLength = 6
arcpy.AddField_management(EntreDouroeVougaDissolve_shp, "Cod", "SHORT",
fieldPrecision, "", fieldLength)
#quando e que preciso de um campo novo, crio um campo novo e vou preenche-lo com
o nome da shape
print "campo criado"
expression = 116
arcpy.CalculateField_management(EntreDouroeVougaDissolve_shp, "Cod", expression,
"VB", "")
print "campo preenchido"
#Dissolver a shape do MinhoLima
MinhoLima = "MinhoLima.shp"
MinhoLimaDissolve_shp = "\\MinhoLimaDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(MinhoLima, MinhoLimaDissolve_shp, "FID", "",
"MULTI_PART", "DISSOLVE_LINES")
print "shape dissolve MinhoLima criada"
fieldPrecision = 5
fieldLength = 6
arcpy.AddField_management(MinhoLimaDissolve_shp, "Cod", "SHORT", fieldPrecision,
"", fieldLength)
#quando e que preciso de um campo novo, crio um campo novo e vou preenche-lo com
o nome da shape
print "campo criado"
expression = 111
arcpy.CalculateField_management(MinhoLimaDissolve_shp, "Cod", expression, "VB",
"")
print "campo preenchido"
#Dissolver a shape do Tamega
Tamega = "Tamega.shp"
TamegaDissolve_shp = "\\TamegaDissolve.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(Tamega, TamegaDissolve_shp, "FID", "", "MULTI_PART",
"DISSOLVE_LINES")
print "shape dissolve Tamega criada"
fieldPrecision = 5
fieldLength = 6
arcpy.AddField_management(TamegaDissolve_shp, "Cod", "SHORT", fieldPrecision, "",
fieldLength)
#quando e que preciso de um campo novo, crio um campo novo e vou preenche-lo com
o nome da shape
print "campo criado"
expression = 115
arcpy.CalculateField_management(TamegaDissolve_shp, "Cod", expression, "VB", "")
print "campo preenchido"

24

#fazer merge das shapes


lista=["AveDissolve.shp","TamegaDissolve.shp","CavadoDissolve.shp","EntreDouroeVou
gaDissolve.shp","MinhoLimaDissolve.shp"]
print lista
#Variaveis
AveDissolve = "AveDissolve.shp"
CavadoDissolve = "CavadoDissolve.shp"
EntreDouroeVougaDissolve = "EntreDouroeVougaDissolve.shp"
MinhoLimaDissolve = "MinhoLimaDissolve.shp"
TamegaDissolve = "TamegaDissolve.shp"
NUT_shp = "\\NUT.shp"
# Fazer o Merge das NUTS
outputShape = "NUT"
arcpy.Merge_management(lista, "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\" +
outputShape)
print "Merge Nuts shape criada"

Para juntar-se a informao relativa aos centros de sade, centros hospitalares,


farmcias, hospitais e indicadores estatsticos (Pop. Residente, Pop. Empregada, PIB por
habitante, Esperana de Vida e Taxa de Analfabetismo) converteu-se a informao que se
encontrava em formato xls para dbf para depois, conseguir-se fazer Join Espacial.
import arcpy, os, shutil
from arcpy import env, ListFiles, ListFeatureClasses, UpdateCursor
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\"
arcpy.env.overwriteOutput = True
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabelas_x
ls\\Centro_de_Saude.xls" , "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" +
"Centro_de_Saude.dbf", "")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabelas_x
ls\\Centro_Hospitalar.xls" , "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" +
"Centro_Hospitalar.dbf", "")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabelas_x
ls\\Farmacias_Portugal_SNS.xls" ,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" + "Farmacias_Portugal_SNS.dbf",
"")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabelas_x
ls\\Hospitais.xls" , "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" +
"Hospitais.dbf", "")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabelas_x
ls\\IndicadoresEstatisticos.xlsx" ,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" + "IndicadoresEstatisticos.dbf",
"")
print "Processo Terminado"

25

Depois de converter-se as tabelas Excel dos indicadores do INE para dbf, realizou-se o
join entre as tabelas dbf e a shapefile das NUTS.

import arcpy, os
from arcpy import env
env.overwriteOutput=True
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
#arcpy.AddIndex_management (in_table, fields, {index_name}, {unique},
{ascending})
in_table = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT.shp"
fields = "Cod"
arcpy.AddIndex_management (in_table, fields, "Cod_Index", "NON_UNIQUE",
"NON_ASCENDING")
print "campo indexado criado"
NUT = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT.shp"
COD =
"G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabelas_XLS_indicadores\\TaxaAnalfab
etismo.xls"
#coversao da tabela de taxa de analfabetismo para dbf
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabela
s_XLS_indicadores\\TaxaAnalfabetismo.xls" ,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" + "TaxaAnalfabetismo.dbf",
"")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabela
s_XLS_indicadores\\EsperancaVida.xls" ,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" + "EsperancaVida.dbf", "")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabela
s_XLS_indicadores\\PIBHabitante.xls" ,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" + "PIBHabitante.dbf", "")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabela
s_XLS_indicadores\\PopEmpregada.xls" ,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" + "PopEmpregada.dbf", "")
arcpy.ExcelToTable_conversion("G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\Tabela
s_XLS_indicadores\\PopResidente.xls" ,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\" + "PopResidente.dbf", "")
print "tabelas convertidas"

26

#adicionar os dados do INE a uma shapefile das Nuts foi feita por codigo
in_data = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT.shp"
in_field = "Cod"
join_table1 =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\TaxaAnalfabetismo.dbf"
join_table2 = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\EsperancaVida.dbf"
join_table3 = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\PIBHabitante.dbf"
join_table4 = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\PopEmpregada.dbf"
join_table5 = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\PopResidente.dbf"
join_field = "Cod"
fieldList1 = ["Analfabeti","Analfabe_1"]
fieldList2 = ["f2011_Espe","f2001_Espe"]
fieldList3 = ["f2011_PIBH","f2001_PIBH"]
fieldList4 = ["f2011_PopE","f2001_PopE"]
fieldList5
=["PR_2011","PR25_64_20","PR65_2011","PR_2011_1","PR25_64_1","PR65_2001"]
arcpy.JoinField_management (in_data, in_field, join_table1, join_field,
fieldList1)
arcpy.JoinField_management (in_data, in_field, join_table2, join_field,
fieldList2)
arcpy.JoinField_management (in_data, in_field, join_table3, join_field,
fieldList3)
arcpy.JoinField_management (in_data, in_field, join_table4, join_field,
fieldList4)
arcpy.JoinField_management (in_data, in_field, join_table5, join_field,
fieldList5)
arcpy.CopyFeatures_management( NUT,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT_indicadores")
print "processo terminado"

Entretanto, realizou-se um dissolve pelas cinco NUTS de forma a obter-se apenas, o


limite da NUT total.
import arcpy
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.env.overwriteOutput = True
#criar uma shape com a NUT total atraves de um dissolve para podermos cortar as
shapes das farmacias e outras.
NUT_areas = "NUT.shp"
NUT_limites = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT_limite.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(NUT_areas, NUT_limites, "FID", "", "MULTI_PART",
"DISSOLVE_LINES")
print "limite da NUT criado"

27

Posteriormente realizou-se um clip das shapefiles das farmcias, hospitais, centros de


sade e centros hospitalares pelo limite da NUT, uma vez que s interessava a informao para
as NUTS em estudo.
#realizar os clips as shapes das farmacias e outras
#variaveis
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
Farmacias_Portugal_SNS_ETRS = "\\Farmacias_Portugal_SNS_ETRS.shp"
NUT_limite = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT_limite.shp"
Farmacias_NUT = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_NUT.shp"
# realizar o clip da shape das farmacias
arcpy.Clip_analysis(Farmacias_Portugal_SNS_ETRS, NUT_limite, Farmacias_NUT, "")
print "clip das farmacias realizado "
#variaveis
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
Centro_de_Saude = "\\Centro_de_Saude_ETRS.shp"
NUT_limite = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT_limite.shp"
Centro_de_Saude_NUT =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_de_Saude_NUT.shp"
# realizar o clip da shape das farmacias
arcpy.Clip_analysis(Centro_de_Saude, NUT_limite, Centro_de_Saude_NUT, "")
print "clip dos centros de saude realizado "
#variaveis
Centro_Hospitalares_ETRS =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_ETRS.shp"
NUT_limite = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT_limite.shp"
Centro_Hospitalares_NUT =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_NUT.shp"
# realizar o clip da shape das farmacias
arcpy.Clip_analysis(Centro_Hospitalares_ETRS, NUT_limite, Centro_Hospitalares_NUT,
"")
print "clip dos centros hospitalares realizado "
#variaveis
Hospitais_ETRS =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_ETRS.shp"
NUT_limite = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT_limite.shp"
Hospitais_NUT = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_NUT.shp"
# realizar o clip da shape das farmacias
arcpy.Clip_analysis(Hospitais_ETRS, NUT_limite, Hospitais_NUT, "")
print "clip dos hospitais realizado "

28

De seguida, ao ter o modelo altimtrico em raster (.tif) se pode realizar um


Slope que calcula os declives da rea de estudo. Neste caso, devido ao enunciado do
trabalho, optou-se por calcular em graus.

import arcpy
from arcpy import env
from arcpy.sa import *
arcpy.env.overwriteOutput = True
env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.CheckOutExtension("Spatial")
inRaster = "G:\\IPSIG\\TrabalhoINPSIG\\DadosTrabalho\\SRTM_PT_25mmasked.tif"
outRaster = env.workspace + "\\Slope.tif"
arcpy.Slope_3d(inRaster, outRaster, "DEGREE")

Como se queria definir quais as reas aptas e quais as de excluso a nvel de


declive, se procedeu a um Reclassify e definiu-se os declives em duas classes, ou seja,
os declives de 0 a 10 graus com o valor de 1 e os declives maiores que 10 graus com o
valor de 2. Assim, obteve-se a representao dividida em apenas duas categorias, as
reas aptas e as inaptas.
import arcpy
from arcpy import env
from arcpy.sa import *
arcpy.env.overwriteOutput = True
env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.CheckOutExtension("Spatial")
inRaster = env.workspace + "\\Slope.tif"
outRaster = env.workspace + "\\SlopeRec2.tif"
reclass_field = "Value"
classes= "0 10 1;10 71,5851 2"
arcpy.Reclassify_3d(inRaster,reclass_field, classes, outRaster,"NODATA")
print "Processo terminado"

29

E para cumprir com o sexto critrio geral, utilizou-se um Raster Calculator


para obter as reas de excluso, isto , somente os declives com valores inferiores a
10%.
import arcpy
from arcpy import env
from arcpy.sa import *
arcpy.env.overwriteOutput = True
env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.CheckOutExtension("Spatial")
inRaster = env.workspace + "\\SlopeRec2.tif"
outRas = Raster(inRaster) < 10
outRas.save(env.workspace + "\\RasterCalc.tif")
print "Processo terminado"

Como nas operaes de anlise no podemos trabalhar dados raster com


vetoriais procedeu-se transformao das reas de declive com valor inferiore a 10%
em vectorial. Para isso, realizou-se um Raster to Polygon.
import arcpy
from arcpy import env
arcpy.env.overwriteOutput = True
env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
inRaster = env.workspace + "\\RasterCalc.tif"
outPolygons = env.workspace + "\\areas_exclusao.shp"
field = "VALUE"
arcpy.RasterToPolygon_conversion(inRaster, outPolygons, "NO_SIMPLIFY", field)
print "Processo terminado"

Na segunda parte do trabalho, foi necessrio fazer uma seleo das vias de
tipo IC, IP e EN para obter a distncia dos principais eixos virios atravs do
Multiple Ring Buffer que permite realizar vrios buffers ao mesmo tempo, neste
caso, para a distncia de 500 e 3000 metros em simultneo.

30

import arcpy
from arcpy import env, da, UpdateCursor
env.overwriteOutput=True
env.workspace="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
fc=env.workspace + "\\ESTRADAS_ETRS89.shp"
# selecao da rede viaria principal com 500 a 3000
templayer="estradasprincipais"
arcpy.MakeFeatureLayer_management(fc, templayer)
arcpy.SelectLayerByAttribute_management (templayer, "NEW_SELECTION",
"ITINERARIO LIKE 'IC%' OR ITINERARIO LIKE 'IP%'")
arcpy.CopyFeatures_management("estradasprincipais",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\EstradasPrincipais.shp")
arcpy.MultipleRingBuffer_analysis("estradasprincipais",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\BufferEstradas.shp",
[500,3000],"meters", "", "ALL")
print "selecao da rede principal exportada"

De seguida, foi necessrio selecionar as reas que esto entre os 500 e 3000
metros, por isso, seleccionou-se o Multiring Buffer pelo segundo buffer de 3000
metros atravs do Select Layer By Attributes, exportou-se e copiou-se para uma nova
feature class, tendo como resultado uma featureclass com o polgono de 500 a 3000
metros.
#realizar o buffer para ser possivel a juncao com a CAOP
fc=env.workspace + "//BufferEstradas.shp"
select="select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select,"NEW_SELECTION",' "distance"
= 3000 ')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AreaSelect500_3000.shp")
arcpy.AddMessage("Areas entre 500 e 3000 metros das estacoes exportadas")
print "buffer realizado e exportado"

31

Para realizar o segundo critrio geral, teve-se de identificar as reas com classe
de uso de solo admissvel recorrendo Carta de Ocupao do Solo de 2007 de nvel 2
da indstria, comrcio e transportes. Para tal, selecionaram-se essas reas potenciais
(como o Nvel 2 definido como 1.2) e exportou-se somente a seleo.

import arcpy
from arcpy import env
arcpy.env.overwriteOutput = True
env.workspace = "D:/trabalho/trabalho/FicheirosShapefile"
fc=env.workspace + "/COS2007N2.shp"
try:
arcpy.MakeFeatureLayer_management(fc, "TodasClasses")
except:
print "Could not create feature layer"
try:
arcpy.SelectLayerByAttribute_management("TodasClasses", "NEW_SELECTION",
"COSN2 = '1.2'")
rows = arcpy.SearchCursor("TodasClasses")
row = rows.next()
while row:
print row.getValue(nameField)
row = rows.next()
del row, rows
arcpy.CopyFeatures_management(fc, "Classe_1.2")
except:
print arcpy.GetMessages()
arcpy.CopyFeatures_management("TodasClasses",
"D:/trabalho/trabalho/FicheirosShapefile/Classe_1.2.shp")

32

Para conseguir-se identificar os municpios com densidade superior a 150


hab/km2 e no qual no tivessem vias rodovirias de 500 m a 3000 m, comeou-se por
adicionar um campo na tabela de atributos AREA e atravs do Calculator geometry
calculou-se a rea em km2, seguidamente adicionou-se outro campo DENS_POP e,
novamente, a partir do field Calculator calculou-se a densidade populacional, em que
utilizou-se a populao residente de 2011. Como um dos objetivos era saber qual(ais) os
municpios com densidade superior a 150 hab/km2, fez-se uma seleo por atributos no
qual colocou-se a expresso: DENS_POP" > 150 e por fim, efetuou-se um erase para
retirar as vias rodovirias de 500 a 3000m.
import arcpy
from arcpy import env, da, UpdateCursor
env.overwriteOutput=True
env.workspace="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
fc= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop.shp"
#AddField_management (in_table, field_name, field_type, {field_precision},
{field_scale}, {field_length}, {field_alias}, {field_is_nullable},
{field_is_required}, {field_domain})
arcpy.AddField_management(fc, "AREA",
"DOUBLE","","","","","NON_NULLABLE","NON_REQUIRED")
print "novo campo criado"
arcpy.CalculateField_management(fc, "AREA",
"!shape.area@squarekilometers!","PYTHON","#")
print "Area calculada em km2"
arcpy.AddField_management(fc, "DENS_POP",
"DOUBLE","","","","","NON_NULLABLE","NON_REQUIRED")
print "novo campo criado para a densidade populacional"
arcpy.CalculateField_management(fc, "DENS_POP", "[PR_2011] / [AREA]", "VB", "")
print "densidade populacional calculada"
#selecao por atributos dos municipios com densidade superior a 150 hab/km2
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"DENS_POP" >
150')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_DENS_POP_Munici.shp")
print "selecao dos municipios com densidade superior a 150 hab/km2 concluida"
arcpy.Erase_analysis("G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_DENS_POP_
Munici.shp","G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AreaSelect500_3000.shp"
,"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Erase_buffer_denspop.shp")
print "recorte efetuado"

33

Para identificarem-se os municpios com maior variao positiva de populao


residente entre a faixa etria 25 e 64 anos e que tenham as vias rodovirias entre 500 m
a 3000 m, comeou-se por adicionar um campo na tabela VAR_25_64 e fez-se um
Field Calculator para calcular a variao, ou seja, subtrair os valores de 2001 e 2011 da
populao residente da faixa etria dos 25 aos 64 anos. Aps isto, fez-se uma seleo
por atributos para identificar os municpios com uma variao positiva. Em seguida,
selecionaram-se as estradas principais e fez-se um buffer das vias rodovirias de 500m a
3000m. Realizou-se o recorte do buffer para conseguir-se obter as reas entre 500m e
3000m. Por fim, realizou-se um intersect da variao da populao positiva entre o 25 e
64 anos com a rea do buffer entre os 500 e 3000m.
fc= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop.shp"
arcpy.AddField_management(fc, "VAR_25_64", "DOUBLE")
print "novo campo criado"
#calcular o valor da variavel
arcpy.CalculateField_management(fc, "VAR_25_64", "[PR25_64__1] - [PR25_64_20]",
"VB", "")
print "variavel calculada"
#selecao por atributos para a variacao positiva da populacao
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"VAR_25_64" >
0')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Varpositiva_25_64.shp")
print "selecao da variacao positiva concluida"
#intersecao da variacao da populacao dos 25 aos 64 positiva com o buffer da rede
500 e 3000m
arcpy.Intersect_analysis
(["G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Varpositiva_25_64.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AreaSelect500_3000.shp"],
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\variacao_buffer_inters_25_64.shp",
"ALL", "", "INPUT")
print "Intersect concluido"

Outro critrio a seguir, era verificar qual ou quais os municpios com maior
variao positiva de populao empregada entre 2001 e 2011. Para isso, adicionou-se
um campo na tabela VAR_POP_E e a partir do field Calculator calculou-se a
variao, ou seja, subtrau-se os valores da populao empregada de 2001 da populao

34

empregada de 2011. De seguida, fez-se uma seleo por atributos para verificar quais os
municpios com uma variao positiva da populao.
Pretendeu-se ainda, identificar o municpio com maior populao da rea de
estudo. Para isso, escolheu-se a populao residente de 2011 e verificou-se qual o valor
mximo que se obtinha, sendo o municpio de Braga, o municpio com o maior nmero
de populao residente (181474 hab.).
arcpy.AddField_management(fc, "VAR_POP_E", "DOUBLE")
print "novo campo criado"
#calcular o valor da variavel
arcpy.CalculateField_management(fc, "VAR_POP_E", "[f2001_PopE] - [f2011_PopE]",
"VB", "")
print "variavel calculada"
#selecao por atributos para a variacao positiva da populacao
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"VAR_POP_E" > 0')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Varpositiva_Pop_E.shp")
print "selecao da variacao empregada positiva concluida"
#
myField = "PR_2011"
maxValue = arcpy.SearchCursor(fc, "", "", "", myField + "
D").next().getValue(myField)
print maxValue

Aps, realizar-se o clip da shapefile das NUTS em estudo, fez-se um dissolve


para que a informao originria da CAOP pudesse ficar ao nvel dos concelhos, uma
vez que a informao relativa populao residente e empregada encontrava-se por
municpio. Desta forma, tornar-se- possvel realizar o join entre os dois indicadores e a
NUT. Feito o join, passou-se para o clculo da variao positiva da populao residente
superior a 65 anos, no qual se comeou por adicionar um campo na tabela
Pop_VAR_65 e fez-se um Field Calculator para calcular a variao, ou seja, subtrair
os valores de 2001 e 2011 da populao residente superior a 65 anos. Posteriormente,
fez-se uma seleo por atributos para identificar os municpios com uma variao
positiva. Em seguida, selecionaram-se as estradas principais e fez-se um buffer das vias
rodovirias de 500m a 3000m, pois era uma das condies pedidas. Realizou-se o
recorte do buffer para conseguir-se obter as reas entre 500m e 3000m. Por fim,

35

realizou-se um intersect da variao da populao positiva superior a 65 anos com a


rea do buffer entre os 500 e 3000m.

import arcpy
from arcpy import env
arcpy.env.overwriteOutput = True
env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
# as variaveis para o clip
in_features = "\\Cont_AAD_CAOP2015.shp"
clip_features = "G:\\IPSIG\TrabalhoINPSIG\\FicheirosShapefile\\NUT_limite.shp"
out_feature_class = "\\CAOP_NUT.shp"
xy_tolerance = ""
# executar o clip para podermos juntar os dados do INE
arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
print "Clip da CAOP efetuado"
#vampos fazer o dissolve da caop pelo dico
# variaveis do dissolve
inFeatures = "\\CAOP_NUT.shp"
tempLayer = "caopnutLyr"
outFeatureClass =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\CAOP_Concelhos_NUT.shp"
dissolveFields = ["Concelho", "Dico"]
#executar a layer temporaria
arcpy.MakeFeatureLayer_management(inFeatures, tempLayer)
# executar o dissolve
arcpy.Dissolve_management(tempLayer, outFeatureClass, dissolveFields, "",
"MULTI_PART", "DISSOLVE_LINES")
print "dissolve da caop efetuado por dico "

36

#realizar o join com as tabelas do INE pop residente e empregada


Municipio = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\CAOP_Concelhos_NUT.shp"
#adicionar os dados do INE a uma shapefile das Nuts foi feita por codigo
in_data = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\CAOP_Concelhos_NUT.shp"
in_field = "Dico"
join_table4 = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\PopEmpregada.dbf"
join_table5 = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\PopResidente.dbf"
join_field = "Cod"
fieldList4 = ["f2011_PopE","f2001_PopE"]
fieldList5
=["PR_2011","PR25_64_20","PR65__2011","PR_2011_1","PR25_64__1","PR65__2001"]
arcpy.JoinField_management (in_data, in_field, join_table4, join_field, fieldList4)
arcpy.JoinField_management (in_data, in_field, join_table5, join_field, fieldList5)
arcpy.CopyFeatures_management( Municipio,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop")
print "join realizado entre Caop e dados do INE"
#adicionar um campo para calcular a variacao positiva
fc= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop.shp"
#AddField_management (in_table, field_name, field_type, {field_precision},
{field_scale}, {field_length}, {field_alias}, {field_is_nullable},
{field_is_required}, {field_domain})
arcpy.AddField_management(fc, "Pop_VAR_65", "DOUBLE")
print "novo campo criado"
#calcular o valor da variavel
arcpy.CalculateField_management(fc, "Pop_VAR_65", "[PR65__2001] - [PR65__2011]",
"VB", "")
print "variavel calculada"
#selecao por atributos para a variacao positiva da populacao
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"Pop_VAR_65" > 0')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Varpositiva_65.shp")
print "selecao da variacao positiva concluida"
#acao para realizar a selecao das estradas
fc= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\ESTRADAS_ETRS89.shp"
# selecao da rede viaria principal com 500 a 3000
templayer="estradasprincipais"
arcpy.MakeFeatureLayer_management(fc, templayer)
arcpy.SelectLayerByAttribute_management (templayer, "NEW_SELECTION", "ITINERARIO LIKE
'IC%' OR ITINERARIO LIKE 'IP%'")
arcpy.CopyFeatures_management("estradasprincipais",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\EstradasPrincipais.shp")
arcpy.MultipleRingBuffer_analysis("estradasprincipais",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\BufferEstradas.shp",
[500,3000],"meters", "", "ALL")
arcpy.CopyFeatures_management(templayer,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Classe_1.2.shp")
print "selecao da rede principal exportada"

37

Um dos critrios gerais a ser tratado era a densidade populacional da faixa etria
>=65 superior mdia nacional. Desta forma, realizou-se todo o script de forma a
calcular a densidade populacional, no entanto, no conseguiu-se realizar esta etapa, pois
no conseguiu-se fazer o script para calcular a mdia ao nvel nacional, ou seja, no
conseguiu-se cumprir este objetivo na totalidade.
import arcpy
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.env.overwriteOutput = True
# shapes criadas por selecao do DICO
#Dissolver a shape
CAOP = "Cont_AAD_CAOP2015.shp"
CAOPDissolveDICO_shp =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\CAOPDissolveDICO.shp"
# dissolver as shapes para termos area total por NUTS
arcpy.Dissolve_management(CAOP, CAOPDissolveDICO_shp, "DICO", "", "MULTI_PART",
"DISSOLVE_LINES")
print "shape dissolve CAOP criada"
#inserir um campo novo AddField_management (in_table, field_name, field_type,
{field_precision}, {field_scale}, {field_length}, {field_alias},
{field_is_nullable}, {field_is_required}, {field_domain})
#fieldPrecision = 5
#fieldLength = 6
#arcpy.AddField_management(CAOPDissolveDICO_shp, "MEDIA", "DOUBLE", "", "", "")
#quando e que preciso de um campo novo, crio um campo novo e vou preenche-lo com o
nome da shape
print "campo criado"
#adicionar os dados do INE a uma shapefile das Nuts foi feita por codigo
in_data = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\CAOPDissolveDICO.shp"
in_field = "Dico"
join_table = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosTabulares\\PopResidente.dbf"
join_field = "Cod"
fieldList
=["PR_2011","PR25_64_20","PR65__2011","PR_2011_1","PR25_64__1","PR65__2001"]
arcpy.JoinField_management (in_data, in_field, join_table, join_field, fieldList)
arcpy.CopyFeatures_management(CAOPDissolveDICO_shp,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop_Portugal")
print "join realizado entre Caop e dados do INE"
in_table = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop_Portugal.shp"
out_table = "G:\IPSIG\TrabalhoINPSIG\\Trabalho_INPSIG.gdb\\stats"
statistics_fields = ["PR65__2011", "MEAN"]
arcpy.Statistics_analysis (in_table, out_table, statistics_fields, "")
#expression = "(sum[PR65__2011])/278"
#expression = MEAN(PR65__2011)
#arcpy.CalculateField_management(CAOPDissolveDICO_shp, "MEDIA", expression, "VB",
"")
print "tabela preenchida com as estatisticas"

38

#realizar o buffer para ser possivel a juncao com a CAOP


fc= "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\BufferEstradas.shp"
select="select"
arcpy.MakeFeatureLayer_management(fc, select)
#recorte do buffer
arcpy.SelectLayerByAttribute_management(select,"NEW_SELECTION",' "distance" = 3000
')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AreaSelect500_3000.shp")
arcpy.AddMessage("Areas entre 500 e 3000 metros das estacoes exportadas")
print "buffer realizado e exportado"
arcpy.Intersect_analysis
(["G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Varpositiva_65.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AreaSelect500_3000.shp"],
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Var_Buffer_Inters.shp", "ALL", "",
"INPUT")
print "Intersect concluido"

Como no se conseguiu realizar o processo para calcular a densidade


populacional da faixa etria >=65 superior mdia nacional, decidiu-se consultar no
statistics qual a mdia e posteriormente realizou-se uma seleo por atributos, de forma
a conseguir-se obter as reas pretendidas para o resultado final.

import arcpy
from arcpy import env, da, UpdateCursor
arcpy.env.workspace = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.env.overwriteOutput = True
fc= env.workspace + "\\Caop_Pop.shp"
select="select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select,"NEW_SELECTION",' "PR65__2011" >
6970 ')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Pop_sup_MEAN.shp")
print "populacao superior a media nacional selecionada e exportada"

39

Relativamente aos rcios comeou-se por fazer o script para o rcio das
farmcias por municpio superior a 7.0. Para isso fez-se um join espacial da CAOP pelas
farmcias e seguidamente realizou-se uma seleo por atributos, no qual utilizou-se a
expresso: Join_Count > 7, para conseguir-se obter os municpios com um rcio de
farmcias superior a 7.0. Entretanto, realizou-se o mesmo processo para os centros de
sade com um rcio superior a 1 e para os hospitais e centros hospitalares, com um
rcio igual a 1.

import arcpy
from arcpy import env, da, UpdateCursor
env.overwriteOutput=True
env.workspace="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
target_features = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop.shp"
join_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_Portugal_SNS_ETRS.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_NUT.shp"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
print "processo terminado"
fc="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Farmacias_NUT.shp"
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"Join_Count" >
7')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Racio_Farmacias.shp")
print "Racio de farmacias concluido"

40

target_features = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop.shp"
join_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_de_Saude_Nut.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centros_de_saude_join.shp"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
print "processo terminado"
fc="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centros_de_saude_join.shp"
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"Join_Count" > 1')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Racio_Centros_de_Saude.shp")
print "Racio de centros de saude concluido"
#racio dos hospitais superior a 1
target_features = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop.shp"
join_features = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_Nut.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_Nut_join.shp"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
print "processo terminado"
fc="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Hospitais_Nut_join.shp"
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"Join_Count" = 1')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Racio_Hospitais.shp")
print "Racio de hospitais concluido"

41

#racio dos centros hospitalares superior ou igual a 1


target_features = "G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Pop.shp"
join_features =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_Nut.shp"
out_feature_class =
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_Nut_join.shp"
arcpy.SpatialJoin_analysis(target_features, join_features, out_feature_class)
print "processo terminado"
fc="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Centro_Hospitalares_Nut_join.shp"
select = "select"
arcpy.MakeFeatureLayer_management(fc, select)
arcpy.SelectLayerByAttribute_management(select, "NEW_SELECTION", '"Join_Count" = 1')
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Racio_Centro_Hospitalares.shp")
print "Racio de centros hospitalares concluido"

Outro critrio secundrio escolhido pelo grupo foi identificar a Zona NUT III
com PIB por Habitante superior a 12.5. Para isso, fez-se uma seleco de atributos para
os anos de 2001 e 2011 utilizando o OR de forma a juntar a informao e assim obter
a NUT pretendida.
import arcpy
from arcpy import env, da, UpdateCursor
env.overwriteOutput=True
env.workspace="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
NUT="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\NUT.shp"
select="select"
arcpy.MakeFeatureLayer_management(NUT, select)
arcpy.SelectLayerByAttribute_management(select,"NEW_SELECTION", '"f2011_PIBH" > 12.5
OR "f2001_PIBH" > 12.5' )
arcpy.CopyFeatures_management(select,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\PIB_select")
print "seleccao terminada"

Para o stimo e ltimo critrio geral, foi necessrio fazer um Select By


Attributes das reas metropolitanas de Lisboa e do Porto e um Delete para exclu-las.

42

import arcpy
from arcpy import env, da, UpdateCursor
env.overwriteOutput=True
env.workspace="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\"
fc=env.workspace + "\\Cont_AAD_CAOP2015.shp"
templayer="zonasexclusao"
arcpy.MakeFeatureLayer_management(fc, templayer)
arcpy.SelectLayerByAttribute_management (templayer, "NEW_SELECTION", "DICO =
'0107' OR DICO = '1304' OR DICO = '1306' OR DICO = '1308' OR DICO = '1312' OR
DICO = '1313' OR DICO = '1315' OR DICO = '1316'OR DICO = '1317'")
arcpy.DeleteFeatures_management(templayer)
print "Zonas de exclusao eliminadas"

Realizados todos os scripts para os critrios gerais e secundrios, juntou-se todas


as shapefiles resultantes desses critrios atravs de um intersect, de forma a obter-se as
reas de grande potencial para a melhor localizao da instalao do centro de logstica
de distribuio de medicamentos.
import arcpy
from arcpy import env, da, UpdateCursor
env.overwriteOutput=True
env.workspace="G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
#realizar o intersect das shapes pedidas nos criterios
in_features =
["G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Caop_Varpositiva_Pop_E.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\AreaSelect500_3000.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Pop_sup_MEAN.shp","G:\\IPSIG\\Trabalh
oINPSIG\\FicheirosShapefile\\Racio_Farmacias.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Racio_Centros_de_Saude.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Racio_Hospitais.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Racio_Centro_Hospitalares.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\PIB_select.shp"]
arcpy.Intersect_analysis (in_features,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Intersect_Intermedio.shp", "ALL", "",
"INPUT")
print "intersect intermedio concluido"
# remover da shape do intersect as areas de exclusao que e o resultado dos declives
em shape de poligonos
# a area metropolitana do porto nao entra porque a nut ja a exclui

43

#realizar o intersect das shapes pedidas nos criterios


in_features =
["G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Intersect_Intermedio.shp",
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\areas_exclusao.shp"]
arcpy.Intersect_analysis (in_features,
"G:\\IPSIG\\TrabalhoINPSIG\\FicheirosShapefile\\Intersect_Final.shp", "ALL",
"", "INPUT")
print "Intersect final concluido"

Toolbox:
Conforme descrito ao longo do relatorio decidiu-se fazer script com os ficheiros
finais e ento, criou-se uma toolbox. Assim que, fez-se uma juno dos ficheiros
Merge que esto na pasta dos FicheirosFinais.

import arcpy, os
from arcpy import env
arcpy.env.overwriteOutput=True
arcpy.env.workspace="I:\\TrabalhoINPSIG\\TrabalhoINPSIG\\FicheirosFinais"
if not
(os.path.exists("I:\\TrabalhoINPSIG\\TrabalhoINPSIG\\FicheirosFinais\\resulta
dos")):
os.mkdir("I:\\TrabalhoINPSIG\\TrabalhoINPSIG\\FicheirosFinais\\resultados")
else:
arcpy.env.workspace="I:\\TrabalhoINPSIG\\TrabalhoINPSIG\\FicheirosFinais\\res
ultados"
fcs= arcpy.ListFeatureClasses("*")
for fc in fcs:
arcpy.Delete_management(fc)
print "Apagou:"+ fc
arcpy.env.workspace="I:\\TrabalhoINPSIG\\TrabalhoINPSIG\\FicheirosFinais"
#Nome nova shape#
fcName= arcpy.GetParameterAsText(0)
#Nome da pasta
fcFolder= arcpy.GetParameterAsText(1) #fcFolder="
#"I:\\TrabalhoINPSIG\\TrabalhoINPSIG\\FicheirosShapefile"
arcpy.env.workspace= fcFolder
fcList= arcpy.ListFeatureClasses()
arcpy.Merge_management(fcList,
"I:\\TrabalhoINPSIG\\TrabalhoINPSIG\\FicheirosFinais\\resultados\\" +
str(fcName))
print "Criou o ficheiro shapefile:"+ fcName
print "Concluiu a tarefa"

44

Figura 7. Parametros da Toolbox

Figura 8. Detalhe da Toolbox

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


- No primeiro campo deve inserir nome da shapefile, para o resultado do script;
- E no segundo campo deve inserir a pasta onde esto todos os dados originais.

45

Resultados e Discusso

Figura 9. Mapa com a rea final selecionada para a localizao de um novo centro logstico de distribuio de medicamentos

O mapa final foi construdo atendendo aos critrios gerais exigidos no enunciado
e aos critrios secundrios escolhidos pelo grupo.
A distncia aos principais eixos virios (IC, IP e EN) entre 500 m a 3000 m um
critrio de excluso bastante forte reduzindo bastante a rea possvel da localizao do
centro logstico. Os outros critrios foram reduzindo paulatinamente a rea at restar
apenas uma pequena parte do concelho de Santo Tirso. Este territrio inclui reas
urbanizadas tal como era exigido no critrio geral que indicava a utilizao do solo para
a indstria, comrcio e transportes (clase 1.2).

Resultados das selees:


A Variao positiva de populao empregada incluiu 41 concelhos.
46

O rcio de frmacias superior mdia nacional inclui 18 concelhos: Amarante,


Barcelos, Braga, Esposende, Fafe, Felgueiras, Guimares, Marco de Canaveses,
Oliveira de Azemis, Paos de Ferreira, Paredes, Penafiel, Ponte de Lima, Santa Maria
da Feira, Santo Tirso, Viana do Castelo, Vila Nova de Famalico e Vila Verde.
O rcio de centros de sade por municpio superior a 1.0 incluia apenas 9
concelhos dos anteriores: Barcelos, Braga, Guimares, Paredes, Penafiel, Ponte de
Lima, Santo Tirso, Valena Viana do Castelo. Onde Valena no figurava na shape de
seleo anterior.
O Rcio de Hospitais superior ou igual 1.0 inclui 13 concelhos e por fim o racio
de Centros e Hospitalares superior ou igual 1.0 apenas inclui 2 concelhos: Penafiel e
Santo Tirso.
Por ltimo a seleo da Zona NUT III com PIB por Habitante superior a 12.5
inclui as zonas de Cvado, Ave e Entre Douro e Vouga, excluindo o concelho de
Penafiel. Resta assim a rea de Santo Tirso que ser aquela onde se poderia localizar o
centro de distribuio de medicamentos porque cumpre todos os critrios exigidos.

Concluso
Com a realizao deste trabalho foi possvel aplicar os conhecimentos
adquiridos ao longo das aulas sobre a linguagem de programao Python, no qual se
apresentou algumas das potencialidades deste tipo de linguagem em interao com o
ArcGis. Isto vai ser benfico para a automatizao do processo, pois vai aumentar a
rapidez de todo o processo e permitir economizar em tempo, executando tarefas
demoradas e repetitivas no software.
Para realizar este trabalho decidiu-se fazer os scripts por partes uma vez que se
se fizesse o script todo seguido iria dar bastantes problemas. Mesmo assim, ao longo do
processo surgiu alguns problemas, como que alguns dos scripts davam erro. Contudo,
conseguiu-se solucionar esses erros a medida que iam surgindo.
No entanto, o nico problema que no se conseguiu solucionar foi o clculo das
mdias nacionais em que o script no corria.
47

Com a realizao deste trabalho conseguiu-se atingir o objetivo pretendido,


identificar a melhor localizao para a instalao de um centro de logstica de
distribuio de medicamentos, nas reas das NUT III Minho-Lima, Cvado, Ave,
Tmega e Entre Douro e Vouga, ou seja, uma pequena rea do concelho de Santo Tirso,
seguindo os cririos pr-estabelecidos.
A programao em Python pode ser complexa e um pouco complicada devido a
complexidade dos cdigos. No entanto, a experincia e o conhecimento, que se adquiriu
ao desenvolver este projeto, podero ser uma mais valia em termos futuros e
profissionais.

Blibiografia e Webgrafia
ArcGis Pro - http://pro.arcgis.com/en/pro-app/arcpy/main/arcgis-pro-arcpyreference.htm
Briggs, Anthony Hello! Phyton, february 2012 - 424 pages isbn:
9781935182085
Geographic Information Systems - http://gis.stackexchange.com/questions/
Lutz Mark Phyton pocket reference, oreilly media october 209 isbn: 9780596158088
Nathan Jennings A phyton primer for arcgis, december 2011 462 pages
isbn: 146627459x
Python - http://www.python.org
Python - http://docs.python.org/release/2.6.8/

48

You might also like