Как да изчислим разстоянието между две точки, зададени чрез географска ширина и дължина?
За уточнение, искам да получа разстоянието в километри; точките използват системата WGS84 и бих искал да разбера относителната точност на наличните подходи.
Този линк може да ви бъде полезен, тъй като в него подробно се описва използването на формулата на Хаверсин за изчисляване на разстоянието.
Откъс:
Този скрипт [в Javascript] изчислява разстоянията между две точки с голяма окръжност - т.е. най-краткото разстояние по земната повърхност - с помощта на 'Haversine' формула.
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)
}
Ето една реализация на 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;
}
}
За да изчислите разстоянието между две точки върху сфера, трябва да направите Изчисляване на голяма окръжност.
Има редица библиотеки на C/C++, които помагат при проектирането на карти в MapTools, ако трябва да прехвърлите разстоянията върху плоска повърхност. За да направите това, ще се нуждаете от проекционния низ на различните координатни системи.
Може също така да намерите MapWindow за полезен инструмент за визуализиране на точките. Освен това, тъй като е с отворен код, тя е полезно ръководство за използване на библиотеката proj.dll, която изглежда е основната библиотека за проекции с отворен код.