Calcolare la distanza tra due punti geografici, dei quali si conoscono latitudine e longitudine
Di seguito mostriamo alcune modalità per calcolare la distanza tra due punti geografici, dei quali si conoscono latitudine e longitudine.
Indice
Uso delle sole funzioni di Gambas
L'uso delle sole funzioni native di Gambas ci consente di adottare almeno due modalità.
Uso delle funzioni matematiche di Gambas
In questo caso si dovrà effettuare un particolare calcolo:
Public Sub Main() Dim d, Lat_1, Lat_2, Long_1, Long_2 As Float Lat_1 = Latitudine del 1° punto (esempio: 38.482391) Lat_2 = Latitudine del 2° punto (esempio: 22.5004198) Long_1 = Longitudine del 1° punto Long_2 = Longitudine del 2° punto d = ACos(Cos(Rad(90 - Lat_1)) * Cos(Rad(90 - Lat_2)) + Sin(Rad(90 - Lat_1)) * Sin(Rad(90 - Lat_2)) * Cos(Rad(Long_1 - Long_2))) * 6371 * 1000 Print d; " metri" End
Uso della Classe MapPoint del Componente gb.map
Si potrà anche utilizzare il Metodo ".Distance()" della Classe MapPoint del Componente gb.map.
Mostriamo un semplice esempio, nel quale calcoleremo la distanza fra l'isola di Lampedusa e l'isola di Linosa:
Public Sub Button1_Click() Dim mp, mp1, mp2 As New MapPoint Dim dis As Float mp1.Lat = 35.6441034 mp1.Lon = 12.3563468 mp2.Lat = 35.8577066 mp2.Lon = 12.8566227 dis = mp.Distance(mp1, mp2) Print dis; " metri" ' ...o più semplicemente con la Classe statica "MapPoint": Print MapPoint.Distance(mp1, mp2) End
Uso delle risorse della libreria libgps
E' possibile utilizzare in particolare la funzione esterna "earth_distance()" della libreria condivisa: "libgps.so.23.0.0 ":
Library "libgps:23.0.0" ' double earth_distance(double, double, double, double) Private Extern earth_distance(lat1 As Float, lon1 As Float, lat2 As Float, lon2 As Float) As Float Public Sub Main() dim dist as Float dist = earth_distance(35.6441034, 12.3563468, 35.8577066, 12.8566227) Print dist; " metri" End
Uso di alcune funzioni esterne della libreria libgeocode-glib
Si potrà anche fare uso di alcune funzioni esterne della libreria libgeocode-glib.
Sarà necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "libgeocode-glib.so.0.0.0 "
Mostriamo un semplice esempio, nel quale calcoleremo la distanza fra l'isola di Lampedusa e l'isola di Linosa:
Library "libgeocode-glib:0.0.0" ' GeocodeLocation * geocode_location_new (gdouble latitude, gdouble longitude, gdouble accuracy) ' Creates a new GeocodeLocation object. Private Extern geocode_location_new(latitude As Float, longitude As Float, accuracy As Float) As Pointer ' double geocode_location_get_distance_from (GeocodeLocation *loca, GeocodeLocation *locb) ' Calculates the distance in km, along the curvature of the Earth, between 2 locations. Private Extern geocode_location_get_distance_from(loca As Pointer, locb As Pointer) As Float ' void g_object_unref (gpointer object) ' Decreases the reference count of object. Private Extern g_object_unref(gobject As Pointer) Public Sub Main() Dim geo1, geo2 As Pointer Dim dist As Float geo1 = geocode_location_new(35.6441034, 12.3563468, 0.0) geo2 = geocode_location_new(35.8577066, 12.8566227, 0.0) dist = geocode_location_get_distance_from(geo1, geo2) Print "Km "; dist ' Libera la memoria precedentemente allocata da "libgeocode-glib": g_object_unref(geo2) g_object_unref(geo1) End