criação de biblioteca python: construção de nova linha...

17
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

Upload: vuongliem

Post on 02-Dec-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

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.

14

Figura 10. Mapa representativo do resultado final do script

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/