note

구글맵에 마커 표시하기(위치 지정) 본문

Android/기본

구글맵에 마커 표시하기(위치 지정)

투한 2012. 1. 17. 16:49


위치기반 서비스 어플리케이션을 만든다면 이 기능은 일반적으로 써야 될겁니다


사용된 이미지(이미지는 res\mdpi 폴더에 넣으면 됩니다)




기본적으로 manifest에서 apllication -> uses library -> 구글맵 선택( 이전게시물 참고)

해야됩니다




 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <com.google.android.maps.MapView
        android:id="@+id/map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:apiKey=""
        android:clickable="true" />

</LinearLayout>


package com.commonsware.android.maps;

import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.MapView.LayoutParams;

public class NooYawk extends MapActivity {
	MapView map;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		map = (MapView) findViewById(R.id.map);

		// 위도와 경도 정보를 갖는 GeoPoint 객체 생성
		GeoPoint gp = getPoint(40.76793169992044, -73.98180484771729);

		// 위치 (내위치 또는 기준이 되는 위치)를 표시하는 마커를 생성
		MapView.LayoutParams mapParams = new MapView.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, gp,
				MapView.LayoutParams.CENTER);

		ImageView iv = new ImageView(getApplicationContext());
		iv.setImageResource(R.drawable.mymarker);
		map.addView(iv, mapParams);

		// 내위치 또는 기준이 되는 위치를 중심으로 표시되는 아이템(표시해 주고 싶은 좌표위치 정보(예:관공서)표시
		Drawable marker = getResources().getDrawable(R.drawable.marker);

		marker.setBounds(0, 0, marker.getIntrinsicWidth(),
				marker.getIntrinsicHeight());

		// getOverlays() : 지도위에 오버레이될 아이템을 표시하기 위해 레이어를 추가하기 위해 레이어 목록 호출
		map.getOverlays().add(new SitesOverlay(marker));

		// 줌 레벨을 제거하는 Controll 표시 여부
		map.setBuiltInZoomControls(true);

		// 지정된 위치 정보를 갖는 지도를 표시
		MapController controller = map.getController();
		controller.setCenter(gp);
		controller.setZoom(17);
	}

	private GeoPoint getPoint(double lat, double lon) {
		return (new GeoPoint((int) (lat * 1000000.0), (int) (lon * 1000000.0)));
	}

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

	// ItemizedOverlay : 지도에 보여질 아이템(좌표,제목,간단 설명)의 오버레이 정보처리
	// 각 좌표에 마커를 표시 각 아이템의 스크린 탭( 부가정보 링크)
	// OverlayItem : iItemizedOverlay 클래스에 제공되는 기본 아이템 정보

	private class SitesOverlay extends ItemizedOverlay {
		private Drawable marker = null;
		private List items = new ArrayList();

		public SitesOverlay(Drawable marker) {
			super(marker);
			this.marker = marker;

			items.add(new OverlayItem(getPoint(40.748963847316034,
					-73.96807193756104), "UN", "United Nations"));
			items.add(new OverlayItem(getPoint(40.76866299974387,
					-73.98268461227417), "Lincoln Center",
					"Home of Jazz at Lincoln Center"));
			items.add(new OverlayItem(getPoint(40.765136435316755,
					-73.97989511489868), "Carnegie Hall",
					"Where you go with practice, practice, practice"));
			items.add(new OverlayItem(getPoint(40.70686417491799,
					-74.01572942733765), "The Downtown Club",
					"Original home of the Heisman Trophy"));

			// 생성된 OverlayItem 을 목록으로 지정
			populate();
		}

		// 지정한 번호에 대해 OverlayItem을 return
		@Override
		protected OverlayItem createItem(int i) {
			return items.get(i);
		}

		@Override
		public void draw(Canvas canvas, MapView mapView, boolean shadow) {
			super.draw(canvas, mapView, shadow);
			// 마커의 아래의 중간 부분이 좌표에 위치하도록 지정
			boundCenterBottom(marker);
		}

		@Override
		protected boolean onTap(int i) {
			Toast.makeText(NooYawk.this, items.get(i).getSnippet(),
					Toast.LENGTH_SHORT).show();
			return true;
		}
		//레이어가 처리할 수 있는 항목의 개수를 리턴
		@Override
		public int size() {
			return items.size();
		}
	}
}