2009-11-03 19 views
6

Me gustaría crear una función que calcule la distancia entre dos pares de lat/longs usando el teorema de pythag en lugar de la fórmula gran círculo de haversine. Dado que esto será sobre distancias relativamente cortas (3 km), creo que esta versión que supone una tierra plana debería estar bien. ¿Cómo puedo hacer esto? Le pregunté a Internet y no se me ocurrió nada útil. :)Calculando la distancia entre dos puntos usando el teorema de Pitágoras

Gracias.

EDIT:

Esto es lo que ocurrió con (parece estar funcionando):

def get_dist(lat0, lng0, lat1, lng1) 
    begin 
    d_ew = (lng1.to_f - lng0.to_f) * Math.cos(lat0.to_f) 
    d_ns = (lat1.to_f - lat0.to_f) 
    d_lu = Math.sqrt(d_ew.to_f * d_ew.to_f + d_ns.to_f * d_ns.to_f) 
    d_mi = ((2*Math::PI*3961.3)/360)*d_lu 
    return d_mi 
    rescue Exception => ex 
    logger.debug "[get_dist] An exception occurred: #{ex.message}" 
    return -1 
    end 
end 
+13

mejor cotización nunca: "Me preguntó internet y no llegar a nada útil." –

+0

Definitivamente usando eso para mi generador de presupuestos para mi sitio. – user

+0

Sugiero que hagas tu mejor intento y vamos a ir desde allí (publica lo que tienes hasta ahora!) –

Respuesta

14

Usted puede usar un simple triángulo de Pitágoras si espera que las distancias a ser pequeño en comparación con el tamaño de la tierra.

Supongamos que está en (lat0, long0) y desea saber la distancia a un punto (lat1, long1) en "unidades de latitud".

Horizontal (EW) distancia es aproximadamente

d_ew = (long1 - long0) * cos(lat0) 

Esto se multiplica por cos (Lat0) para dar cuenta de las líneas de longitud cada vez más cerca juntos en altas latitudes.

vertical (NS) la distancia es más fácil

d_ns = (lat1 - lat0) 

Así que la distancia entre los dos puntos es

d = sqrt(d_ew * d_ew + d_ns * d_ns) 

Puede refinar este método para las tareas más exigentes, pero esto debe ser lo suficientemente bueno para comparando distancias

De hecho, para comparar distancias, estará bien comparar d al cuadrado, lo que significa que puede omitir la operación sqrt.

+0

++ 1 - el tuyo es más simple que el mío, así que eliminé el mío . –

+0

perfecto, gracias: D – cakeforcerberus

+0

por curiosidad, si obtengo distancia horizontal, ¿hay alguna manera de convertir eso en km o millas? – cakeforcerberus

3

Bueno, como sus puntos están cerca uno del otro, la superficie de la esfera es casi plana, así que encuentre las coordenadas de los puntos en el espacio 3D, así que encuentre (x, y, z) para cada uno de los puntos, donde

x = r*sin(lat)*cos(long) 
y = r*sin(lat)*sin(long) 
z = r*cos(lat) 

donde r es el radio de la esfera. o algo así dependiendo de cómo defina lat/long. Una vez que tenga los dos coords xyz, simplemente use sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2). Realmente no puedes usar una teorema de Pitágoras 2D ya que necesitarías obtener coordenadas 2D razonables, lo cual es difícil.

+0

Definitivamente valdría la pena comparar el resultado de este enfoque con mis bidágoras bidimensionales con cos (lat). Es posible que obtenga resultados más aceptables como este. –

1

Normalmente verá esta notación 'dy, dx' que significa diferencia y diferencia x. Simplemente resuelve las diferencias en ambos ejes, obtiene la raíz cuadrada de ambas diferencias al cuadrado según el teórico (la suma del bombo es igual al cuadrado de los otros dos lados).

var dx:Number = x1-x2; 
var dy:Number = y1-y2; 
var distance:Number = Math.sqrt(dx*dx + dy*dy); 

Esperamos que este sea lo suficientemente clara

Cuestiones relacionadas