Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

hargon

Função para calcular distância entre 2 pontos através da lat. e lon.

Recommended Posts

- Objetivo: Calcular distância entre dois pontos através da latitude e longitude

 

- Exemplo de aplicação: Calcular distância entre duas cidades desconsiderando curvas e desvios.

 

- Chamada: GetGeodesicDistance(Lat1,Lon1,Lat2,Lon2,rScale) 'valores de rScale: statute (default), nautical ou metric

 

- Fonte: Spokane City | Post do Patrique

 

<%
Function DegRad(x)
	  'Degrees to Radians
	  DegRad = x * ((4 * Atn(1)) / 180)
End Function

Function GetGeodesicDistance(Lat1,Lon1,Lat2,Lon2,rScale)
	Dim er,pr,fl,F,G,L,S,C,W,R,D,H1,H2
	  er = 6378.1370000
	  pr = 6356.7523142
	  fl = (er - pr) / er
	  F = (DegRad(Lat1) + DegRad(Lat2)) / 2
	  G = (DegRad(Lat1) - DegRad(Lat2)) / 2
	  L = (DegRad(Lon1) - DegRad(Lon2)) / 2
	  S = Sin(G)^2 * Cos(L)^2 + Cos(F)^2 * Sin(L)^2
	  C = Cos(G)^2 * Cos(L)^2 + Sin(F)^2 * Sin(L)^2
	  W = Atn(Sqr(S / C))
	  R = Sqr(S * C) / W
	  D = 2 * W * er
	  H1 = (3 * R - 1) / (2 * C)
	  H2 = (3 * R + 1) / (2 * S)
	  Select Case rScale
		Case "statute"  dScale = 1.60934
		Case "nautical" dScale = 1.85200
		Case "metric"   dScale = 1.00000
		Case Else	   dScale = 1.60934
	  End Select
	  GetGeodesicDistance = (D * (1 + fl * H1 * Sin(F)^2 * Cos(G)^2 - fl * H2 * Cos(F)^2 * Sin(G)^2)) / dScale
End Function

Response.Write "A distância entre BH e JF é " & formatNumber(GetGeodesicDistance(-19.55,-43.56,-21.46,-43.21,"metric"),2) & " km."
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz a mesma coisa sim. Não tinha visto esse outro tópico rs... e você não postou aqui.

 

Só hj encontrei essa ao ler o post sobre "Fases da Lua".

 

Boas contribuições.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ha ta, a diferença daquele outro é que ele manda a distancia em quilometros, milhas e milhas nauticas.

 

Editado

 

Achei outro, bem simples

 

<%@ Language="VBScript" %>
<html>

<head>
<title>Sample usage of Global distance calculator</title>
</head>
<%
lat1=-35.17
lon1=149.08
lat2=59.35
lon2=18.06
X = (Sin(lat1 / 57.2958) * Sin(lat2 / 57.2958)) + (Cos(lat1 / 57.2958) * Cos(lat2 / 57.2958) * Cos(lon2 / 57.2958 - lon1 / 57.2958))
miles = formatnumber(3963 * (Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)),2)
nmiles = formatnumber(3438 / 3963 * miles,2)
km = formatnumber(6378 / 3963 * miles,2)
%>

<body>

<p><small><font face="Arial" color="#0000FF">The direct distance between <%=lat1%>, <%=lon1%> and <%=lat2%>, <%=lon2%> is:<br>
</font><font color="#FF0000"><font face="Arial"><%=miles + " miles"%><br>
<%=nmiles + " nautical miles"%><br>
<%=km + " km"%></font></small><br>
</small>
</body>
</html>

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

se eu der um ponto base e uma distancia ele me retorna os registros dentro desse raio?

nao faco ideia

alguem tem uma luz pra me mostrar qual caminho pra tentar fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi, acho que neste caso daria para se usar o between, a questão neste caso era fazer o calculo da latitude e da longitude para jogar no query.

 

Interessante isso hein... se eu conseguir alguma coisa aqui eu posto aqui.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

vamos lá, seria mais ou menos assim...

 

eu pegaria atravez do google maps a latitude e a longitude do estabelecimento, todos os estabelecimentos cadastrados no sistema teria que ter os campos latitude e longitude.

 

vamos supor que eu queira cadastrar a empresa imasters com sede na rua quatro do bairro centro no número 43 em são paulo... no momento do cadastro eu colocaria os ponto exato do local no mapa e o google maps atravez da api me retornaria a longitude e a latitude deste estabelecimento que neste caso seria;

 

Latitude: 10

longitude: 50

 

Dai estes dados seriam cadastrados no bd, até ae beleza...

 

quando eu fosse chamar um estabelecimento central... ou seja aquele que o sistema iria centralizar e montar o raio em circulo de 1km eu teria que fazer uma conta para jogar no between e a partir disso o asp chamar os resultados dentro da distancia padrão...

 

Este calculo a partir dos numero latitude e longitude teria que fazer um calculo nos valores para menor e para maior...

 

seria mais ou menos criar um valor assim

 

latitude_central = 10

longitude_central = 50

 

'fazzendo o calculo diminuindo

latitude_diminuida = latitude_central - 5

longitude_diminuida = longitude_central - 5

 

'fazendo o calculo aumentando

latitude_aumentada = latitude_central + 5

longitude_aumentada = longitude_central + 5

 

até ae beleza o sistema montou variaves maior e menor do local central os valores que serão passados para o asp vão ser estes...

 

Sql = "SELECT * FROM estabelecimentos WHERE (latitude BETWEEN 5 and 15) and (longitude BETWEEN 45 AND 55)"

com isso o sistema iria buscar no bd os estabelecimentos que estiverem dentro deste raio feito neste calculo diminuindo e aumentando os valores originais do estabelecimento central.

 

No caso os resultados tem que bater tanto na latitude quanto na longitude... o sistema vai varreo o bd e pegar os estabelecimentos que estiverem na latitude de 5 a 15 e longitude de 45 a 50... então pode entrar nesta jogado os estabelecimentos com latitude 16 e longitude 49... se encontrasse um endereço com latitude 16 e longitude 46 o sistema não iria chamar, pois o valor da latitude ultrapassa o permitido que neste caso seria 15 apesar do valor longitude esta entre os permitidos.

 

a questão neste caso é calcular quanto é necessário somar em diminuição e aumentativo para dar mangens a este 1KM

 

* os dados em valores colocados por mim são exemplos, os valores da api do google maps são numeros mais complicados como (-22.25465656565 e -44.57874578)

 

mais esta ai uma idéia, a questão neste caso será o calculo a partir dela o sistema podera ser montado, da dor de cabeça porém não é impossível de se fazer não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aparentemente complicado

nunca tinha usado esse between

 

vou procurar mais sobre ele e testar pra vaer se sai alguma ideia tb

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.