Ako vypočítam vzdialenosť medzi dvoma bodmi zadanými zemepisnou šírkou a dĺžkou?
Na vysvetlenie by som chcel vzdialenosť v kilometroch; body používajú systém WGS84 a rád by som pochopil relatívnu presnosť dostupných prístupov.
Tento odkaz by vám mohol byť nápomocný, pretože podrobne opisuje použitie Haversinovho vzorca na výpočet vzdialenosti.
Úryvok:
Tento skript [v Javascripte] vypočíta vzdialenosti veľkých kružníc medzi dvoma bodmi - to znamená najkratšiu vzdialenosť nad zemským povrchom - pomocou 'Haversinovho' vzorca.
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2-lat1); // deg2rad below
var dLon = deg2rad(lon2-lon1);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; // Distance in km
return d;
}
function deg2rad(deg) {
return deg * (Math.PI/180)
}
Tu je implementácia v jazyku C#:
static class DistanceAlgorithm
{
const double PIx = 3.141592653589793;
const double RADIUS = 6378.16;
/// <summary>
/// Convert degrees to Radians
/// </summary>
/// <param name="x">Degrees</param>
/// <returns>The equivalent in radians</returns>
public static double Radians(double x)
{
return x * PIx / 180;
}
/// <summary>
/// Calculate the distance between two places.
/// </summary>
/// <param name="lon1"></param>
/// <param name="lat1"></param>
/// <param name="lon2"></param>
/// <param name="lat2"></param>
/// <returns></returns>
public static double DistanceBetweenPlaces(
double lon1,
double lat1,
double lon2,
double lat2)
{
double dlon = Radians(lon2 - lon1);
double dlat = Radians(lat2 - lat1);
double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
return angle * RADIUS;
}
}
Ak chcete vypočítať vzdialenosť medzi dvoma bodmi na guli, musíte vykonať výpočet veľkej kružnice.
Na stránke MapTools existuje niekoľko knižníc v jazyku C/C++, ktoré vám pomôžu s premietaním mapy, ak potrebujete premietnuť vzdialenosti na rovný povrch. Na to budete potrebovať projekčný reťazec rôznych súradnicových systémov.
Užitočným nástrojom na vizualizáciu bodov vám môže byť aj MapWindow. Keďže ide o otvorený zdrojový kód, je to aj užitočný návod na používanie knižnice proj.dll, ktorá je zrejme základnou knižnicou pre projekciu s otvoreným zdrojovým kódom.