본문 바로가기

Develop/SQL

MySql 에서 위도 경도로 거리(Distance) 구하기


먼저 함수를 하나 등록한다. 그대로 복사해서 사용해도 됨.
 DELIMITER //  
CREATE FUNCTION `GetDistance`(  
 lat1  numeric (9,6),  
 lon1  numeric (9,6),  
 lat2  numeric (9,6),  
 lon2  numeric (9,6)  
) RETURNS decimal(10,5)  
    READS SQL DATA  
BEGIN 
  DECLARE  x  decimal (20,10);  
  DECLARE  pi  decimal (21,20);  
  SET  pi = 3.14159265358979323846;  
  SET  x = sin( lat1 * pi/180 ) * sin( lat2 * pi/180  ) + cos(  
 lat1 *pi/180 ) * cos( lat2 * pi/180 ) * cos(  abs( (lon2 * pi/180) -  
 (lon1 *pi/180) ) );  
  SET  x = acos( x );  
  RETURN  ( 1.852 * 60.0 * ((x/pi)*180) ) / 1.609344;  
END //  
DELIMITER ;

사용 예제 쿼리
select SHOP_NAME, addr1, addr2, addr3,
GetDistance(내위치Lat, 내위치Lng, a.lat, a.lng) as Distance
from SHOP_TABLE a
where lat != '' and lng != '' order by Distance ASC



tip.
위 쿼리를 날리면 distance는 Miles 단위로 나온다.
 //마일을 받아 킬로미터 또는 미터로 반환
 public String milesToKm(float miles) {
  String returnStr = null;
  
  float kilometers = (float) (miles*1.609344);
  returnStr = Float.toString(kilometers);
  
  if(returnStr.length()>0 && returnStr.substring(0,1).equals("0")) {
   float km = Float.parseFloat(returnStr);
   km = km*1000;
   returnStr = Float.toString(km);
   return returnStr + "m";
  } else {
   return returnStr + "Km";
  }
 }
위함수는 방금 만든거라 테스트는 안해봤음. 테스트 완료되면 이메세지를 삭제함.