안드로이드(android) 현재 나의 위치에서 거리 계산방법, 내 주변 10km 이내 데이터만 Marker 지정방법
구글 맵API 사용시 마커 지정방법
현재 나의 위치에서 내 주변 10km이내 데이터만 Marker 지정하는 방법은 안드로이드 Location클래스와 위도 경도 값을 가지고 계산한다. 이 계산 방법은 내 위치가 아니더라도 지점 A와 지점 B간의 거리 계산도 동일하게 사용하면 된다.
■현재 나의 위치 Location 정보를 ” 서울 시청 광장”으로 임의로 지정하였다.
//서울 시청 광장
Location myLocation = new Location("");
myLocation.setLatitude(37.56553);
myLocation.setLongitude(126.97801);
■다음은 임의로 뽑은 위도 경도 값들이다.
Location location2 = new Location("");
location2.setLatitude(37.56553);
location2.setLongitude(126.97801);
Location location3 = new Location("");
location3.setLatitude(37.66166);
location3.setLongitude(127.27801);
■ 지점간의 거리는 Location클래스의 DistanceTo()메소드를 이용하여 구한다. DistanceTo()메소드를 잠깐 살펴보자
/**
* Returns the approximate distance in meters between this
* location and the given location. Distance is defined using
* the WGS84 ellipsoid.
*
* @param dest the destination location
* @return the approximate distance in meters
*/
public float distanceTo(Location dest) {
BearingDistanceCache cache = sBearingDistanceCache.get();
// See if we already have the result
if (mLatitude != cache.mLat1 || mLongitude != cache.mLon1 ||
dest.mLatitude != cache.mLat2 || dest.mLongitude != cache.mLon2) {
computeDistanceAndBearing(mLatitude, mLongitude,
dest.mLatitude, dest.mLongitude, cache);
}
return cache.mDistance;
}
주석의 내용을 보면 미터단위로 데이터를 반환한다고 되어있고, 리턴타입은 float이다.
안드로이드(android) 현재 나의 위치에서 거리 계산 하는 코드
GoogleMap mMap;
....................................
float distance = myLocation.distanceTo(location2); //미터 단위
float distance2 = myLocation.distanceTo(location3); // 미터 단위
float distance = myLocation.distanceTo(location2) / 1000; ; //km 단위
float distance2 = myLocation.distanceTo(location3) / 1000; ; // km 단위
Log.d("TAG", "#### : 나와의 거리 distance: " + distance + "km");
Log.d("TAG", "#### : 나와의 거리 distance2: " + distance2 + "km");
mMap.clear();//지도 클리어
mMap.getUiSettings().setMyLocationButtonEnabled(true);
MarkerOptions marker = new MarkerOptions();
if(distance <= 10) //10km 이내 데이터인지 체크
addMarker(location2, marker);
if(distance2 <= 10) //10km 이내 데이터인지 체크
addMarker(location3, marker);
미터 단위로 리턴 받기 때문에 1000으로 나누어서 km값으로 리턴 받았다.
■ addMarker 메소드
private void addMarker(Location location, MarkerOptions marker){
marker.position(new LatLng(location.getLatitude(), location.getLongitude()));
marker.visible(true);
marker.title("나와의 거리 10미터 이내");
marker.snippet("");
mMap.addMarker(marker); //맵에 표시
}
■ 위도와 경도 데이터를 DB에서 가져온 데이터를 처리할 때
TradeInfoVo[] tradeArr = 생략....;
if(tradeArr!=null&& tradeArr.length > 0) {
mMap.clear();//지도 클리어
mMap.getUiSettings().setMyLocationButtonEnabled(true);
MarkerOptions marker = new MarkerOptions();
for(int i=0; i<tradeArr.length;i++){
Location targetLocation = new Location("");
targetLocation.setLatitude(tradeArr[i].getLatitude());
targetLocation.setLongitude(tradeArr[i].getLongitude());
if(mCurrentLocatiion == null) {
float distance = mCurrentLocatiion.distanceTo(targetLocation) / 1000; // in km
Log.d(DefaultSettings.TAG, "#### : 판매점과의 거리 : " + distance + "km");
if(distance <=10)
addMarker2(tradeArr[i], marker);
}
}
}
...........................
private void addMarker2(TradeInfoVo vo, MarkerOptions marker){
marker.position(new LatLng(vo.getLatitude(), vo.getLongitude()));
marker.visible(true);
marker.title(vo.getTradeName());
marker.snippet(getTitle(new LatLng(vo.getLatitude(), vo.getLongitude())));
marker.icon(this.getMarkerIcon(vo.getWinCount())); //이미지
mMap.addMarker(marker); //맵에 표시
}
거리구하는 또 다른 방법은 Haversine Distance Algorithm를이용하는 방법이다. 아래 참고 자료를 참고 하자.
참고 자료 :Creating a method using Haversine Formula, Android V2
[관련자료]
이동 거리 계산 방법