terça-feira, 1 de janeiro de 2013

Coordenadas geográficas em formato decimal

Recentemente deparei-me com um problema frequente - uma tabela Excel com uma longa lista de sítios arqueológicos, onde, para além dos atributos/colunas "clássicos" como o nome, cronologia, concelho, etc, tinha duas colunas com as coordenadas geográficas WGS84 expressas no formato DMS (degree, minutes seconds). As coordenadas geográficas podem ser expressas de dois modos, DMS ou decimal:

DMS:  9º 45'' 45.21'' W / 38º 06' 21.35''  N >>>> Decimal -9.76250000 / 38.10591666

Ambas as formas são válidas e indicam o mesmo local, contudo o formato DMS dificulta a integração e posterior tratamento espacial da tabela em software SIG porque contem caracteres que a tornam numa string (sequência de caracteres que pode conter números e letras, embora não seja atribuído significado matemático aos números, quando presentes), o que dificulta o seu tratamento numérico. O formato decimal facilita a integração da informação em software SIG porque apenas contem números e um separador decimal.

Existem vários conversores online para converter coordenadas DMS em coordenadas decimais, no entanto apenas permitem uma conversão de cada vez. Se tiveremos uma tabela com dezenas, centenas, milhares de entradas, o procedimento torna-se extremamente moroso, pouco eficiente e acima de tudo... desesperante!

A solução passa por utilizar o Libre Office, uma excelente alternativa ao Microsoft Office e aplicar uma fórmula que transforme as coordenadas para o formato decimal. Os dados e screenshots que aqui vou reproduzir são adulterações com vista a proteger os dados originais - dados cientifícos que ainda não foram, que eu saiba, publicados - mas que servem o propósito de ilustrar a metodologia.

I - Como converter DMS para decimal

A fórmula para converter coordenadas DMS para formato decimal é simples: calcula-se quantos segundos existem na coordenada, dividi-se por 3600 e depois depois somam-se os graus. Exemplo para 39º 10' 10.00´´ :

     10 minutos * 60 = 600 segundos
     600 segundos +10 segundos = 610 segundos
     610/3600 = 0.16944444
     0.16944444 + 39 graus = 39.1694444

II - Preparar os dados

Começamos por adicionar duas colunas à nossa tabela que irão conter as coordenadas decimais. Neste exemplo denominei-as de latDEC e lonDEC



De seguida verificar se as colunas que contem as coordenadas no formato DMS são consistentes, ou seja se não têm variações (espaçamento e numero de caracteres constante - os espaços são caracteres!), e uniformizar, se necessário


III - Aplicar a fórmula

O principal desafio consiste em segmentar o conteúdo da célula que contem a coordenada que queremos converter. Para isso temos de utilizar funções que permitem extrair apenas uma parte do conteúdo da célula de referência. Vejamos um exemplo:

>> para a coordenada:  40º 11' 53.1'' na célula F2
>> foi obtida a seguinte forma decimal: 40.19808333 na célula J2
>> através da seguinte fórmula: =(MID(F2,5,2)*60+MID(F2,8,5))/3600+MID(F2,1,2)

A fórmula poderá parecer algo críptica, vejamos como funciona.  A primeira parte - (MID(F2,5,2)*60 vai extrair os dois caracteres da célula F2 que se encontram a partir na posição 5 (o 5º caracter da célula). Por outras palavras, vai extrair o 5º e o 6º caracteres da célula.

O resultado é o número 11 -11 minutos, que multiplicamos por 60 para obter os segundos.

No entanto necessitamos do número total de segundos, por isso temos de somar aos 660 segundos obtidos anteriormente os 53.1 segundos que compõem o resto da coordenada DMS. Isto é conseguido através da segunda parte da fórmula - +MID(F2,9,5). A lógica é a mesma: extrair apenas a parte que nos interessa do conteúdo da célula de origem: os quatro caracteres da célula F2 que se encontram a partir na posição 9.

Finalmente, a última parte da fórmula - /3600+MID(F2,1,2).  Dividimos o somatório total de segundos por 3600 e somamos o resultado ao número de graus extraindo os primeiros dois caracteres da célula F2, que nos indicam os graus da coordenada - 40, otbtendo assim 40.19808333

No caso de termos coordenadas negativas - o que acontece com os valores de longitude para Portugal continental, temos de acrescentar mais uma parte à nossa fórmula.
 Para obtermos um valor negativo simétrico ao valor positivo basta subtrair ao valor positivo o dobro desse mesmo valor. Por exemplo 5 - 10 = -5, Vejamos o exemplo para a longitude: 5º 29' 42.6´´ W.

Nestes caso, além da fórmula exposta anteriormente para obter a expressão decimal da coordenada  =((MID(G2,4,2)*60+MID(G2,8,4))/3600+MID(G2,1,1)) tenho de subtrair o resultado desta operação pelo resultado dessa mesma operação multiplicado por 2: -((MID(G2,4,2)*60+MID(G2,8,4))/3600+MID(G2,1,1))*2. O aspecto final da fórmula será então: 

=((MID(G2,4,2)*60+MID(G2,8,4))/3600+MID(G2,1,1))-((MID(G2,4,2)*60+MID(G2,8,4))/ 3600+MID(G2,1,1))*2

A solução mais simples será simplesmente copiar estas fórmulas e adaptar os argumentos da função MID:

Latitude e longitude com valores positivos: =(MID(F2,5,2)*60+MID(F2,8,5))/3600+MID(F2,1,2)

Latitude e Longitude c/valores negativos: =((MID(G2,4,2)*60+MID(G2,8,4))/3600+MID(G2,1,1))-((MID(G2,4,2)*60+MID(G2,8,4))/3600+MID (G2,1,1))*2

Partindo do princípio que as coordenadas no formato DMS estão indicadas de modo consistente (ponto II) basta copiar as fórmulas e aplicá-las a todas as colunas e obteremos automaticamente as coordenadas em formato decimal:



III - Exportar tabela

Uma forma segura de exportar a tabela de modo a que um software SIG possa importar os dados e transformá-los em informação geográfica, é guardar a tabela em formato CSV, com o cuidado de assinalar a opção Edit Filter Settings:



Esta opção é o que nos permite controlar alguns aspectos importantes do nosso ficheiro csv, entre elas o enconding, ou seja o tipo de caracteres suportados. No caso da língua portuguesa, o encoding que preserva acentos e cedilhas é o ISO8859-1. Para as restantes opções deixamos as opções default




IV - Importar para Quantum GIS

Com o Quantum GIS é muito simples importar o ficheiro csv que acabámos de criar. Basta recorrer ao plugin Add Delimited Text Layer - que já vem pré instalado - e indicar quais as colunas que contem as coordenadas:


Finalmente, basta irmos às propriedades do layer, e no separador "General" declararmos o sistema de coordenadas do novo layer - neste caso EPSG:4326 - WGS84:


A partir daqui podemos guardar o layer no disco do nosso computador no formato SIG que desejarmos - Shapefile, KML, etc.


V - Notas finais

Este tipo de problema é frequente, e na sua génese normalmente estão aplicações como o Google Earth que normalmente mostra as coordenadas no formato DMS. Consequentemente, quando se cria um marcador, ele será registado com as coordenadas nesse formato.

Devido às dificuldades de integração da informação em software SIG nunca se deve registar coordenadas com o formato DMS. Todos os programas, que eu saiba, permitem trabalhar com coordenadas decimais. No caso do Google Earth basta ir a Tools >> Options e ativar a opção Decimal Degrees:


Na versão portuguesa do Libre Office, o equivalente à função MID é a função SEG.TEXTO

7 comentários:

  1. Muito bom!

    Estou estudando conceitos de SIG e essas fórmulas vão me auxiliar na conversão em massa de coordenadas. Obrigado!

    ResponderEliminar
  2. muito legal!! mas estou com listas de 500-660 coordenadas em graus e minutos decimais,
    LAT LONG
    S 06° 47.064 WO 35° 40.041
    S 06° 41.394 WO 35° 43.394
    S 06° 44.006 WO 35° 44.041
    S 06° 47.471 WO 35° 41.099
    S 06° 47.509 WO 35° 41.583
    S 06° 47.83 WO 35° 43.746
    S 06° 45.267 WO 35° 43.412

    existe fórmula para trabalhar em excel para converter em graus decimais? Obrigada. Lucia

    ResponderEliminar
    Respostas
    1. Consegui uma formula no excel

      =SE(I3<>"W";((((G3*60)+H3)/3600)+F3);-(((((G3*60)+H3)/3600)+F3))) LAT
      =SE(I3<>"W";((((G3*60)+H3)/3600)+F3);-(((((G3*60)+H3)/3600)+F3))) LONG

      utilizar cada valor em uma coluna diferente na seguinte ordem:
      graus / minutos / segundos / S ou N para lat
      graus / minutos / segundos / W ou E para lon

      Eliminar
    2. No Excel:
      =(SEG.TEXTO(A1;4;1)*60+SEG.TEXTO(A1;6;5))/3600+SEG.TEXTO(A1;1;2) LAT N
      =((SEG.TEXTO(B1;3;1)*60+SEG.TEXTO(B1;5;5))/3600+SEG.TEXTO(B1;1;1))-((SEG.TEXTO(B1;3;1)*60+SEG.TEXTO(B1;5;5))/3600+SEG.TEXTO(B1;1;1))*2 LONG W

      Eliminar
  3. Olá Lucia, não sei qual a funcao equivalente no excell, mas certamente existe. Porque nao experimentar o libre office nem que seja só para resolver esse problema?

    ResponderEliminar
  4. Recentemente necessitei de requerer a presença da GNR em terreno minha propriedade onde ocorreu um furto. Efetuado o Auto, deparo-me com a dificuldade de relacionar a coordenada presente no Auto com a coordenada no Google Earth para o mesmo local. Na circunstancia foi identificado pela GNR ( 40º17' 0033 N e 07º 13' 3995 W), quando no Google o mesmo local deverá ter como referenciação (40º17' 49,18'' e 07º 13' 29,80 W). Sendo que o sistema da GNR se apoia na rede Siresp, será que existe alguma valor a aplicar em pós processamento para relacionar estas duas medidas ?

    Obrigado
    José Paiva Martins

    ResponderEliminar
  5. Recentemente necessitei de requerer a presença da GNR em terreno minha propriedade onde ocorreu um furto. Efetuado o Auto, deparo-me com a dificuldade de relacionar a coordenada presente no Auto com a coordenada no Google Earth para o mesmo local. Na circunstancia foi identificado pela GNR ( 40º17' 0033 N e 07º 13' 3995 W), quando no Google o mesmo local deverá ter como referenciação (40º17' 49,18'' e 07º 13' 29,80 W). Sendo que o sistema da GNR se apoia na rede Siresp, será que existe alguma valor a aplicar em pós processamento para relacionar estas duas medidas ?

    Obrigado
    José Paiva Martins

    ResponderEliminar