2013-06-14 3 views
1

ISO 3166 국가 코드 목록 (240 개)과 8 개 국가/지역/지역 목록 (오스트레일리아, 덴마크, 네덜란드, 카타르, 남아프리카 공화국, UAE, 영국 &) 목록이 있습니다. 미국). 나는 국가 코드 목록을 살펴보고 각각에 대해 8의 목록에서 가장 가까운 국가 코드를 찾아 내고 싶다. 미터법 (지리적 거리, 직선 거리, 주행 시간 등)은 특히 중요하지 않은만큼 중요합니다.목록에서 가장 가까운 국가를 찾는 방법

8 개 장소 목록은 정기적으로 변경 될 수 있으므로 수동으로 작업을 수행하는 것은 비실용적입니다. Google Maps API를 사용해 보았지만 지금까지 성공하지 못했습니다. 이상적인 해법은 PHP에있을 것이고, 국가 코드와 인덱스로 가장 가까운 국가 (8의 목록에서)를 값으로 갖는 배열이 될 것입니다. 어떤 도움을 주셔서 감사합니다!

답변

1

GeoNames을 프로젝트는 이제 지리적 coorindates 사이의 거리를 얻을 수 있습니다

http://www.geonames.org/

을 사용할 수있는 공공 데이터가 있습니다.

function distance($lat1, $lng1, $lat2, $lng2, $miles = true) 
{ 
    $pi80 = M_PI/180; 
    $lat1 *= $pi80; 
    $lng1 *= $pi80; 
    $lat2 *= $pi80; 
    $lng2 *= $pi80; 

    $r = 6372.797; // mean radius of Earth in km 
    $dlat = $lat2 - $lat1; 
    $dlng = $lng2 - $lng1; 
    $a = sin($dlat/2) * sin($dlat/2) + cos($lat1) * cos($lat2) * sin($dlng/2) * sin($dlng/2); 
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 
    $km = $r * $c; 

    return ($miles ? ($km * 0.621371192) : $km); 
} 

국가의 수도를 사용할 수 있습니다. 큰 국가의 경우 경계선 근처에 더 많은 국가를 추가해야합니다.

이것이 하나의 해결책입니다. 데이터베이스에 국가를 대략적으로 나타내는 기하학적 도형을 저장하고 정확한 쿼리를 만들 수도 있습니다 ...

그러나 출발점은 데이터입니다. 너는 실제로 무엇을 원합니까? 어떤 데이터가 있습니까?

효율성이 문제라면 모든 국가가 저장되어 있고 국경 국가와 연결되어있는 그래프를 작성하는 것이 좋습니다. 국경 국가 만 보면이 계산 작업이 크게 줄어 듭니다.

+0

감사합니다. 이것은 정말로 유망 해 보입니다! 매개 변수는 어떤 형식입니까? N/S 및 E/W 각각 양수 및 음수? –

+0

현재 가지고있는 데이터는 모든 ISO 3166-1 국가의 목록과 위에 나열된 8 개 장소의 목록입니다. 원하는 데이터는 ISO 3166의 각 국가가 8 개 장소 중 가장 가까운 곳과 연결되도록하는 것입니다. 저는 테이블에 국가를 저장하고 장소를 간단한 테이블로 저장하여 MySQL에 데이터를 저장합니다. 매우 단순한 데이터 구조이지만 의도 한 목적입니다. 위와 같은 함수는 필요한 데이터를 제공하는 방법을 알면 완벽 할 것입니다. –

+0

조언이 필요하십니까? –