¿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
Uso una aproximación de la tierra y la fórmula Haversine. Usted puede obtener una versión Javascript en el siguiente enlace, que se puede traducir al idioma de su elección:
http://www.movable-type.co.uk/scripts/latlong.html
Aquí es otra forma: http://escience.anu.edu.au/project/04S2/SE/3DVOT/3DVOT/pHatTrack_Application/Source_code/pHatTrack/Converter.java
el teorema de pythagorean?
Echa un vistazo aquí para una versión de SQL Server 2000 SQL Server Zipcode Latitude/Longitude proximity distance search
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.
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.
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
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);
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 porcos(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.
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
- 1. distancia entre 2 códigos postales
- 2. Algoritmo para calcular una distancia entre 2 puntos tridimensionales?
- 3. Distancia entre matrices numpy, columna
- 4. Distancia entre geopoints
- 5. "Distancia" entre colores en PHP
- 6. Distancia entre la expresión regular
- 7. Distancia física entre dos lugares
- 8. Distancia entre dos teléfonos Android
- 9. Android - Distancia entre dos ciudades
- 10. la distancia entre dos puntos Android
- 11. Distancia entre dos lat, lon puntos
- 12. Cálculo de la distancia entre dos puntos
- 13. Distancia entre dos ubicaciones: Google Maps
- 14. Medir la distancia entre dos dispositivos iOS
- 15. Usando PHP y google Maps Api para calcular la distancia entre 2 códigos postales (UK)
- 16. Distancia entre 2 PUNTOS en Postgis en srid 4326 en metros
- 17. Establecer distancia entre tramos usando el margen
- 18. Encontrar la distancia entre dos círculos
- 19. Distancia entre dos coordenadas con CoreLocation
- 20. cómo encontrar la distancia entre dos geopoints?
- 21. ¿Cómo encuentro la distancia entre dos puntos?
- 22. Cómo obtener la distancia entre dos divs
- 23. Obtener la distancia entre dos puntos geográficos
- 24. Android distancia calcular entre dos ubicaciones
- 25. Distancia entre dos polígonos convexos en 3D
- 26. Encontrar la distancia entre CLLocationCoordinate2D puntos
- 27. Calcule la distancia social entre dos usuarios
- 28. distanceFromLocation - Calcular la distancia entre dos puntos
- 29. La distancia entre dos ubicaciones no es correcta
- 30. calcular la distancia dados 2 puntos, latitud y longitud
Por desgracia, la tierra no es plana. –
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. –