Calcolare la distanza tra due punti geografici, dei quali si conoscono latitudine e longitudine

Da Gambas-it.org - Wikipedia.

Di seguito mostriamo alcune modalità per calcolare la distanza tra due punti geografici, dei quali si conoscono latitudine e longitudine.

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


Riferimenti