Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

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."
%>

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

aparentemente complicado

nunca tinha usado esse between

 

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

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.