Convertendo coordenadas para decimais
Publicado em Developer
decimal glatlng gmap google gpoint maps
Estava fazendo uma aplicação aqui que usa os mapas do Google para indicar onde alguns veículos a venda estão estacionados, e o cliente informou as coordenadas utilizando graus, minutos e segundos da seguinte maneira: -20° 47' 26.37", -49° 21' 11.94"
O problema é a classe GLatLng espera valores decimais e não coordenadas, e eu procurei por toda a API do Google Maps, não encontrei nada para converter entre coordenadas e decimais e tive que botar a mão na massa, ou melhor, no código, que está apresentado abaixo.
Antes de mais nada temos que retirar as indicações de graus, minutos e segundos e transformar os valores das coordenadas em decimais simples do tipo -20.472637, -49.211194, e aí sim enviar para a função abaixo, onde eles se convertem em -20.790658, -49.353317, valores que podem ser enviados para a GLatLng.
1 function coordToDec(coord){ 2 var match, sig, deg, min, sec, dec; 3 match = /(-)?(\d+\.)(\d{2})(\d{2})(\d{2})/.exec(parseFloat(coord).toFixed(6)); 4 sig = match[1] ? -1 : 1; 5 deg = Math.abs(parseFloat(match[2])); 6 min = parseFloat(match[3]); 7 sec = parseFloat(match[4]+"."+match[5]); 8 dec = (min+sec/60.0)/60.0; 9 return ((deg+dec)*sig).toFixed(6); 10 }
Comentários
Comentários fechados.
Artigos anteriores
- Pull requests em modo raiz - sex, 22 de dezembro de 2023, 09:57:09 -0300
- Qual a idade do seu repositório? - ter, 27 de dezembro de 2022, 12:50:35 -0300
- Utilizando ctags em projetos Rails mais recentes - qui, 24 de junho de 2021, 08:23:43 -0300
- Fazendo o seu projeto brotar - seg, 15 de julho de 2019, 08:57:05 -0300
- Learn Functional Programming with Elixir - sex, 02 de março de 2018, 18:47:13 -0300
- Ambiente mínimo - Driver Driven Development - qua, 23 de agosto de 2017, 15:15:03 -0300
- Ambiente mínimo - repositórios de código - dom, 16 de abril de 2017, 13:02:14 -0300
- Ambiente mínimo - terminal e navegador - dom, 02 de abril de 2017, 21:43:29 -0300
- Utilizando muitas gems no seu projeto? - sáb, 29 de outubro de 2016, 11:57:55 -0200
- Desenvolvedores e inteligência artificial - seg, 11 de julho de 2016, 09:09:38 -0300
Eu sei que o assunto já é bem velho, e desculpe pela linguagem utilizada, mas só para constar.....
Estou dando uma olhadinha no REBOL e a minha função ficou assim:
; Coloquei a regra fora da função para facilitar a
; comparação com a ER. Mais verbosa mas mais legível
; ^ é o escape na string ^" -> "
---------- 8< ----------
parse-rule: [
copy deg to "°"
thru " " copy min to "'"
thru " " copy sec to "^""]
coord-to-dec: func [coord] [
parse/all coord parse-rule
t: to-time join deg [":" min ":" sec]
to-decimal t / 3600
]
---------- >8 ----------
Depois é só chamar a função
coord-to-dec c
que ela retorna o valor decimal.
baseado em:
http://reboltutorial.com/blog/rebol-for-seo-marketing-guys/
Muito interessante..
Estava justamente precisando disso!
Abraço
Eustaquio,
Não precisa necessariamente converter para decimal a longitude e latitude.
Vc pode passar para a função getLocations (de um objeto GClientGeocoder) uma string com a seguinte forma: 22 54 50.18S 43 11 02.80W
Vc só precisa remover as notações de graus, minutos e segundos da localização e informar se é N(orte) S(ul) W(oeste) E(leste) o referencial.
Hehe, total coincidencia, domingao, resolvi fazer uma parada e precisei justamente disso em Ruby.
def from_latlong(coord)
sig, deg, min, sec, cen = coord.scan(/(-)?(\d{2}).*(\d{2}).*(\d{2})\.(\d{2})/).flatten
dec = deg.to_i + (min.to_i * 60 + "#{sec}.#{cen}".to_f) / 3600
sig ? dec * -1 : dec
end
Queria fazer em 2, vou tentar depois de assaltar a cozinha ....huaehueau
PS.: ja eh segunda.....
Grande Taq...
Legal, parabens!!!
Abraço.
Gostei. Só resta avisar a eles para que eles atualizem a API...
Tive um cliente mais sem nocao, inventou um jeito, era uma float seguinda de um char "W" ou "S". Mas foi mais simples heh...
Eu tva comecando a implementar isso no GeoRuby, acho q fiz um format as graus.