= 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 체크를 해줘야 합니다.
= 참조 =
반응형
'Programming' 카테고리의 다른 글
Android OpenGL ES 사용에 앞서 알아두면 좋은것 (0) | 2012.01.05 |
---|---|
[Android] Soundpool 사용하기 + 사용하면서 안 것. (0) | 2011.02.14 |
[C/C++]C++ 에서 String을 띄어쓰기 단위로 간단하게 파싱하기. String Stream (0) | 2010.10.09 |
[Qt4] Signal 과 Slot (0) | 2010.09.12 |
[C/C++]Linux 시스템콜을 이용한 TCP/IP 프로그래밍 기초 (0) | 2010.08.28 |