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

Da Gambas-it.org - Wikipedia.

Per calcolare la distanza tra due punti geografici, dei quali si conoscono latitudine e longitudine, potremo adottare almeno due modalità.

Uso delle sole funzioni di Gambas

Si potranno utilizzare le sole funzioni native di Gambas per effettuare il necessario 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 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 dinamica 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