domingo, 26 de maio de 2013

Atualizando o caminho dos arquivos numa listagem de hash

Recentemente, eu estava com uma estrutura de arquivos em diversos diretórios e subdiretórios e todos eles já estavam com os respectivos hashes MD5 armazenados em um arquivo texto (hash.md5) no diretório raiz. Bastava executar o comando "md5sum -c hash.md5" na raiz para a ferramenta verificar a integridade de todos os arquivos.

Entretanto, resolvi reorganizar a localização dos arquivos, mudando os arquivos de subdiretórios, criando diretórios novos etc. Eram os mesmos arquivos só que agora estavam em caminhos de diretórios diferentes. Com isso, após estas mudanças, o arquivo texto com os hashes MD5 também precisava ser atualizado para os novos caminhos dos arquivos.

Algumas soluções poderiam ser aplicadas. Uma seria recalcular todas as somas MD5, gerando novamente os hash de todos os arquivos, mas esta solução iria expor novamente o disco rígido em um uso intenso. Eram muitos gigabytes de dados armazenados. Outra solução seria editar o arquivo texto com os hashes, alterando cada linha para o novo caminho do respectivo arquivo. Mas era um arquivo com 1650 linhas e fazer isso manualmente torna impraticável, levaria uma eternidade.

Contudo a segunda era a solução que deveria ser aplicada, afinal os hashes dos arquivos já estavam gerados e só precisava atualizar os caminhos. O que poderia executar esta tarefa rapidamente? Simples, um script no interpretador de comandos.

A seguir, está o código do script que realizou a atualização dos caminhos, de cada arquivo, nas linhas do arquivo texto com os hashes MD5. É um script para o interpretador de comandos Bash, do Linux.

O que ele faz é, primeiramente, uma cópia de segurança do arquivo texto com os hashes. Depois será lida cada linha deste arquivo, onde serão armazenados em variáveis o hash (incluindo os espaços) que está no início da linha e o nome do respectivo arquivo, ignorando o caminho antigo. Então será realizada uma busca pelo arquivo e seu caminho atual é armazenado em outra variável. Por fim, as strings com o hash e o caminho atual são concatenadas e direcionadas para um novo arquivo texto com os hashes MD5.


#!/bin/bash
#

cp -f hash.md5 hashantigo.md5

while read LINHA
do

  HASH=`echo "$LINHA" | cut -c 1-34`
  ARQUIVO=`echo "$LINHA" | sed 's/^.\{34\}//' - | sed 's/.*\///' -`
  NOVODIR=`find */ -iname "$ARQUIVO" -type f -print`
  if [[ $NOVODIR ]]
  then
    echo "$HASH""$NOVODIR" >> novohash.md5
  fi

done < hashantigo.md5

mv -f novohash.md5 hash.md5

echo "Feito!"



Este script torna o processo muito mais rápido e menos traumático no acesso ao disco. Nesta reorganização, eu também separei os arquivos em volumes de aproximadamente 4.4 GB (capacidade de DVDs) pois foram gravados em mídias óticas. Cada volume tinha o seu "diretório raiz" com uma cópia do arquivo texto original com os hashes e o script. O script foi executado para cada volume. Por isso a necessidade do if no script, alguns arquivos não estavam no respectivo volume.

São diversos comandos do Bash, internos e externos, utilizados neste script. As páginas manuais de cada um deles podem ajudar no entendimento de sua execução.

sábado, 18 de maio de 2013

Conversão entre coordenadas geográficas e UTM

O sistema de coordenadas geográficas expressa a posição de um ponto na superfície esférica do globo. Um exemplo desta coordenada são os valores -23,653492 graus de latitude e -47,235703 graus de longitude. O sistema de coordenadas UTM expressa a posição de um ponto em uma projeção plana do globo terrestre. Um exemplo desta coordenada são os valores X 271960,000 (Easting), Y 7382350,200 (Northing), Fuso 23 (Zone), Hemisfério Sul e Elipsoide WGS84 (datum).

As coordenadas podem ser convertidas de um sistema para o outro. Existem uma série de fórmulas, longas e volumosas mas não difíceis de compreender, que convertem uma coordenada do sistema de coordenadas geográficas para o sistema de coordenadas UTM e vice-versa. As fórmulas são baseadas nas propriedades do elipsoide, na geometria do elipsoide de revolução, que serve como referência no posicionamento geodésico.

Com o intuito de tornar este artigo o mais simples possível na execução da conversão, a teoria sobre a geometria do elipsoide de revolução não está demonstrada, muito menos a origem das fórmulas. Ainda, este artigo não trata da coordenada de altitude.

Uma informação importante nos valores de uma coordenada no sistema UTM é sobre o elipsoide de referência. O elipsoide de referência serve para representar matematicamente a superfície terrestre, na forma de um elipsoide de revolução, e assim executar os cálculos e definir as coordenadas. Um dos elipsoides de referência, ou datum, mais usados é o WGS84 e é o que está sendo usado neste artigo. Conhecer o datum é importante porque, nos cálculos, as fórmulas adotam alguns valores (parâmetros) constantes e estes valores estão definidos no datum.

Assim, por exemplo, pela coordenada UTM apresentada no primeiro parágrafo deste artigo, vemos que o datum é o WGS84. Desta forma, nos cálculos desta coordenada são necessários os parâmetros do elipsoide WGS84. O relatório técnico número 8350.2 (3ª edição) da Agência Nacional de Informação Geoespacial, do Departamento de Defesa dos Estados Unidos, define os valores (parâmetros) constantes do elipsoide WGS84, que são:

- Raio Equatorial (semi-eixo maior do elipsoide) em metros:



- Achatamento polar:




Destes parâmetros, derivam-se as seguintes constantes geométricas, que também são utilizadas nos cálculos:

- Raio Polar (semi-eixo menor do elipsoide) em metros:



- Primeira Excentricidade:



- Primeira Excentricidade ao Quadrado:



- Segunda Excentricidade:



- Segunda Excentricidade ao Quadrado:




Outro detalhe é que os graus de latitude e longitude, nestes cálculos, são usados em notação decimal. Se estiverem em notação sexagesimal, o artigo "Conversão de grau decimal e sexagesimal" (http://dan-scientia.blogspot.com.br/2012/12/conversao-de-grau-decimal-e-sexagesimal.html) pode ser útil.

Ainda em relação a latitude e longitude, além dos valores em graus decimais também são necessários os valores em radianos. A conversão de graus decimais para radianos é feita com o uso das fórmulas a seguir. Neste artigo, a latitude e a longitude em graus decimais estão representadas respectivamente por "lat" e "long", e em radianos estão representadas respectivamente pelas letras gregas phi "φ" e lambda "λ".






Mais alguns valores são utilizados nas fórmulas dos cálculos:

A latitude de origem, que no UTM padrão é zero.




O fator de escala no meridiano central do fuso, para garantir um modelo mais favorável de deformação em escala ao longo do fuso.




Os valores de falso norte, que será adotado um ou outro dependendo da posição, se está no hemisfério norte ou sul, e o valor para o falso leste, sendo o valor do meridiano central do fuso. Estes valores são adotados para evitar números negativos. Os graus em notação decimal são indicados com o sinal - (negativo) quando na latitude sul (hemisfério sul) ou na longitude oeste.






Conversão de coordenada geográfica para coordenada UTM

Nesta conversão, iremos obter os valores de Easting (x), Northing (y) e o fuso, a partir da coordenada geográfica, utilizando o datum WGS84.

O fuso UTM (zone) é dado pela fórmula:




E o meridiano central do fuso, que não é um item da coordenada mas será usado nos cálculos de ambas as conversões, é dado pela fórmula:




Na obtenção dos valores de Easting e Northing começam os cálculos pesados. As fórmulas para o cálculo das coordenadas Easting e Northing são compostas de diversos termos. Para que as fórmulas não fiquem extremamente extensas, podemos resolver estes termos realizando cálculos intermediários.

O cálculo de M, comprimento do arco de meridiano, que é a distância vertical ao longo da superfície terrestre partindo do Equador até o ponto, é feito com as fórmulas (séries) a seguir. A latitude está em radianos.




Outros cálculos intermediários devem ser feitos, também relacionados as propriedades do elipsoide, como o raio da curvatura na primeira vertical ou grande normal (N).




Por fim, as fórmulas para obtenção dos valores em metros de Easting (x) e Northing (y). Os valores obtidos nos cálculos intermediários devem ser substituídos nas fórmulas a seguir.






Na anotação desta coordenada deve-se, além dos valores de x, y e fuso, incluir o hemisfério e o datum.


Conversão de coordenada UTM para coordenada geográfica

Nesta conversão, iremos obter os valores de latitude e longitude, a partir da coordenada UTM (x, y e fuso), utilizando o datum WGS84. Alguns valores utilizados serão os mesmos da conversão inversa, incluindo as constantes geométricas, a latitude de origem e o fator de escala no meridiano central do fuso.

As fórmulas para o cálculo das coordenadas geográficas também são compostas de diversos termos. Assim, da mesma forma, para que as fórmulas não fiquem extremamente extensas, podemos resolver estes termos realizando cálculos intermediários.

O cálculo de M, comprimento do arco de meridiano, que é a distância vertical ao longo da superfície terrestre partindo do Equador até o ponto, é feito com a fórmula a seguir.




O cálculo da "footprint latitude", que é a latitude do ponto no meridiano central do fuso que possui a mesma latitude, ou comprimento do arco de meridiano, que o ponto que está sendo convertido.




E mais estes termos intermediários, calculados para "footprint latitude".




Finalmente, as fórmulas para obtenção dos valores da latitude (φ) e longitude (λ). Os valores obtidos nos cálculos intermediários devem ser substituídos nas fórmulas a seguir.






A notação decimal destas coordenadas são obtidas com as fórmulas a seguir.






A conversão entre coordenadas geográficas e UTM não é tão complicada mas requer muitos cálculos. Um software matemático ou uma planilha eletrônica ajuda na velocidade de todos os cálculos, além do mais, já existem muitos sites e aplicativos que fazem estas conversões. O propósito deste artigo é somente mostrar as fórmulas, de forma simplificada pois algumas são séries.

Para mais informações sobre o UTM, leia o artigo "O Sistema de Coordenadas UTM" (http://dan-scientia.blogspot.com.br/2013/04/o-sistema-de-coordenadas-utm.html).

Bibliografia recomendada:

National Imagery and Mapping Agency Technical Report 8350.2, Department of Defense World Geodetic System 1984, Its Definition and Relationships with Local Geodetic Systems, Third Edition, January 2000.

SNYDER, J.P., Map Projections A Working Manual, U.S. Geological Survey Professional Paper 1395, Supersedes USGS Bulletin 1532, United States Government Printing Office, Washington, 1987.