Programming

[Android]Android MapView 간단한 정리.

라우드니스 2010. 11. 4. 20:39

= XML에 추가해야 하는 것들 =
1.
AndroidManifest.xml 의 application 영역에
<uses-library android:name="com.google.android.maps" />
을 추가해 줍니다.
2.
android.permission.INTERNET
android.permission.ACCESS_COARSE_LOCATION
android.permission.ACCESS_FINE_LOCATION
3개의 유저권한이 필요합니다.
3.
<com.google.android.maps.MapView
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:enabled="true"
  android:clickable="true"
  android:apiKey="example_Maps_ApiKey_String"
 />
형식으로 Layout에 View를 추가할 수 있습니다.
Android SDK 에서 제공하는 기본 Layout에는 존재하지 않으니 별도로 추가해서 사용해야 합니다.
= 코드 =
* Activity는 MapActivity로 수정해야 합니다..
ex) public class mapActivity extends MapActivity {

* MapView 구조체를 만듭니다.
ex) MapView mapView;
...
* View를 검색해 오는 방법은 동일합니다.
ex) mapView = (MapView)findViewById(R.id.mapview); 
* Mapview를 사용하기 위해서 MapActivity는 isRouteDisplayed 메소드를 오버라이딩 해야 합니다.
@Override
protected boolean isRouteDisplayed() {
	// TODO Auto-generated method stub
	return false;
}
* MapView 구조체에 포함된 API중...
- setBuiltInZoomControls : 지도를 클릭했을시 하단에 +,- (zoom in, out)버튼이 잠시동안 생깁니다.
- getOverlays : Overlay를 가져옵니다.
- getOverlays().add : Marker를 추가합니다.
- getController() : Controller를 가져옵니다.
- getController().setCenter : Mapview가 보여줄 위치를 정합니다.
- getController().setZoom : MapView의 Zoom 레벨을 설정합니다.
- getController().animateTo : 해당 위치로 Center를 정할 때 애니메이션 효과로 이동됩니다.
* GPS를 통해 자신의 위치를 알 수 있는 MyLocationOverlay 구조체가 있습니다. (MapActivity에서만 사용 가능 합니다!)
ex)
private MyLocationOverlay me=null;
me = new MyLocationOverlay(this, mapView);
물론, 이 놈도 화면에 표시되게 하려면 overlay에 추가를 해야 합니다.
ex)
mapView.getoverlays().add(me);
* MapView의 위치는 GeoPoint 구조체를 사용해서도 표시할 수 있습니다.
ex)
GeoPoint hyundae = getPoint(36.332768,127.390949);
mapView.getController().setCenter(hyundae);
* 위도경도로 int를 사용하기 때문에 double을 받아서 Int형으로 돌려주는 함수를 제작하면 좋습니다.
ex)
private static GeoPoint getPoint(double lat, double lon) {
	return(new GeoPoint((int)(lat*1000000.0), (int)(lon*1000000.0)));
}
* 마커를 사용하기 위해서는 ItemizedOverlay을 상속받는 구조체가 필요합니다.
ex)
private class SitesOverlay extends ItemizedOverlay {
		private List items=new ArrayList();
		private Drawable marker=null;
                //Marker를 표시하기 위한 구조체에서 꼭 있어야 하는 생성자
		public SitesOverlay(Drawable marker) {
			super(marker);
			this.marker=marker;
			populate();
		}
		//리스트에 추가하기 위해 제작한 함수.
		public void addItems(double lat, double lon, String title, String snippet) {
			items.add(new OverlayItem(getPoint(lat,lon),title,snippet));
			populate();
		}
		
                //필수 Override
		@Override
		protected OverlayItem createItem(int i) {
			return(items.get(i));
		}
                //필수 Override
		@Override
		public void draw(Canvas canvas, MapView mapView, boolean shadow) {
			super.draw(canvas, mapView, shadow);
			boundCenterBottom(marker);
		}
                //필수 Override
		@Override
		public int size() {
			return(items.size());
		}
	}
}			

* 마커자체는 이미지 파일입니다.
ex)
Drawable marker=getResources().getDrawable(R.drawable.icon);
제작한 Overlay는 marker를 생성자로 받으므로... 어쨋든 구조체에 marker를 보냅니다.
ex)
SitesOverlay sitesOverlay = new SitesOverlay(marker);
마지막으로 Overlay를 Mapview에 추가시켜줍니다.
ex)
mapView.getOverlays().add(sitesOverlay);
마커 추가,제거 갱신은 자동으로 됩니다.
= 주의 사항=
MyLocationOverlay 구조체에 있는 getMyLocation() 함수의 경우 GPS에서 자신의 위치를 반환해 주는 함수입니다.
바로 받아온다고 생각할 수도 있는데 사실 GPS를 받아오기 까지는 생각보다 오랜 시간이 걸립니다. (프로그램 입장에선 굉장히 긴 시간 이기도 합니다.)
초기에는 Null을 리턴해 주므로,  getMyLocation 함수를 사용할때는 항상 Null 체크를 해줘야 합니다.
= 참조 =

반응형