View
214
Download
0
Category
Preview:
Citation preview
Mestrado em Sistemas de Informação Geográfica e Ordenamento do Território
Criação de biblioteca Python:
construção de nova linha férrea
Relatório do Trabalho Prático
Introdução à Programação em Sistemas de Informação Geográfica
2014/2015
Docentes: Discentes:
Prof. Dr. António Coelho Bruno Fonseca
Prof. Ricardo Baptista Diogo Vieira
Daniel Catalão Tiago Conceição
Maio de 2015, Porto
2
Índice
1. Introdução ................................................................................................................................................. 3
2. Descrição geral da arquitetura do script ....................................................................................... 4
2.1. Tarefas realizadas/arquitetura do script ............................................................................. 4
3. Funcionalidades implementadas e dificuldades encontradas ........................................... 12
4. Construção da Toolbox ....................................................................................................................... 15
5. Conclusão ................................................................................................................................................ 16
6. Bibliografia ............................................................................................................................................. 17
Índice de Figuras e Tabelas
Figura 1. Workflow do script desenvolvido .......................................................................................... 4
Figura 2. Script descritivo da criação de pastas. ................................................................................ 5
Figura 3. Script descritivo da redefinição dos sistemas de coordenadas. ................................. 6
Figura 4. Script descritivo da operação de join entre tabelas e determinação dos valores
de densidade populacional. ......................................................................................................................... 7
Figura 5. Script descritivo da seleção de áreas de uso de solo relevantes e seleção de
concelhos com densidade populacional superior a 150 habitantes/km2 a mais de 1000
metros de estações de comboio. ................................................................................................................ 8
Figura 6. Script descritivo da criação de área de exclusão de 500 a 2000 metros em redor
das estações ferroviárias e definição da extensão da área de estudo. ........................................ 9
Figura 7. Script descritivo da criação e edição da superfície TIN e sua conversão para
formato raster. ............................................................................................................................................... 10
Figura 8. Script descritivo da criação do mapa de declives, a sua reclassificação, conversão
para polígonos e seleção de áreas de exclusão. ................................................................................ 11
Figura 9. Script descritivo da criação das shapefiles relativas às áreas de aptidão, exclusão
e de grande potencial. ................................................................................................................................. 11
Figura 10. Mapa representativo do resultado final do script ...................................................... 14
Figura 11. Exemplo do preenchimento do Script enquanto ferramenta da toolbox, ArcGis
10.2 .................................................................................................................................................................... 15
Figura 12. Erro de processamento (000735) aquando da construção do join ..................... 16
3
1. Introdução
No âmbito da unidade curricular de Introdução à Programação em Sistemas de
Informação Geográfica, foi proposto aos discentes a criação de uma biblioteca em
linguagem Python desenvolvida de modo a permitir executar variadas operações
espaciais culminando na definição de áreas de grande potencial para a construção de uma
nova linha férrea nas regiões norte e centro do território continental português,
obedecendo estas a uma série de critérios pré-estabelecidos.
Após a criação do script em linguagem Python este deverá ser implementado numa
toolbox do software ArcGIS de modo a que a definição dos parâmetros a utilizar seja feita
pelo utilizador, permitindo que esta seja utilizada para casos e territórios distintos,
independentemente dos dados fornecidos. O presente relatório sintetiza todas as tarefas
necessárias e utilizadas na criação da referida biblioteca Python e Toolbox.
Com vista a execução do presente trabalho prático, foram utilizados os softwares
ArcGIS 10.2 e o IDE (Integrated Development Environment) de seu nome Eclipse, sendo este
último um compilador que se socorre da linguagem de programação Python para assim
criar o script que é posteriormente utilizado na criação de um modelo de análise espacial
composto por variados processamentos espaciais.
Como base inicial de trabalho, foi-nos cedido pelos docentes, toda a informação em
formato shapefile e tabular, dados necessários para o estudo do caso.
Relativamente aos critérios que definem as áreas de grande potencial para a
implementação da nova linha férrea, podem ser separados em áreas de aptidão e áreas de
exclusão. Estas estarão naturalmente circunscritas à extensão do território
correspondente às regiões norte e centro de Portugal Continental.
Como áreas de aptidão são reconhecidos os tipos de ocupação do solo relativos à
indústria e comércio (valor 1.2 da nomenclatura da Carta de Ocupação do Solo) e os
concelhos com densidade populacional superior a 150 habitantes/km2 que se encontrem
no mínimo a 1000 metros de distância de uma estação ferroviária.
As áreas de exclusão são as áreas de 500 a 2000 metros envolventes às estações
ferroviárias e áreas com declive superior a 5 graus.
4
2. Descrição geral da arquitetura do script
O principal objetivo de toda a programação desenvolvida, é a criação de um script
que opere de forma genérica sobre a fonte dos dados utilizados. Como tal, o script
desenvolvido tem a capacidade de se moldar ao processamento dos dados para qualquer
outra área de estudo, de forma a responder a mesma problemática, por exemplo numa
outra zona do país.
De modo a tornar o script mais sintético foi utilizado o comando
‘env.overwriteOutput=True’ para assegurar a criação de ficheiros únicos, evitando usar
bibliotecas como ‘os’ e ‘shutil’ para verificar se ficheiros e/ou pastas já existiam.
2.1. Tarefas realizadas/arquitetura do script
O ponto de partida de todo o processo de construção do Script passa pela
organização das pastas onde o trabalho será armazenado. Foi por nós ponderado a
realização da última tarefa proposta no enunciado em primeiro lugar pela questão
organizacional. Esta consistia na construção de dois diretórios cujos nomes se
denominariam ‘DadosProcesso’ e ‘ResultadosFinais’. A escolha de iniciar o script com a
criação dos diretórios permite uma melhor organização e definição tanto de inputs como
de outputs. Para isso foi utilizado o comando ‘arcpy.CreateFolder_management’.
Figura 1. Workflow do script desenvolvido
5
Na tarefa seguinte, procedeu-se a projeção de toda a informação para o sistema de
coordenadas “European Terrestrial Reference System1989” (ETRS89). Para isso foi feita
uma listagem dos ficheiros da pasta que contem os dados originais onde foi criado um
ciclo ‘for’ onde se verifica o nome do sistema de coordenadas (‘spatialRef =
desc.SpatialReference’ / ‘spatialRef.name’).
Através de um ciclo condicional (ciclo ‘if’), verificou-se se existiam ficheiros sem
projeção (‘if spatialRef.name== “Unknown”’). Sendo estes casos válidos, procedeu-se a
definição da respetiva projeção (‘arcpy.DefineProjection_management’) seguindo-se uma
reprojeção para o sistema de coordenadas ETRS89 (‘acrpy.Project_management’), casos
em que foi definido o método de transformação (parâmetro ‘transform_method’).
No caso em concreto, os ficheiros ‘EstacoesCP.shp’ e ‘LinhasCP.shp’ não possuíam
ficheiro ‘.prj’, sendo portanto ficheiros sem sistema de coordenadas definido. Como tal, o
sistema de coordenadas original foi identificado, recorrendo ao ArcMap, como sendo
‘Lisboa_Hayford_Gauss_IGeoE’.
Como os restantes ficheiros apresentavam sistemas de coordenadas definidos, foi
apenas necessário utilizar o comando ‘arcpy_Project_management’, para assim serem
reprojetados em ETRS89.
Figura 2. Script descritivo da criação de pastas.
6
Após redefinida a projeção de todos os ficheiros, procedeu-se ao tratamento dos
dados tabulares da Carta Administrativa Oficial de Portugal (CAOP) fornecida com o
intuito de calcular a densidade populacional por município. Inicialmente foi utilizado o
comando ‘arcpy.Dissolve_management’ para representar a CAOP por município, seguindo-
se a conversão da tabela em formato. xls para formato .dbf para isso utilizando o comando
‘arcpy.ExcelToTable_conversion’.
Para proceder ao Join entre as duas tabelas foi utilizada numa primeira fase a
ferramenta ‘arcpy.JoinField_management’, não tendo sido obtidos os resultados
esperados. Assim, optou-se pela utilização de uma série de processos para colmatar o
sucedido, utilizando as ferramentas ‘arcpy.MakeFeatureLayer_management’,
‘arcpy.AddJoin_management’ , e ‘arcpy.CopyFeatures_management’.
De modo a restituir os nomes dos campos originais, foram utilizadas as
ferramentas ‘arcpy.AddField_management’, ‘arcpy.CalculateField_management’ e
‘arcpy.DeleteField_management’, sendo criados novos campos com nomes
corretos/registos originais, tendo sido apagados os campos cujos nomes foram criados
aleatoriamente.
Para finalizar o tratamento dos dados tabulares, foram calculadas a área e
densidade populacional dos municípios, tendo para isso sido utilizado as ferramentas
‘arcpy.AddField_management’ e ‘arcpy.CalculateField_management’.
Figura 3. Script descritivo da redefinição dos sistemas de coordenadas.
7
De modo a identificar as áreas potenciais existentes na Carta da Ocupação do Solo
(COS), foi utilizada a ferramenta ‘arcpy.Select_analysis’, pelo campo da tabela de atributos
“COS_N2” com vista a seleção exclusiva de um conjunto específico de áreas com uso de
solo relativo a indústria e comércio, identificadas no nível 2 da nomenclatura da COS, com
o valor “1.2”.
De modo a identificar os concelhos com densidade superior a 150 habitantes/km2
que não possuíam estações a 1000m, foram utilizadas as ferramentas
‘arcpy.MakeFeatureLayer_management’ (cria um ficheiro temporário),
‘arcpy.SelectLayerByAttribute_management’ (seleção de features por atributo onde se
utilizou o parâmetro ‘NEW_SELECTION’ e a expressão SQL “ \”Dens_Pop\”>150” “),
‘arcpy.SelectLayerByLocation_management’ (seleção de features por localização onde
Figura 4. Script descritivo da operação de join entre tabelas e determinação dos valores de densidade populacional.
8
foram utilizados os parâmetros ‘WITHIN_A_DISTANCE’, ‘1000 METERS’ como atributo de
distancia e o parâmetro ‘REMOVE_FROM_SELECTION’), ‘arcpy.CopyFeatures_
management’ (guarda as features de forma permanente).
Para a identificação de áreas num raio de 500 m e 2000 m sobre as estações de
comboio, procedeu-se à utilização da ferramenta Buffer através do comando
‘arcpy.Buffer_analysis’. Procedeu-se à realização separada de dois buffers, de raios 500 e
2000 metros, utilizando de seguida a ferramenta ‘erase’ subtraindo as áreas dos buffers
de 500 metros em redor de cada estação, às áreas dos buffers de 2000 metros originando
as áreas de buffer finais.
Sendo o objetivo deste trabalho a construção de uma linha férrea na zona norte e
centro de Portugal, foi ainda realizada uma seleção dos distritos das regiões norte e centro
de Portugal, por distritos, sendo utilizado o comando ‘arcpy.Select_analysis’, tendo sido
concebido um ficheiro shapefile que foi geoprocessado por Dissolve
(‘arcpy.Dissolve_management’). Para que fosse possível realizar a seleção por atributos
foram inseridas as seguintes linhas de código no inicio do script de modo a possibilitar a
utilização de expressões de origem e com acentuação latina:
#!/usr/bin/env.python
# -*- coding: latin-1 -*-
Figura 5. Script descritivo da seleção de áreas de uso de solo relevantes e seleção de concelhos com densidade populacional
superior a 150 habitantes/km2 a mais de 1000 metros de estações de comboio.
9
Antecipando a criação do TIN e do mapa de declives procedeu-se a ativação da
extensão ‘3D’ através do comando ‘arcpy.CheckOutExtension’. Para a conceção do TIN,
utilizou-se o comando ‘arcpy.CreateTin_3d_management’, sendo definido o sistema de
projeção ‘European Terrestrial Reference System1989 (ETRS89)’, os dados altimétricos
provenientes do ficheiro ‘CN_PT100m.shp’, sendo definido como surface feature type
‘Soft_Line’. A técnica de triangulação escolhida foi “DELAUNAY”.
De seguida procedeu-se à edição do TIN, sendo dado como input para edição o
ficheiro relativo as regiões norte e centro, definindo-se o parâmetro surface feature type
‘Hard_Clip’. O parâmetro para a utilização de valores altimétricos foi definido como
‘FALSE’.
Posteriormente procedeu-se a conversão do ficheiro ‘TIN’ para formato Raster
utilizando o comando arcpy.TinRaster_3d tendo sido definidos como parâmetros, “INT”
para que os valores guardados sejam números inteiros, “LINEAR” como método de
interpolação e o tamanho da célula (‘CELLSIZE’) parametrizável.
Figura 6. Script descritivo da criação de área de exclusão de 500 a 2000 metros em redor das estações ferroviárias e
definição da extensão da área de estudo.
10
Para a criação do mapa de declives, procedeu-se a ativação da extensão ‘Spatial
Analyst’ através do comando ‘arcpy.CheckOutExtension(“Spatial”)’. De seguida, utiliza-se o
comando arcpy.Slope_3d com o parâmetro ‘output_measurement’ definido como
“DEGREE”, dando origem ao mapa de declives em graus.
A reclassificação do mapa de declives foi alcançada utilizando a ferramenta
‘arcpy.Reclassify_3d’, definindo como campo de reclassificação, o campo “Value” e como
valores: “0 5 1; 5 90 2”, seguindo-se a conversão do ficheiro raster para polígono através
da ferramenta ‘arcpy.RasterToPolygon_conversion’ onde foi apenas necessário identificar
o input e o output, já que o parâmetro “SIMPLIFY” está pré-definido. A escolha do valor 90
como máximo da classe prende-se com o facto de ser valor máximo possível de declive.
Para selecionar as áreas com declive superior a 5 graus, foi utilizada a ferramenta
‘arcpy.Select_analysis’ definindo-se o input, o output e a expressão SQL relativa ao campo
e valores a selecionar, neste caso “GRIDCODE=2”.
Figura 7. Script descritivo da criação e edição da superfície TIN e sua conversão para formato raster.
11
Para a obtenção das áreas de aptidão, procedeu-se a realização das tarefas de
geoprocessamento Merge (´arcpy.Merge_management’), agrupando-se as shapefiles
relativas as áreas de uso de solo “Industria e Comércio” e concelhos com densidade
populacional superior a 150 habitantes/Km2 distados a mais de 1000 metros de estações
de comboio, e Clip (‘arcpy.Clip_analysis’), onde se definiu como extensão da análise as
regiões norte e centro.
Para a obtenção das áreas de exclusão, procedeu-se a realização das tarefas de
geoprocessamento Merge (´arcpy.Merge_management’), agrupando-se as shapefiles
relativas as áreas com declive superior a 5 graus e áreas num raio de 500 a 2000 metros
sobre as estações de comboio, e Clip (‘arcpy.Clip_analysis’), definindo-se assim como
extensão da análise as regiões norte e centro.
Figura 8. Script descritivo da criação do mapa de declives, a sua reclassificação, conversão para polígonos e seleção de áreas
de exclusão.
Figura 9. Script descritivo da criação das shapefiles relativas às áreas de aptidão, exclusão e de grande potencial.
12
3. Funcionalidades implementadas e dificuldades encontradas
No que respeita às funcionalidades a inserir no script, estas foram implementadas
na sua totalidade com sucesso, apesar de alguns constrangimentos experienciados
aquando do seu desenvolvimento.
Os principais problemas na escrita do script surgiram quando foi necessário fazer
o join entre tabelas visto que quando se utilizava o comando ‘arcpy.JoinField_management’
utilizando os campos ‘Municipio’ (originário de uma shapefile) e ‘Concelho’ (originário de
uma tabela DBF), se verificava a existência de campos com valor 0, não correspondendo à
realidade, estando as linhas de código bem construídas e com sintaxe correta. Tendo como
consequência a impossibilidade de calcular a densidade populacional para estes casos.
Para contornar esta situação criou-se um ficheiro temporário, sendo feito sobre
este o processamento de join em causa, tendo sido criados campos com nomes pré-
definidos obrigando à criação de campos novos com nomes corretos. Isto fez com que o
número de linhas de código aumentasse sem haver necessidade para tal.
Optou-se por manter as linhas de código relativas à operação de join falhada para
ser possível verificar a correção das linhas de código e dos parâmetros utilizados.
Outro problema encontrado relacionado ainda com o join prende-se com o facto de
apenas ser possível utilizar expressões em linguagem Python em sistemas operativos de
64-bits para o cálculo de campos (‘arcpy.CalculateField_management’), não sendo
permitido o uso de expressões em formato VB.
As restantes dificuldades foram registadas nos momentos de edição da superfície
TIN e a sua conversão para formato raster, onde por inúmeras vezes foi tentado correr o
respetivo script escrito de forma correta sem que este funcionasse uma vez que o
executável do Python (python.exe) deixava de funcionar, impedindo a criação dos
ficheiros.
O tamanho mínimo da célula com que foi possível a criação do ficheiro raster foi de
400 unidades.
No seu conjunto, todos estes obstáculos fizeram com que o trabalho avançasse a
um ritmo mais lento e obrigou inclusive à utilização de várias versões do software Eclipse.
13
Nunca foi possível correr o script completo no software Eclipse, uma vez que
sempre que isto foi tentado, o executável do Python deixava de funcionar, nunca tendo
sido possível perceber a razão pela qual tal acontecia.
No que respeita à parametrização do script a principal dificuldade foi perceber o
que seria necessário parametrizar. Apenas inputs e outputs, ou também expressões SQL
de seleção, campos de tabelas de atributos, valores de reclassificação, entre outros?
Optando por parametrizar todos os elementos, será viável uma ferramenta em que
seja necessário preencher mais de 50 parâmetros?
Podendo ser tomado como exemplo a linha 125 do presente script onde são
selecionados através de expressão SQL os distritos que compõem as regiões norte e centro
para criação de um ficheiro shapefile relativo à área de estudo.
A parametrização da expressão SQL é também necessária? Tomando como ponto
de partida o facto de o objetivo ser a utilização da ferramenta para qualquer área de
estudo faz sentido qua a expressão SQL seja um elemento a parametrizar, no entanto como
não é suposto que haja conhecimento a priori dos dados, algo evidenciado no enunciado
do trabalho, como será suposto que o utilizador desenvolva a expressão SQL sem saber o
nome do campo da tabela de atributos que tem de escolher?
O facto de não ser percetível até que ponto deveria ir a parametrização dos dados,
decidimos remeter um script não parametrizado e uma versão parametrizada ao nível dos
inputs, outputs, algumas expressões SQL, distâncias de buffer, etc.
O facto de não possuirmos a versão 10.1 do software ArcGIS, impossibilitou-nos de
testar a sua versão do script, razão também pela qual a toolbox não foi construída para a
versão 10.1.
15
4. Construção da Toolbox
Como foi referido anteriormente, a opção de parametrização tomada fez com que
o número de parâmetros fosse alargado.
Após a construção da ferramenta de script da toolbox e da sua correta edição, esta
foi testada, ocorrendo um erro aquando do Join das tabelas, não tendo sido esse erro
decifrado já que aparentemente todos dados foram bem inseridos.
Figura 11. Exemplo do preenchimento do Script enquanto ferramenta da toolbox, ArcGis 10.2
16
5. Conclusão
Com a realização do presente trabalho, sentimos enquanto grupo um forte impacto
das tecnologias Open Source para SIG. A programação, no caso concreto da temática
abordada, demonstrou através sobretudo da potente ferramenta de Ambiente Integrado
de Desenvolvimento utilizada, Software Eclipse, ser capaz de otimizar os mais variados
geoprocessamentos economizando tempo sem nunca colocar em causa a informação
geográfica produzida.
Apesar das dificuldades observadas, que julgamos como sendo ultrapassadas se
existir uma maior aposta no melhoramento dos softwares utilizados, consideramos este
desafio, um enorme contributo para colocar em prática todos os ensinamentos explicados
nas sessões desta unidade curricular e sobretudo compreender a importância da
linguagem Python enquanto linguagem “universal” e polivalente na programação para
inúmeras áreas da ciência.
Figura 12. Erro de processamento (000735) aquando da construção do join
17
6. Bibliografia
Para a elaboração deste trabalho servimo-nos dos apontamentos das aulas e de
recursos online como o ArcGIS Help Library, e fóruns como GeoNet: ESRI Community e
Geographic Information Systems Stack Exchange.
- http://resources.arcgis.com/en/help/main/10.2/
- https://geonet.esri.com/content
- http://gis.stackexchange.com/
Recommended