출처 : http://blog.naver.com/blow1/150106632098


해당 위도와 경도가  주어진 구역반경에 들어오는지 체크 한다.

 

아래는 위,경도를 통한 도분초를 계산하는 방법이며 마지막에 실제 함수를 작성하였다.

 

구글 거리계산기와 아래 함수를 비교하여 보니 정확한 계산치를 확인 할 수 있었다.

 

하지만, 아래 계산법은 우리 나라에 한해서만 적용되어야 할 듯 하다.( 서핑 하다 보니 이러저러한 이유로 지구 전체에 대한 것은 좀더 상세한 계산법이 필요 할 듯 하다)


 lat : 위도 , lon: 경도.

 

 ex>35.3036944

 도 : 35
 분 : 0.3036944 * 60 : int : 18
 초 : (0.3036944 * 60 - 18)*60 : 13.3

 35도 18분 13.3초


  A 지점 : 동경 127도 30분 20초    북위 : 36도 27분 08초 
  B 지점 : 동경 127도 29분 30초    북위 : 36도 28분 00초 
  C 지점 : 경도  00도   1분 10초    위도 : 00도 01분 08초

  경도간 거리 : 0도*88.8 +  1분 * 1.48 + 10초 * 0.025 = 1.73km
  위도간 거리 : 0도*111  +  1분 * 1.85 +   8초 * 0.031 = 2.10km

  두지점간 거리 : 루트 (1.73^2 + 2.10^2) = 2.72km

 

#define DIV_VALUE    10000000

 

int distanceCmp(unsigned int lat1, // 기준 위도,

unsigned int lon1, // 기준 경도,

unsigned int lat2,  // 대상 위도,

unsigned int lon2,  // 대상 경도

unsigned int nCmpLat, // 위도간 거리

unsigned int nCmpLon // 경도간 거리

)

{

/*

위도,경도에 대한 절대값 계산

*/
 double lon = lon1 > lon2  ? (lon1 - lon2)/(double)DIV_VALUE   : (lon2-lon1)/(double)DIV_VALUE;
 double lat =  lat1 > lat2  ? (lat1 - lat2)/(double)DIV_VALUE   : (lat2-lat1)/(double)DIV_VALUE;

 

/*

경도에 대한 도분초및 거리 계산

*/
 int rad = (int)lon;
 int min = (lon-rad)*60;
 double sec = ((lon-rad)*60 - min)*60;
 unsigned int lon_dist, lat_dist;

 lon_dist = ((rad * 88.8) + (min*1.48) + (sec*0.025)) * 1000; // m단위

 

/*

위도에 대한 도분초및 거리 계산

*/

 rad = (int)lat;
 min = (lat-rad)*60;
 sec = ((lat-rad)*60 - min)*60;

 lat_dist = ((rad * 111) + (min*1.85) + (sec*0.031)) * 1000; // m단위

 

 if( nCmpLat == 0 ){ // 원 형태의 구역반경

 // 직선거리만을 조건으로 한다.
  int realDist = sqrt((lon_dist*lon_dist)+(lat_dist*lat_dist));

  if( nCmpLon >= realDist ){
   return 1;
  }
 }else if( nCmpLat >= lat_dist && nCmpLon >= lon_dist ){ // 사각 형태의 구역반경

// 종/횡측 거리안에 들어오는지 확인한다.
  return 1;
 }
  
 return 0;
}


+ Recent posts