Enlem ve boylam ile belirtilen iki nokta arasındaki mesafeyi nasıl hesaplayabilirim?
Açıklığa kavuşturmak için, mesafeyi kilometre cinsinden istiyorum; noktalar WGS84 sistemini kullanıyor ve mevcut yaklaşımların göreceli doğruluklarını anlamak istiyorum.
Bu link, mesafeyi hesaplamak için Haversine formülü kullanımını detaylandırdığı için size yardımcı olabilir.
Alıntı:
Bu komut dosyası [Javascript'te] iki nokta arasındaki büyük daire mesafelerini hesaplar - yani, dünya yüzeyi üzerindeki en kısa mesafedir - bu mesafeyi 'Haversine' formülü.
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)
}
İşte bir C# Uygulaması:
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;
}
}
Bir küre üzerindeki iki nokta arasındaki mesafeyi hesaplamak için Büyük Daire hesaplaması yapmanız gerekir.
Mesafelerinizi düz bir yüzeye yeniden yansıtmanız gerekiyorsa MapTools adresinde harita projeksiyonuna yardımcı olacak bir dizi C/C++ kütüphanesi vardır. Bunu yapmak için çeşitli koordinat sistemlerinin projeksiyon dizisine ihtiyacınız olacaktır.
Ayrıca noktaları görselleştirmek için MapWindow kullanışlı bir araç olabilir. Ayrıca açık kaynak olduğu için, temel açık kaynak projeksiyon kütüphanesi gibi görünen proj.dll kütüphanesinin nasıl kullanılacağına dair yararlı bir kılavuzdur.