Professional Documents
Culture Documents
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:
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.
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.
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.
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.
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:
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:
E ainda se teve que optar por trs critrios secundrios, no qual se escolheu:
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.
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"
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"
10
Depois, criou-se shapefiles do tipo ponto para cada um dos ficheiros fornecidos
(Farmcias, Centro de Sade, Hospitais e Centros Hospitalares).
11
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
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"
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"
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
19
20
21
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
23
24
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"
27
28
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")
29
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
33
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
35
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
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
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
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"
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"
43
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
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).
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
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