Come trovare la distanza dalla latitudine e dalla longitudine di due posizioni?

Ho una serie di latitudini e longitudini di posizioni.

  • Come trovare la distanza da una posizione nel set a un’altra?
  • C’è una formula?

La formula di Haversine assume una terra sferica. Tuttavia, la forma dell’orecchio è più complessa. Un modello sferoidale oblato darà risultati migliori.

Se è necessaria tale precisione, è meglio usare la formula inversa di Vincenty . Vedi http://en.wikipedia.org/wiki/Vincenty's_formulae per i dettagli. Usandolo, è ansible ottenere una precisione di 0,5 mm per il modello sferoide.

Non esiste una formula perfetta , poiché la forma reale della terra è troppo complessa per essere espressa da una formula. Inoltre, la forma della terra cambia a causa degli eventi climatici (vedi http://www.nasa.gov/centers/goddard/earthandsun/earthshape.html ), e cambia anche nel tempo a causa della rotazione della terra.

Dovresti anche notare che il metodo sopra non prende in considerazione le altitudini e presuppone uno sferoide oblato a livello del mare.

Modifica 10-Jul-2010: ho scoperto che ci sono situazioni rare per le quali la formula inversa di Vincenty non converge all’accuratezza dichiarata. Un’idea migliore è usare GeographicLib (vedi http://sourceforge.net/projects/geographiclib/ ) che è anche più preciso.

Eccone uno: http://www.movable-type.co.uk/scripts/latlong.html

Usando la formula di 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 = Rc 

Applica la formula di Haversine per trovare la distanza. Vedere il codice C # qui sotto per trovare la distanza tra 2 coordinate. Meglio ancora se vuoi dire di trovare un elenco di negozi entro un certo raggio, potresti applicare una clausola WHERE in SQL o un filtro LINQ in C #.

La formula qui è in chilometri, dovrai cambiare i numeri rilevanti e funzionerà per miglia.

Ad esempio: convertire 6371.392896 in miglia.

  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 

Se desideri eseguire la formula di Haversine in 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 è una funzione creata da me, è una semplice fodera di "Math.PI * angle / 180.0

Il mio post di blog - SQL Haversine

Stai cercando

Formula di Haversine

La formula haversine è un’equazione importante per la navigazione, che consente di ottenere grandi distanze tra i due punti di una sfera dalle loro longitudini e latitudini. È un caso speciale di una formula più generale nella trigonometria sferica, la legge delle haversine, che mette in relazione i lati e gli angoli dei “triangoli” sferici.

Date un’occhiata a questo .. ha un esempio javascript pure.

Trova distanza

Usa la formula di grande distanza del cerchio .

Questo link ha tutte le informazioni che ti servono, su di esso o collegate.

ecco un violino con la ricerca di posizioni / near locations to long / lat dato IP:

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

Ed ecco la funzione che uso per calcolare la distanza in linea retta:

 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; } 

Restituisce la distanza in chilometri

In questa pagina puoi vedere l’intero codice e le formule in che modo vengono calcolate le distanze delle posizioni nella class Location di Android

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/android/location/Location.java#Location.computeDistanceAndBearing%28double%2Cdouble%2Cdouble% 2Cdouble% 2Cfloat []% 29

Di seguito è riportato il modulo (codificato in f90) contenente tre formule discusse nelle risposte precedenti. Puoi mettere questo modulo nella parte superiore del tuo programma (prima di PROGRAM MAIN) o compilarlo separatamente e includere la directory del modulo durante la compilazione.

 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 

Ho finito di usare la query SQL

selezionare , (acos (sin (input_lat 0.01745329) * sin (lattitude * 0.01745329) + cos (input_lat * 0.01745329) * cos (lattitude * 0.01745329) * cos ((input_long -longitude) 0.01745329)) 57.29577951) * 69.16 As D di table_name

basta usare la formula della distanza Sqrt( (x2-x1)^2 + (y2-y1)^2 )