엄밀히 말하면 Haversine formula을 사용하고 싶습니다.
그러나 북쪽 또는 먼 남쪽 지점에서 약간 벗어날 수는 있지만, Mercator 투영법은 거리에 대해 정확하고 지구의 곡률을 무시하는 것으로 가장 할 수 있습니다. 오류가 더 클 때 더 많은 포인트가 목표 지점에서 오는 것처럼 많은 도시를 가질 예정인 경우 특히 그렇습니다.
relDist = √((xLat - yLat) × (xLat - yLat) + (xLng - yLng) × (xLng - yLng))
을하지만 상대 순서 만 신경 (만 얻을 수)부터, 당신은 무거운 단계 제곱근 비트, 건너 뛸 수 있습니다 : 그러므로 당신은 단지 '피타고라스을 사용
relDist = (xLat - yLat) × (xLat - yLat) + (xLng - yLng) × (xLng - yLng)
을
실제 좌표의 배수로 좌표를 저장하면 (예 : New York 's (40.664167, -73.938611)을 쌍으로 저장하는 경우 (406642, -)는 정수로 합리적으로 수행 할 수 있습니다. 739386). 주어진 지점에 근접한 순서로 많은 수의 장소를 신속하게 정렬하려는 경우 큰 도움이 될 수 있습니다.
당신이 정말로 지구가 둥글다는 사실에 직면 정밀 걱정하지만하면 다음과 같은 구현은 하버 사인이 매우 옳지 않다
private const double radiusE = 6378135; // Equatorial radius
private const double radiusP = 6356750; // Polar radius
private const double radianConv = 180/Math.PI;
public static double GetDistanceBetweenPoints(double lat1, double long1, double lat2, double long2)
{
double dLat = (lat2 - lat1)/radianConv;
double dLong = (long2 - long1)/radianConv;
double a = Math.Sin(dLat/2) * Math.Sin(dLat/2) + Math.Cos(lat2) * Math.Sin(dLong/2) * Math.Sin(dLong/2);
return Math.Sqrt((Math.Pow(radiusE * radiusP * Math.Cos(lat1/radianConv), 2))/(Math.Pow(radiusE * Math.Cos(lat1/radianConv), 2) + Math.Pow(radiusP * Math.Sin(lat1/radianConv), 2))) * (2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)));
}
. 40 ° N에서 위도는 경도보다 긴 거리입니다. http://en.wikipedia.org/wiki/Longitude#Length_of_a_degree_of_longitude 참조하십시오. –
@ EeroAaltonen 제 답변 (또는 제가 제시 한 대안 중 하나)이이를 다루지 만, 일부 목적에는 충분히 가까울 수 있으며, 더 빨리 수행 할 수 있습니다. 계산하다. 나의 유일한 반대는 불필요한'sqrt' 일 것이고, 그것은 상대적인 순서에 영향을 미치지 않을 것이다. –