관리 메뉴

moozi

MapView 이용하기 4 - 원하는 위치 이동, 표시 본문

안드로이드개발강좌

MapView 이용하기 4 - 원하는 위치 이동, 표시

moozi 2010. 2. 22. 12:03

이번 강좌에서는 지난 강좌 MapView 이용하기 3 - MapView 띄우기 에서 이어집니다.

지도상에서 원하는 위치로 이동해서 아이콘으로 위치를 표시하는 코드를 추가해 보겠습니다.

이번 강좌 역시 안드로이드 개발자사이트의 내용을 토대로 살펴봅니다.

1. 먼저 다음 아이콘을 다운로드 받아 바탕화면에 저장한 다음 res -> drawable-hdpi 폴더에 끌어다 놓습니다.


[ 아이콘을 res -> drawable-hdpi 폴더에 끌어다 놓은 모습 ]


2. src 폴더 -> my.HelloMyMap 에서 마우스 오른쪽버튼 클릭 -> New -> Class 를 클릭해서 다음과 같이 새 HelloItemizedOverlay.java파일을 추가합니다. 빨간색 박스 부분을 주목해 보시기 바랍니다.



3. HelloItemizedOverlay.java 를 다음과 같이 편집합니다.

package my.HelloMyMap;

import java.util.ArrayList;

import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay {

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
 
 public HelloItemizedOverlay(Drawable defaultMarker) {
  super(boundCenterBottom(defaultMarker));
  // TODO Auto-generated constructor stub
 }

 @Override
 protected OverlayItem createItem(int i) {
  // TODO Auto-generated method stub
  return mOverlays.get(i);
 }

 @Override
 public int size() {
  // TODO Auto-generated method stub
  return  mOverlays.size();
 }
 
 public void addOverlay(OverlayItem overlay) {
     mOverlays.add(overlay);
     populate();
 }

}

코드를 살펴보면 HelloItemizedOverlay  클래스는 ItemizedOverlay 클래스를 상속받습니다.
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
에서 OverlayItem들을 저장할 ArrayList인 mOverlays 객체를 생성합니다.

boundCenterBottom() 은 아이콘의 아래의 중간부분이 좌표에 위치하도록 지정합니다.

 populate(); 는 add()메서드가 호출될 때마다 호출해야 하는데, 각각의 OverlayItem 들을 읽어서 그려낼 준비를 하는 역할을 합니다.


4. HelloMyMap.java 를 다음과 같이 편집합니다.

package my.HelloMyMap;

import java.util.List;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.ZoomControls;

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

public class HelloMyMap extends MapActivity {
 
 List<Overlay> mapOverlays;
 Drawable drawable;
 HelloItemizedOverlay itemizedOverlay;
 LinearLayout linearLayout;
 MapView mapView;
 ZoomControls mZoom;
   
 @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
 
/** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        mapView.setSatellite(true);

        GeoPoint p=new GeoPoint(37450877,126768494);
        MapController mc=mapView.getController();        
      mc.animateTo(p);
      mc.setZoom(5);
       
        mapOverlays = mapView.getOverlays();
        drawable = this.getResources().getDrawable(R.drawable.androidmarker);
        itemizedOverlay = new HelloItemizedOverlay(drawable);
       
        OverlayItem overlayitem = new OverlayItem(p, "", "");
       
        itemizedOverlay.addOverlay(overlayitem); 
      mapOverlays.add(itemizedOverlay);

    }       
}

코드를 대략 살펴보면 GeoPoint p=new GeoPoint(37450877,126768494); 에서 원하는 좌표점(위도, 경도)을 갖는 p 객체를 생성합니다.  위도와 경도는 지난강좌  MapView 이용하기 1 - 위도, 경도 구하기 에서 구한 값을 사용하면 됩니다. ','를 뺀 값을 입력하세요. ( 필자의 다음 글을 참조하세요.  => http://moozi.tistory.com/56 )

mc.animateTo(p);  는 좌표점으로 이동합니다.
mc.setZoom(5);  는 확대정도를 지정합니다.

mapOverlays = mapView.getOverlays(); 는 맵뷰의 overlay list 를 얻어옵니다.

OverlayItem overlayitem = new OverlayItem(p, "", ""); 는 좌표 p 를 이용해서 overlayitem을 생성합니다.

itemizedOverlay.addOverlay(overlayitem); 는 overlayitme 객체를 itemizedOverlay에 추가합니다.
mapOverlays.add(itemizedOverlay); 는 itemizedOverlay를 mapOverlays에 추가합니다.


5. Ctrl + F11 로 실행합니다.

[ 실행결과 ]

실행결과를 보면 지도가 서울을 중심으로 나타나며, 좌표점에 안드로이드 아이콘 이미지가 출력됨을 알 수 있습니다.

9 Comments
  • 프로필사진 solkit 2010.02.24 06:09 안녕하세요? 강좌 감사합니다.

    제가 MapView 띄우기 응용해서 소스를 Modify 하려고 합니다.
    유저로부터 위도 경도 위치값을 입력 받아서 Map을 띄우려고요.
    그래서 일단 이미지 버튼을 누르면 MapView가 보이도록 Modify를 했는데요.
    아래와 같은 에러가 납니다.

    콘솔 로그
    [2010-02-23 15:55:41 - mapTest]ActivityManager: Starting: Intent { cmp=my.mapTest/.mapTest }

    MyAVD_API 화면 출력 내용
    Sorry!
    The application mapTest(process my.mapTest) has stopped unexpectedly. Please try again.
    Force close 버튼

    코딩은 아래와 같이 했습니다.

    1. AndroidManifest.xml 에 uses-permission,uses-library 태그 추가

    2. main.xml 작성
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <EditText
    android:id="@+id/edittext"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>
    <ImageButton
    android:id="@+id/android_button"
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    android:src="@drawable/android" />
    <com.google.android.maps.MapView
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="0oet2s0L9AwWWQW_-RiVZ6tGJ5c8xs2fseCvL3Zg"
    />
    </RelativeLayout>

    3. mapTest.java (이미지 버튼 출력, 누르면 viewMap.java 호출)
    package my.mapTest;

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnKeyListener;
    import android.widget.EditText;
    import android.widget.ImageButton;
    import android.widget.Toast;

    public class mapTest extends Activity {

    viewMap vm;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final EditText edittext = (EditText) findViewById(R.id.edittext);
    final ImageButton button = (ImageButton) findViewById(R.id.android_button);

    button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    // 지도 (viewMap) 불러오기
    vm = new viewMap();

    Toast.makeText(mapTest.this, edittext.getText(), Toast.LENGTH_SHORT).show();
    }
    });
    }
    }

    4. viewMap.java (MapView 불러오기)
    package my.mapTest;

    import android.os.Bundle;
    import com.google.android.maps.MapActivity;
    import com.google.android.maps.MapView;

    public class viewMap extends MapActivity {

    MapView mapView;

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

    public viewMap() {
    // TODO Auto-generated constructor stub
    setContentView(R.layout.main);
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapView.setSatellite(true);

    }

    }

    어느 부분이 잘못 되었나요?

    이거 되면 MapView 이용하기 4번강좌 응용해서 유저 입력값으로 위치 표시하기를 해 보려고 합니다.

    조언 부탁드립니다.

    그럼...
  • 프로필사진 지나가던 초보자 2010.02.25 10:42 잘은 모르지만 액티비티에서 맵을 표시하려고 해서 그런거 같은데요...

    저라면 그냥 MapAcivity로 하구
    xml에서 android:visibility="gone" 걸어노쿠
    버튼 누르면 mapview.setVisibility(View.VISIBLE);
    이런식으로 보이게 할듯합니다.ㅋㅋ
  • 프로필사진 moozi 2010.02.25 13:16 신고 정확한건 해봐야 하겠지만... 일단 드는 생각은...

    mapView를 main.xml에 두지 마시고 mapview.xml 식으로 별도의 파일에 두신 다음, 첫번째 화면에서 위도, 경도 입력하고 버튼을 누르면, 화면전환해서 맵뷰가 보이는 방식으로 하시면 어떨까요?

    잘 해결되셨으면 좋겠습니다.
  • 프로필사진 세이지준 2010.03.04 18:15 신고 클래스 만들때

    Itemized 부분에서

    알파벳 아이인지 엘인지 헷갈리네요 ㅠㅠ

    그래서 클래스 만드는 부분에서 실수로 소문자 엘로 적었는데 문제가 발생했다고 해서 다시 아이로 고칠려고 했는데요

    어떻게 설정을 수정하는지 고민중 ㅠㅠ

    아니다 그냥 다시 만들어 볼께요 ㅠ

    위도와 경도는 더블 문법이라 소수점만 뺄까나 /긁적
  • 프로필사진 moozi 2010.03.04 23:13 신고 ^^

    Itemized 에서 I는 i 의 대문자가 맞습니다.

    그리고, 위도, 경도 값도 소문자 를 빼고 입력하는것이 맞습니다. => 이부분을 본문에 추가했습니다.

    감사합니다.
  • 프로필사진 052 2010.03.10 11:25 HelloItemizedOverlay.java 파일이 아래와 같은데요.
    아래 부분 중에서 'public class HelloItemizedOverlay extends ItemizedOverlay { '
    이 부분이 에러가 나네요~
    그래서 출력화면에서 안드로이드마크가 안 나타나는듯해요~


    package my.HelloMyMap;

    import java.util.ArrayList;

    import android.graphics.drawable.Drawable;

    import com.google.android.maps.ItemizedOverlay;
    import com.google.android.maps.OverlayItem;

    public class HelloItemizedOverlay extends ItemizedOverlay {

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

    public HelloItemizedOverlay(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
    // TODO Auto-generated constructor stub
    }

    @Override
    protected OverlayItem createItem(int i) {
    // TODO Auto-generated method stub
    return mOverlays.get(i);
    }

    @Override
    public int size() {
    // TODO Auto-generated method stub
    return mOverlays.size();
    }

    public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
    }

    }
  • 프로필사진 moozi 2010.03.10 12:12 신고 글쎄요 제가봐도 잘 모르겠어요 ^^;;;;

    혹시 ItemizedOverlay 의 I 가 i 의 대문자가 아니라 L의 소문자로 입력하신건 아니죠?

    다시 한번 잘 살펴보세요....
  • 프로필사진 tjsanf 2010.04.07 18:14 여기서 지오포인트변수 p에 직접 gps값을 넣어서
    원하는 위치표시를 하였는데요~
    DDMS에서 GPS값 설정한 후에.. 그 값을 읽어와서
    표시하려면...어떠케 해야할까요??

    LocationProVider을 사용해서..위치를 받고..
    MyLocationOverlay 인스턴스를 생성하면 될꺼같은데...
    막히네요ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
  • 프로필사진 Spider 2010.09.19 12:26 강좌 잘 보고 있습니다 ^^ 궁금한점이 생겼습니다.
    지도의 줌 레벨에 따라서 아이콘의 크기를 바꾸고 싶습니다. 어떤방법이 좋을까요..
댓글쓰기 폼