맵뷰를 사용하는 유형에는 여러가지가 있지만

 

한 고정 위치를 기준으로 반경을 표시하는 방법이 있습니다.

 

주로 현재 위치 기반으로 주변의 특정 정보를 표시하고자 할때

 

일정 범위까지만 표시된다는 것을 알리기 위해 주로 사용하는 방법인데요

 

오늘은 맵의 줌 상태에 따라 일정한 거리를 표시해주는 반경을 만들어보도록 하겠습니다.

 

우선 동영상을 보시고요

처음에는 고정 크기를 그리도록 하였고

두번째에 맵의 상태에 따라 일정 거리를 표시하도록 하였습니다.

 

 

우선 소스를 보도록 하겠습니다.

 

 package com.nobrain.googlesample;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Location;


/**
 * 실제 화면 상의 거리를 계산하여 원을 그리도록 함
 * @author NoBrain
 *
 */
public class CircleOverlay extends Overlay {

 
 private Paint mPaint;
 private GeoPoint mCurrentGeoPoint;
 private boolean isChecked;
 
 public CircleOverlay() {
  mPaint = new Paint();
  mPaint.setColor(0x3f00008F);
 }


 @Override
 public void draw(Canvas canvas, MapView mapview, boolean arg2) {
  super.draw(canvas, mapview, arg2);
  
  // 가로 길이
  int mapWidth = mapview.getWidth();
  
  // 0.0 위치
  GeoPoint mMinXGeoPoint = mapview.getProjection().fromPixels(0, 0);
  // maxX, 0 위치
  GeoPoint mMaxXGeoPoint = mapview.getProjection().fromPixels(mapview.getWidth(), 0);
  
  // 맵뷰의 가로 길이 기준으로 거리 값 측정하기
  float[] results = new float[1];
  Location.distanceBetween(mMinXGeoPoint.getLatitudeE6() / 1E6, mMinXGeoPoint.getLongitudeE6() / 1E6, mMaxXGeoPoint.getLatitudeE6() / 1E6, mMaxXGeoPoint.getLongitudeE6() / 1E6, results);
  
  // 현재 위치를 픽셀로 변환함
  Point point = new Point();
  mapview.getProjection().toPixels(mCurrentGeoPoint, point );
  
  if(isChecked){
   
   // 체크 된 상태면 맵 실제 크기 대비로 그림
   float radius = ((float) mapWidth / results[0]) * 250;
   canvas.drawCircle(point.x, point.y, radius, mPaint);
  }else{
   
   // 체크 안된 상태면 고정 크기로 그림
   canvas.drawCircle(point.x, point.y, 250, mPaint);
  }
 }

 /**
  * 체크 상태 설정하기
  * @param isChecked 체크 상태
  */
 public void setChecked(boolean isChecked) {
  this.isChecked = isChecked;
  
 }
 
 /**
  * 현재 위치 설정하기
  * @param mGeoPoint 현재 위치
  */
 public void setCurrentGeoPoint(GeoPoint mGeoPoint){
  this.mCurrentGeoPoint = mGeoPoint;
 }

}

키포인트 함수는 아래의 2개 입니다

 

//특정 좌표간의 실제 거리 값을 주는 함수
//results 배열의 크기가 1이면 0번에 거리가, 2면 1번에, 3이상이면 2번에 거리 값이 들어갑니다.
float[] results = new float[1];
 Location.distanceBetween(startLatitude, startLongitude, endLatitude, endLongitude, results)
//point 변수에 특정 좌표를 픽셀 위치로 변환해줍니다.
Point point = new Point();
mapview.getProjection().toPixels(mCurrentGeoPoint, point );

위의 2개 값을 통해 화면의 가로를 거리로 치환한 다음 반경을 그리도록 하였습니다.

 

위와 같이 작성한 오버레이를 맵뷰에 추가해 주시면 됩니다.

 

샘플 프로젝트는 첨부하였으니 참고하시기 바랍니다 :)