본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] MapView Overlay 관련 Apis 와 simple example.

by 돼지왕 왕돼지 2012. 2. 18.
반응형


안녕하세요 돼지왕 왕돼지입니다.
오늘은 MapView Overlay 관련된 APIs 과 간단한 예제들을 함께 살펴보려고 합니다.
이 글은  http://www.winapi.co.kr/android/ 글을 참조하여 정리한 내용입니다.


MapView Overlay 관련 APIs


<MapView에 Overlay 추가>

void addView (View child, MapView.LayoutParams params)

 

<LayoutParams>

LayouParams MapView.LayoutParams(int width, int height, GeoPoint point, int alignment)
LayouParams MapView.LayoutParams(int width, int height, int x, int y, int alignment)
LayouParams MapView.LayoutParams(int width, int height, GeoPoint point, int x, int y, int alignment) 


 <Overlay 추가 모드>

MODE_MAP : 지도를 기준으로 표식을 배치한다. 지도 위에 표식을 놓은 것이므로 확대/축소, 스크롤시에 표식도 같이 움직인다. 지도상의 좌표를 인수로 전달한다. GeoPoint 를 사용하는 LayoutParam 의 경우는 MODE_MAP 이다.
MODE_VIEW : 부모 뷰를 기준으로 표식을 배치한다. 뷰의 좌상단을 기준으로 한 픽셀 좌표를 인수로 전달한다. 지도의 상태와는 상관없이 위치가 고정적이다. ( x, y ) 포지션을 사용하는 경우는 MODE_VIEW 이다. 


 <Overlay Handling 관련>

 List<Overlay> getOverlays()

  
 

Overlay 구현

 

<Overlay 상속 class>
  - 캔버스를 사용하여 임의의 출력을 지도위에 그릴 수 있다.
  - Canvas 를 사용하므로, Pixel 값으로 mapping 해주어야 한다.  

boolean draw(Canvas canvas, MapView mapView, boolean shadow [, long when])  // overlay 그리기
boolean onTap(GeoPoint p, MapView mapView)  // overlay tap 했을 때


<Projection> - MapView 에 좌표설정.

Projection MapView.getProjection() // mapview 의 projection 정보 가져오기.
Point Projection.toPixels(GeoPoint in, Point out) // mapview projection 기준 pixel값
GeoPoint Projection.fromPixels(int x, int y) // mapview projection 기준으로 geopoint.
 
 

이미지 출처 : http://www.winapi.co.kr/android/


<example>

public class OverlayView extends MapActivity {
     MapView mMap;
 
     protected boolean isRouteDisplayed() {
          return false;
     }
 
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.location_mapviewtest);
 
          mMap = (MapView)findViewById(R.id.mapview);
          MapController mapControl = mMap.getController();
          mapControl.setZoom(13);
          mMap.setBuiltInZoomControls(true);
 
          GeoPoint pt = new GeoPoint(37927800, 127754100);
          mapControl.setCenter(pt);
 
          Tourmap tour = new Tourmap();
          List<Overlay> overlays = mMap.getOverlays();
          overlays.add(tour);
     }
 
     class Tourmap extends Overlay {
          public void draw(Canvas canvas, MapView mapView, boolean shadow) {
              super.draw(canvas, mapView, shadow);
 
              Paint pnt = new Paint();
              Bitmap bit;
              Point pt;
 
              pnt.setAntiAlias(true);
              pnt.setTextSize(30);
              canvas.drawText("춘천 관광지 안내", 10, 40, pnt);
 
              Projection projection = mapView.getProjection();
 
              // 춘천 중도
              bit = BitmapFactory.decodeResource(getResources(), R.drawable.jungdo);
              pt = projection.toPixels(new GeoPoint(37888800, 127703500), null);
              canvas.drawBitmap(bit, pt.x, pt.y, pnt);
 
              // 인형 극장
              bit = BitmapFactory.decodeResource(getResources(), R.drawable.inhyung);
              pt = projection.toPixels(new GeoPoint(37920200, 127722800), null);
              canvas.drawBitmap(bit, pt.x, pt.y, pnt);
 
              // 소양댐
              bit = BitmapFactory.decodeResource(getResources(), R.drawable.soyangdam);
              pt = projection.toPixels(new GeoPoint(37945600, 127780800), null);
              canvas.drawBitmap(bit, pt.x, pt.y, pnt);
          }
 
          public boolean onTap(GeoPoint p, MapView mapView) {
              String msg;
              msg = "x = " + p.getLatitudeE6() + ", y = " + p.getLongitudeE6();
              Toast.makeText(OverlayView.this, msg, Toast.LENGTH_SHORT).show();
              return true;
          }
     }
}
 
 


ItemizedOverlay. 대량의 Overlay

 
<ItemizedOverlay> 
 - 대량의 item 을 지도상에 배치하기 좋다.
 - CreateItem 을 이용하면, GeoPoint 값 그대로 Mapping 가능하다.

OverlayItem(GeoPoint point, String title, String snippet)

 
 
  <ItemziedOverlay<OverlayItem>>

class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem>

ItemizedOverlay(Drawable defaultMarker);
int size();
Item createItem(int i);

Drawable boundCenterBottom(Drawable balloon)
Drawable boundCenter(Drawable balloon) 

void populate()  //  createItem 메서드 호출해서 OverlayItem  객체 생성
 
boolean onTap(GeoPoint p, MapView mapView)
boolean onTap(int index) 

 
 

이미지 출처 : http://www.winapi.co.kr/android/

 
 
<example>

public class OverlayMulti extends MapActivity {
     MapView mMap;
     Drawable mBlue, mRed;
 
     protected boolean isRouteDisplayed() {
          return false;
     }
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.location_mapviewtest);
       
        mMap = (MapView)findViewById(R.id.mapview);
        MapController mapControl = mMap.getController();
        mapControl.setZoom(16);
        mMap.setBuiltInZoomControls(true);
       
        GeoPoint pt = new GeoPoint(37497900, 127027700);
        mapControl.setCenter(pt);
 
        mBlue = getResources().getDrawable(R.drawable.bluemarker);
        mBlue.setBounds(0, 0, mBlue.getIntrinsicWidth(),mBlue.getIntrinsicHeight());
        mRed = getResources().getDrawable(R.drawable.redmarker);
        mRed.setBounds(0, 0, mRed.getIntrinsicWidth(), mRed.getIntrinsicHeight());
 
        Restaurant rest = new Restaurant(mBlue);
        List<Overlay> overlays = mMap.getOverlays();
        overlays.add(rest);
    }
   
     class Restaurant extends ItemizedOverlay<OverlayItem> {
          public Restaurant(Drawable defaultMarker) {
              super(defaultMarker);
              boundCenterBottom(defaultMarker);
              boundCenter(mRed);
              populate();
          }
 
          /* 이 메서드를 재정의하면 그림자 출력을 제어할 수 있다.
          public void draw(Canvas canvas, MapView mapView, boolean shadow) {
              super.draw(canvas, mapView, false);
          }
          //*/
 
          public int size() {
              return 5;
          }
 
          protected OverlayItem createItem(int i) {
              OverlayItem item = null;
             
              switch (i) {
              case 0:
                   item = new OverlayItem(new GeoPoint(37497000, 127031100),
                             "할매 칼국수", "바지락 전문");
                   break;
              case 1:
                   item = new OverlayItem(new GeoPoint(37503000, 127029200),
                             "강남 떡볶이", "물은 셀프");
                   break;
              case 2:
                   item = new OverlayItem(new GeoPoint(37500300, 127024200),
                             "서초 라면", "김치 무제한");
                   item.setMarker(mRed);
                   break;
              case 3:
                   item = new OverlayItem(new GeoPoint(37494500, 127023700),
                             "한빛 만두", "저렴한 가격");
                   break;
              case 4:
                   item = new OverlayItem(new GeoPoint(37502800, 127032700),
                             "미영 분식", "친절 봉사");
                   item.setMarker(mRed);
                   break;
              }
              return  item;
          }
         
        public boolean onTap(int index) {
            String msg;
            OverlayItem item = getItem(index);
            msg = "상호 = " + item.getTitle() + ",설명 = " + item.getSnippet();
            Toast.makeText(OverlayMulti.this, msg, Toast.LENGTH_LONG).show();
            return true;
        }
     }
}

 
 
 

MyLocation

 
<MyLocationOverlay, MyLocationOverlay2 상속 class>
 - 자신의 위치를 표시하는 Overlay. ( 귀찮은 작업을 묶어놨음. )  

boolean dispatchTap()   //  현재 위치를 tap 했을 때

boolean enableMyLocation()
void disableMyLocation()
boolean enableCompass()
void disableCompass()
  
boolean runOnFirstFix(Runnable runnable)  // 처음 위치 조사될 때 실행될 러너블


이미지 출처 : http://www.winapi.co.kr/android/



 <example>

public class OverlayLocation extends MapActivity {
     MapView mMap;
     MyLocationOverlay2 mLocation;
 
     protected boolean isRouteDisplayed() {
          return false;
     }
 
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.location_mapviewtest);
 
          mMap = (MapView)findViewById(R.id.mapview);
          MapController mapControl = mMap.getController();
          mapControl.setZoom(13);
          mMap.setBuiltInZoomControls(true);
 
          GeoPoint pt = new GeoPoint(37881311, 127729968);
          mapControl.setCenter(pt);
 
          mLocation = new MyLocationOverlay2(this, mMap);
          List<Overlay> overlays = mMap.getOverlays();
          overlays.add(mLocation);
 
          mLocation.runOnFirstFix(new Runnable() {
              public void run() {
                   mMap.getController().animateTo(mLocation.getMyLocation());
              }
          });
     }
 
     public void onResume() {
          super.onResume();
          mLocation.enableMyLocation();
          mLocation.enableCompass();
     }  
 
     public void onPause() {
          super.onPause();
          mLocation.disableMyLocation();
          mLocation.disableCompass();
     }
 
     class MyLocationOverlay2 extends MyLocationOverlay {
          public MyLocationOverlay2(Context context, MapView mapView) {
              super(context, mapView);
          }
         
          protected boolean dispatchTap() {
              Toast.makeText(OverlayLocation.this, "여기가 현재 위치입니다.",
                        Toast.LENGTH_SHORT).show();
              return false;
          }
     }
}


 
로그인 없이 추천 가능합니다. 손가락 꾸욱~

반응형

댓글