2009-07-10 29 views
5

¿Cuál es la fórmula para calcular la distancia entre 2 geocodificaciones? He visto algunas de las respuestas en este sitio, pero básicamente dicen que confían en las funciones de SQL Server 08, todavía no estoy en 08. Cualquier ayuda sería apreciada.Distancia entre 2 geocodificaciones

Respuesta

-1

el teorema de pythagorean?

+1

Por desgracia, la tierra no es plana. –

+0

Depende de la proyección que esté utilizando. Hay una proyección de plano estatal que es muy precisa en distancias relativamente cortas. Con una proyección de plano estatal, el teorema de Pitágoras está bien. Si está utilizando coordenadas de latitud/longitud, que ya están expresadas en ángulos (no distancias), no puede usar el teorema de Pythogorean. –

0

Usted está buscando la longitud de la ruta ortodrómica entre dos puntos de una esfera. Intente buscar "Great Circle Path" o "Great Circle Distance" en Google.

0

Disculpe, no sé en qué país se encuentra. ¿Estamos hablando de Easting y Northings (Reino Unido, sistema de Ordance Survey) o Lat/Long o algún otro sistema? Si hablamos de Este y Norte, entonces puede usar
sqr ((x1-x2)^2 + (y1-y2)^2)
Esto no permite que la tierra sea una esfera, sino distancias cortas que no notará. Lo usamos en el trabajo para distancias entre puntos dentro del condado.
Tenga cuidado con la referencia de cuadrícula más larga que utiliza. Creo que una referencia de 8 cifras te dará una distancia en metros. Podré obtener una respuesta definitiva en el trabajo la próxima semana si nadie más la ha suministrado.

0

el teorema de Pitágoras como los ofrecidos por otros aquí no funciona tan bien.

La mejor, respuesta simple es para aproximar la tierra como una esfera (es en realidad una esfera ligeramente achatada, pero esto es muy cerca). En Haskell, por ejemplo, puede utilizar la siguiente, pero la matemática puede ser transcrito en casi cualquier cosa:

distRadians (lat1,lon1) (lat2,lon2) = 
    radius_of_earth * 
    acos (cos lat1 * cos lon1 * cos lat2 * cos lon2 + 
      cos lat1 * sin lon1 * cos lat2 * sin lon2 + 
      sin lat1 * sin lat2) where 
    radius_of_earth = 6378 -- kilometers 


distDegrees a b = distRadians (coord2rad a) (coord2rad b) where 
    deg2rad d = d * pi/180 
    coord2rad (lat,lon) = (deg2rad lat, deg2rad lon) 

distRadians requiere sus ángulos que se dan en radianes.

distDegrees es una función de ayuda que puede tomar latitudes y longitudes en grados.

Ver this series of posts para obtener más información sobre la derivación de esta fórmula.

Si realmente necesita la precisión adicional otorgado por supuesto de la tierra es elipsoidal, consulte estas preguntas frecuentes: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html

2

Esto lo hará por usted en C#.

Dentro del espacio de nombres poner estas:

public enum DistanceType { Miles, Kilometers }; 

public struct Position 
{ 
    public double Latitude; 
    public double Longitude; 
} 

class Haversine 
{ 

    public double Distance(Position pos1, Position pos2, DistanceType type) 
    { 
     double preDlat = pos2.Latitude - pos1.Latitude; 
     double preDlon = pos2.Longitude - pos1.Longitude; 
     double R = (type == DistanceType.Miles) ? 3960 : 6371; 
     double dLat = this.toRadian(preDlat); 
     double dLon = this.toRadian(preDlon); 
     double a = Math.Sin(dLat/2) * Math.Sin(dLat/2) + 
     Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) * 
     Math.Sin(dLon/2) * Math.Sin(dLon/2); 
     double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a))); 
     double d = R * c; 
     return d; 
    } 

    private double toRadian(double val) 
    { 
     return (Math.PI/180) * val; 
    } 

Luego de utilizar estos en el código principal:

Position pos1 = new Position(); 
        pos1.Latitude = Convert.ToDouble(hotelx.latitude); 
        pos1.Longitude = Convert.ToDouble(hotelx.longitude); 
        Position pos2 = new Position(); 
        pos2.Latitude = Convert.ToDouble(lat); 
        pos2.Longitude = Convert.ToDouble(lng); 
        Haversine calc = new Haversine(); 

        double result = calc.Distance(pos1, pos2, DistanceType.Miles); 
2

Si

  • sabe que los 2 puntos son "no demasiado lejos el uno del otro "
  • y usted tolera un error "razonablemente pequeño".

Entonces, considere que la tierra es plana entre los 2 puntos:

  • La diferencia de distancia en la dirección de latitud es EarthRadius * latitude difference
  • La diferencia de distancia en la dirección longitud es EarthRadius * longitude difference * cos(latitude). Multiplicamos por cos(lat) porque los grados de longitud no hacen la misma distancia de km si la latitud cambia. Como P1 y P2 son estrechos, cos (latP1) está cerca de cos (latP2)
  • Entonces Pythagore

En JavaScript:

function ClosePointsDistance(latP1, lngP1, latP2, lngP2) { 
    var d2r = Math.PI/180, 
    R=6371; // Earth Radius in km 
    latP1 *= d2r; lngP1 *= d2r; latP2 *= d2r; lngP2 *= d2r; // convert to radians 
    dlat = latP2 - latP1, 
    dlng = (lngP2 - lngP1) * Math.cos(latP1); 
    return R * Math.sqrt(dlat*dlat + dlng*dlng); 
} 

he comprobado entre París y Orleans (Francia): la fórmula encuentra 110.9 km, mientras que la fórmula (exacta) de Haversine encuentra 111.0 km.

!!! Tenga cuidado con las situaciones alrededor del meridiano 0 (puede cambiarlo): si P1 está en Lng 359 y P2 está en Lng 0, la función los considerará anormalmente lejanos.

1

Aquí hay una manera de hacerlo si está utilizando el servidor sql.

CREATE function dist (@Lat1 varchar(50), @Lng1 varchar(50),@Lat2 varchar(50), @Lng2 varchar(50)) 
returns float 
as 
begin 

declare @p1 geography 
declare @p2 geography 

set @p1 = geography::STGeomFromText('POINT('+ @Lng1+' '+ @Lat1 +')', 4326) 
set @p2 = geography::STGeomFromText('POINT('+ @Lng2+' '+ @Lat2 +')', 4326) 

return @p1.STDistance(@p2) 
end 
Cuestiones relacionadas