안드로이드 개발 질문/답변
(글 수 45,052)
DB에 약 5000개 가량의 위치 정보가 있습니다.
위도 경도의 두 포인트간 거리 계산하는 코드가 있더군요
하지만 5000개에 대해서 모두 계산할려면 너무 느린거 같구요..
반경 2킬로미터 이내를 검색한다 하면
적어도 위도 경도로 숫자 몇(?) 이상 차이나면 계산을 건너뛰는 방식이라던가 그런것을
활용할 수 있을듯 한데요 . 어떤 방법이 있을까요?
var R = 6371; // km |
2011.03.21 12:48:19
//////////////////GPS 좌표로 구하는 Util //Location !!!!!!!!!!!
//%해당지점 거리 구하는 함수
public static double gpsdist(double lat1, double lon1, double lat2, double lon2){
return gpsdist(lat1, lon1, lat2, lon2, "m");
}
public static double gpsdist(double lat1, double lon1, double lat2, double lon2, String unit){
//// double dist=[]; 오차가 심함..
// double GR=6378137.0; //% 지구반경 단위:미터
// double pi = Math.PI;
//
// //% (고객위도 - 내위치위도) * 지구반경
// double Dx= (DesPOS_x - RefPOS_x)*GR *Math.cos(RefPOS_y*pi/180) * pi / 180;
// double Dy=(DesPOS_y - RefPOS_y) * GR * pi / 180;
// double distance = Math.sqrt ( Math.pow(Dx,2) + Math.pow(Dy,2));
//
// return distance;
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
if (unit == "K") {
dist = dist * 1.609344;
} else if (unit == "N") {
dist = dist * 0.8684;
}else if(unit=="m"){
dist = dist * 1.609344;
dist = dist*1000;
}
return (dist);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:: This function converts decimal degrees to radians :*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
public static double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:: This function converts radians to decimal degrees :*/
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
public static double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
DB 위치 정보가 위도, 경도 기준인가요?
원하는 지구좌표계 (대부분 WGS-84)를 선정하셔서
역산해보시고 사용하시면 될 듯 합니다.
아래 글이 도움이 되실지도 모르겠습니다. ^^
http://threestory.tistory.com/tag/WGS-84