Como obter latitude / longitude em Grau Minuto Segundo (DMS) usando a calculadora de campo QGIS?

9

Eu vim com a seguinte expressão para converter 5.1234 a 5 ° 7`24.24 "

toint ($ x) || '°' || toint ((($ x) - toint ($ x)) * 60) || '' '|| substr ((alternando (((($ x) - toint ($ x)) * 60) - toint ((($ x) - toint ($ x)) * 60)) * 60), 1,5) || '"'

Aqui está o problema: para alguns pontos, como o 5.1234, ele funciona. mas para outros, não. Eu suspeito que o problema é a conversão de números inteiros que arredondam os números decimais em vez de truncá-lo.

Existe alguma outra opção? obrigado.

Obsidianz
fonte
Eu posso sugerir uma solução alternativa. Não é o ideal, mas se você estiver parado no momento, poderá realizar seu trabalho. Clique com o botão direito e Salvar como um CSV. Abra o CSV no Excel ou no Google Docs, insira sua fórmula (que deve ser mais limpa e fácil). Exclua todos os campos, exceto um identificador exclusivo e as seqüências de caracteres DMS convertidas. Salve isso. Faça uma junção de tabela com a camada existente e você está definido.
Spaceialthoughts
11
Cuidado com entradas negativas.
whuber
Só para acrescentar a resposta de spatialthought: arredondamento para baixo para o grau mais próximo irá trabalhar no Excel usando function () no chão.
Micha

Respostas:

3

Gosto da expressão que você criou - provavelmente nenhuma solução no QGIS 1.8, mas no QGIS 1.9-dev há uma floor()função de arredondamento que é arredondada para baixo . Para D ° M'S '':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || floor(((abs($x)) - floor (abs($x))) * 60) ||'\'' || substr( (tostring((((abs($x)) - floor (abs($x))) * 60) - floor(((abs($x)) - floor (abs($x))) * 60)) * 60),1,5) || '"'

Observe o apóstrofo escapado ( \').

Para D ° M.MMM ':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || ((abs($x) - floor(abs($x))) * 60) ||'\''

Para limitar o número de minutos decimais exibidos, substitua # na expressão abaixo pelo número de dígitos:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'
Simbamangu
fonte
Por curiosidade, como seria a fórmula para Graus, Minutos?
mace
Adicionado um exemplo; isso funciona no QGIS 2.6 (e provavelmente em qualquer versão 2.0), mas pode haver funções de formatação mais elegantes disponíveis agora.
Simbamangu
11
Apenas uma armadilha: sua fórmula funciona apenas para valores positivos do leste e do norte. Negativo é um pequeno demais. E eu me pergunto como 0,5 ° E e 0,5 ° W podem ser distinguidos. o piso (+/- 0,5) sempre será 0, não -0.
Andrej
Aaargh. As armadilhas dos testes insuficientes ... e aqui estou eu trabalhando no hemisfério sul (negativo) também. Atualizando em breve.
Simbamangu
1

O operador módulo pode ser usado para fazer truncamento, mas a expressão resultante seria muito feia. É mais bonito usar a substituição de strings, mas, infelizmente, o QGIS não expõe strpos ou funções similares. Use regexp_replace($x, '\\..*', '')para obter a parte inteira e regexp_replace($x, '^[0-9]*\\.', '')obter a parte decimal. Use em torealvez de tointpara cálculos com a segunda expressão para garantir que não haverá arredondamento.

lynxlynxlynx
fonte
2
Não têm uma função strpos mas faz agora;) github.com/qgis/Quantum-GIS/commit/...
Nathan W
tsk tsk tsk, tanto ruído em espaço em branco.
Lynxlynxlynx
Sim, ignore esse primeiro bit, foi apenas um pouco de limpeza não relacionada à nova função.
18719 Nathan W
Feio é ... vai tentar resolver isso.
Obsidianz