puntos mapa longitud latitud geograficos geograficas entre ejemplos distancia coordenadas calcular algorithm math geography

algorithm - mapa - ¿Cómo encontrar la distancia desde la latitud y la longitud de dos lugares?



latitud y longitud (12)

Tengo un conjunto de latitudes y longitudes de ubicaciones.

  • ¿Cómo encontrar la distancia de una ubicación en el conjunto a otra?
  • ¿Hay una fórmula?

A continuación está el módulo (codificado en f90) que contiene tres fórmulas discutidas en las respuestas anteriores. Puede colocar este módulo en la parte superior de su programa (antes de PROGRAMAR PRINCIPAL) o compilarlo por separado e incluir el directorio del módulo durante la compilación.

module spherical_dists contains subroutine haversine_formula(lon1,lat1,lon2,lat2,dist) implicit none real,intent(in)::lon1,lon2,lat1,lat2 real,intent(out)::dist real,parameter::pi=3.141592,mean_earth_radius=6371.0088 real::lonr1,lonr2,latr1,latr2 real::delangl,dellon,dellat,a lonr1=lon1*(pi/180.);lonr2=lon2*(pi/180.) latr1=lat1*(pi/180.);latr2=lat2*(pi/180.) dellon=lonr2-lonr1 dellat=latr2-latr1 a=(sin(dellat/2))**2+cos(latr1)*cos(latr2)*(sin(dellon/2))**2 delangl=2*asin(sqrt(a)) !2*asin(sqrt(a)) dist=delangl*mean_earth_radius end subroutine subroutine great_circle_distance(lon1,lat1,lon2,lat2,dist) implicit none real,intent(in)::lon1,lon2,lat1,lat2 real,intent(out)::dist real,parameter::pi=3.141592,mean_earth_radius=6371.0088 real::lonr1,lonr2,latr1,latr2 real::delangl,dellon lonr1=lon1*(pi/180.);lonr2=lon2*(pi/180.) latr1=lat1*(pi/180.);latr2=lat2*(pi/180.) dellon=lonr2-lonr1 delangl=acos(sin(latr1)*sin(latr2)+cos(latr1)*cos(latr2)*cos(dellon)) dist=delangl*mean_earth_radius end subroutine subroutine vincenty_formula(lon1,lat1,lon2,lat2,dist) implicit none real,intent(in)::lon1,lon2,lat1,lat2 real,intent(out)::dist real,parameter::pi=3.141592,mean_earth_radius=6371.0088 real::lonr1,lonr2,latr1,latr2 real::delangl,dellon,nom,denom lonr1=lon1*(pi/180.);lonr2=lon2*(pi/180.) latr1=lat1*(pi/180.);latr2=lat2*(pi/180.) dellon=lonr2-lonr1 nom=sqrt((cos(latr2)*sin(dellon))**2. + (cos(latr1)*sin(latr2)-sin(latr1)*cos(latr2)*cos(dellon))**2.) denom=sin(latr1)*sin(latr2)+cos(latr1)*cos(latr2)*cos(dellon) delangl=atan2(nom,denom) dist=delangl*mean_earth_radius end subroutine end module


Aplica la fórmula de Haversine para encontrar la distancia. Vea el código de C # a continuación para encontrar la distancia entre 2 coordenadas. Mejor aún si quiere decir encontrar una lista de tiendas dentro de un cierto radio, puede aplicar una cláusula WHERE en SQL o un filtro LINQ en C #.

La fórmula aquí está en kilómetros, tendrá que cambiar los números relevantes y funcionará por millas.

Eg: Convertir 6371.392896 a millas.

DECLARE @radiusInKm AS FLOAT DECLARE @lat2Compare AS FLOAT DECLARE @long2Compare AS FLOAT SET @radiusInKm = 5.000 SET @lat2Compare = insert_your_lat_to_compare_here SET @long2Compare = insert_you_long_to_compare_here SELECT * FROM insert_your_table_here WITH(NOLOCK) WHERE (6371.392896*2*ATN2(SQRT((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2))) , SQRT(1-((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2))) ))) <= @radiusInKm

Si desea realizar la fórmula Haversine en C #,

double resultDistance = 0.0; double avgRadiusOfEarth = 6371.392896; //Radius of the earth differ, I''m taking the average. //Haversine formula //distance = R * 2 * aTan2 ( square root of A, square root of 1 - A ) // where A = sinus squared (difference in latitude / 2) + (cosine of latitude 1 * cosine of latitude 2 * sinus squared (difference in longitude / 2)) // and R = the circumference of the earth double differenceInLat = DegreeToRadian(currentLatitude - latitudeToCompare); double differenceInLong = DegreeToRadian(currentLongitude - longtitudeToCompare); double aInnerFormula = Math.Cos(DegreeToRadian(currentLatitude)) * Math.Cos(DegreeToRadian(latitudeToCompare)) * Math.Sin(differenceInLong / 2) * Math.Sin(differenceInLong / 2); double aFormula = (Math.Sin((differenceInLat) / 2) * Math.Sin((differenceInLat) / 2)) + (aInnerFormula); resultDistance = avgRadiusOfEarth * 2 * Math.Atan2(Math.Sqrt(aFormula), Math.Sqrt(1 - aFormula));

DegreesToRadian es una función que he creado a medida, es un simple liner de "Math.PI * angle / 180.0

Mi entrada de blog - SQL Haversine


Aquí hay un violín con la búsqueda de ubicaciones / ubicaciones cercanas a long / lat por IP dada:

http://jsfiddle.net/bassta/zrgd9qc3/2/

Y aquí está la función que uso para calcular la distancia en línea recta:

function distance(lat1, lng1, lat2, lng2) { var radlat1 = Math.PI * lat1 / 180; var radlat2 = Math.PI * lat2 / 180; var radlon1 = Math.PI * lng1 / 180; var radlon2 = Math.PI * lng2 / 180; var theta = lng1 - lng2; var radtheta = Math.PI * theta / 180; var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta); dist = Math.acos(dist); dist = dist * 180 / Math.PI; dist = dist * 60 * 1.1515; //Get in in kilometers dist = dist * 1.609344; return dist; }

Devuelve la distancia en Kilómetros


Aquí hay uno: http://www.movable-type.co.uk/scripts/latlong.html

Usando la fórmula de Haversine:

R = earth’s radius (mean radius = 6,371km) Δlat = lat2− lat1 Δlong = long2− long1 a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2) c = 2.atan2(√a, √(1−a)) d = R.c




Estás buscando

Fórmula Haversine

La fórmula de haversine es una ecuación importante en la navegación, que proporciona distancias de gran círculo entre dos puntos en una esfera desde sus longitudes y latitudes. Es un caso especial de una fórmula más general en trigonometría esférica, la ley de haversines, que relaciona los lados y ángulos de "triángulos" esféricos.


La fórmula de Haversine supone una tierra esférica. Sin embargo, la forma de la oreja es más compleja. Un modelo de esferoide oblato dará mejores resultados.

Si tal precisión es necesaria, debería usar mejor la fórmula inversa de Vincenty . Ver http://en.wikipedia.org/wiki/Vincenty''s_formulae para más detalles. Utilizándolo, puede obtener una precisión de 0,5 mm para el modelo de esferoides.

No existe una fórmula perfecta , ya que la forma real de la tierra es demasiado compleja para ser expresada por una fórmula. Además, la forma de la tierra cambia debido a los eventos climáticos (ver http://www.nasa.gov/centers/goddard/earthandsun/earthshape.html ), y también cambia con el tiempo debido a la rotación de la tierra.

También debe tener en cuenta que el método anterior no tiene en cuenta las altitudes, y asume un esferoide oblato a nivel del mar.

Editar 10-Jul-2010: descubrí que hay situaciones excepcionales para las cuales la fórmula inversa de Vincenty no converge a la precisión declarada. Una mejor idea es usar GeographicLib (ver http://sourceforge.net/projects/geographiclib/ ) que también es más preciso.


Terminé de usar la consulta SQL

select , (acos (sin (input_lat 0.01745329) * sin (latitud * 0.01745329) + cos (input_lat * 0.01745329) * cos (latitud * 0.01745329) * cos ((input_long -longitude) 0.01745329)) 57.29577951) * 69.16 As D from table_name



solo usa la fórmula de distancia Sqrt( (x2-x1)^2 + (y2-y1)^2 )


Este enlace contiene toda la información que necesita, ya sea en ella o vinculada.