2012-11-07 3 views
1

주어진 위치에 가장 가까운 도시를 찾으려고합니다. 나는 내가 일하고 싶은 몇몇 도시의 위치를 ​​저장했다. 그리고 나는 나의 위치를 ​​가지고있다. 그러나 나는 나의 위치에 가장 가까운 도시를 찾는 방법을 모른다.주어진 위치에 가장 가까운 도시 찾기

Cities 
New York - Lat 40.714353; Long -74.005973 
Washington - Lat 38.895112; Long -77.036366 
....more cities 

My location 
Philadephia - Lat 39.952335; Long -75.163789 

그럼 가장 가까운 도시를 찾기 위해 어떻게 좌표를 비교해야합니까? 나는 C#으로 프로그램을하고 있지만, 단지 algorythm의 솔루션을 알고 있어요 나를 위해 enaught입니다 :) 어떤 도움 감사

답변

5

당신은이 문제를 해결하기 위해 고등학교 지식을 사용한다, 당신의 alghorithm은 다음과 같습니다

가장 가까운 = sqrt ((lat2 - lat1)^2 + (Long2-Long1)^2) 이제 공기 거리를 알려줍니다.

그래서 배열 값에 대해 이렇게하면 asort 함수를 사용하여 어느 것이 가장 가까운 지 비교할 수 있습니다.

+0

. 40 ° N에서 위도는 경도보다 긴 거리입니다. http://en.wikipedia.org/wiki/Longitude#Length_of_a_degree_of_longitude 참조하십시오. –

+0

@ EeroAaltonen 제 답변 (또는 제가 제시 한 대안 중 하나)이이를 다루지 만, 일부 목적에는 충분히 가까울 수 있으며, 더 빨리 수행 할 수 있습니다. 계산하다. 나의 유일한 반대는 불필요한'sqrt' 일 것이고, 그것은 상대적인 순서에 영향을 미치지 않을 것이다. –

0

거리 bitween 두 점 (x1, y1)과 (x2가, Y2는) 당신은 우리가해야합니다 C#에서

d = sqrt((x1 - x2)^2 + (y1 - y2)^2) 

그렇다 :

public City FindNearestCity(double currentLatitude, double currentLogitude, List<City> cities) 
{ 
    Dictionary<City, double> distances = new Dictionary<City, double>(); 
    foreach (City city in cities) 
    { 
     double distance = Math.Sqrt(Math.Pow(city.latitude - currentLatitude, 2) + Math.Pow(city.Longitude - currentLogitude, 2)); 
     distances.Add(city, distance); 
    } 
    double minimumDistance = distances.Min(distance => distance.Value); 
    return distances.First(distance => distance.Value == minimumDistance).Key; 
} 
+2

왜 'Math.Sqrt'를 사용 하는가? 결과는 여전히 그것 없이는 같은 순서로 진행될 것입니다. –

+0

@ 존 한나 네 말이 맞아.그러나 sqrt를 사용하면 변수의 이름을 지정하는 것이 더 쉽습니다. –

0

방문 here 두를 찾을 수 있습니다 C# 함수는 Brute force 및 divide-and-conquer 알고리즘을 사용하여 2 차원에서 주어진 점 집합 중 가장 가까운 두 점을 찾습니다.

+0

어떤 식 으로든 질문에 대답하지 않습니다. –

2

엄밀히 말하면 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))); 
} 
관련 문제