Android

안드로이드(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

[관련자료]
이동 거리 계산 방법

Leave a Reply

error: Content is protected !!