Hoe bereken ik de afstand tussen twee punten gespecificeerd door breedtegraad en lengtegraad?
Ter verduidelijking, ik wil de afstand in kilometers; de punten gebruiken het WGS84-systeem en ik wil de relatieve nauwkeurigheid van de beschikbare benaderingen begrijpen.
Deze link kan nuttig voor u zijn, omdat hij het gebruik van de Haversinus-formule om de afstand te berekenen in detail beschrijft.
Uittreksel:
Dit script [in Javascript] berekent grootcirkelafstanden tussen twee punten - dat is de kortste afstand over het aardoppervlak - met behulp van de 'Haversine' formule.
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)
}
Hier is een C# implementatie:
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;
}
}
Om de afstand tussen twee punten op een bol te berekenen moet je de Grote cirkel berekening doen.
Er zijn een aantal C/C++ bibliotheken om te helpen met kaartprojectie bij MapTools als u uw afstanden moet herprojecteren naar een plat vlak. Om dit te doen heb je de projectiestring van de verschillende coördinatenstelsels nodig.
Misschien vindt u MapWindow ook een handig hulpmiddel om de punten te visualiseren. Omdat het open source is, is het ook een handige gids voor het gebruik van de proj.dll bibliotheek, die de kern lijkt te zijn van de open source projectiebibliotheek.