«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

android mapview overlay and draw path 본문

Android/Tip&Tech

android mapview overlay and draw path

행복한 수지아빠 2011. 5. 18. 18:51

출처 : http://blog.naver.com/wind5395?Redirect=Log&logNo=150096686510

mapview위에 mark를 표시하는 방법은 Overlay를 이용한 것이다.

 

그런데, 안드로이드 상에서 MyLocationOverlay라는 특수한 overlay를 제공해준다. 이름에서 알 수 있듯이 현재 target의 위치를 mapview위에 띄워주는 overlay이다. 자신의 위치를 나타내고, 위치가 갱신이 되면 이동한 경로를 mapview에 그리고, 이동 거리를 계산하는 코드는 다음과 같다.

 

 

 class MyOverlay extends MyLocationOverlay
{
 Location mMyBeforeLocation;
 Location mMyCurrentLocation;
 Path mPath;
 Paint mPaint;
 ArrayList mMyPathLocationArray;
 Context mContext;
 MapView mMapView;
 float mMyDistance = 0;
 public MyOverlay(Context context, MapView mapView)
 {
  super(context, mapView);
  
  mPath = new Path();
  mPath.reset();
  mPaint = new Paint();
     mPaint.setAntiAlias(true);
     mPaint.setDither(true);
     mPaint.setColor(Color.RED);
     mPaint.setStyle(Paint.Style.STROKE);
     mPaint.setStrokeJoin(Paint.Join.ROUND);
     mPaint.setStrokeCap(Paint.Cap.ROUND);
     mPaint.setStrokeWidth(3);
     mPaint.setTextSize(20);
     mPaint.setStyle(Paint.Style.FILL);
     mMyPathLocationArray = new ArrayList();
     
     mContext = context;
     mMapView = mapView;
 }
 
 public void onLocationChanged(Location location)
 {
  super.onLocationChanged(location);
  Double latitude = location.getLatitude();
  Double longitude = location.getLongitude();
  Geocoder gc = new Geocoder(mContext, Locale.getDefault());
  StringBuilder sb = new StringBuilder();
  try {
   List

addresses = gc.getFromLocation(latitude, longitude, 10);


   

   if(addresses.size() > 0)

   {

    Address address = addresses.get(0);

    for(int i = 0 ; i <= address.getMaxAddressLineIndex() ; i++)

    {

     if(i > 0)

      sb.append(" ");

     sb.append(address.getAddressLine(i));

    }

   }

   else

   {

    sb.append(mContext.getString(R.string.unknown_address));

   }

   ((MapTest)mContext).mMyLocationEditText.setText(sb.toString()); //현재 위치를 주소로 변환하여 text로 찍어준다.

  } catch (IOException e) {

   e.printStackTrace();

  }

  

  mMyBeforeLocation = mMyCurrentLocation;

  mMyCurrentLocation = location;

  if(mMyBeforeLocation != null && mMyCurrentLocation != null && mMyBeforeLocation != mMyCurrentLocation)

  {

   mMyPathLocationArray.add(new MyPathLocation(mMyBeforeLocation, mMyCurrentLocation)); //위치가 바뀔때마다 path를 추가해준다.

   

   mMyDistance += mMyCurrentLocation.distanceTo(mMyBeforeLocation);  //이동한 거리를 계산한다.

   

   ((MapTest)mContext).mMyLocationEditText.setText(String.valueOf(mMyDistance));

  }

  else 

   return;

  

 }

 

 public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)

 { //draw함수는 무한 반복 호출되는 callback이다

  if(mMyBeforeLocation != null && mMyCurrentLocation != null)

  {

   mPath.reset();  //비어있는 path를 만들어 mapview위를 깨끗하게 초기화 한다.

   canvas.drawPath(mPath, mPaint);

   updatePath();  //위치가 바뀔때마다 추가해두었던 path 배열을 그리기위한 준비.

   mPaint.setStyle(Paint.Style.STROKE);

   canvas.drawPath(mPath, mPaint);

  }

  return super.draw(canvas, mapView, shadow, when);

 }

 

 public void updatePath()

 {

  for(int i = 0 ; i < mMyPathLocationArray.size() ; i++)

  {

   Point startPoint = new Point();

   Point endPoint = new Point();

   MyPathLocation temp = mMyPathLocationArray.get(i);

   mMapView.getProjection().toPixels(new GeoPoint((int)(temp.mMyBeforeLocation.getLatitude()*1E6), (int)(temp.mMyBeforeLocation.getLongitude()*1E6)), startPoint);

   mMapView.getProjection().toPixels(new GeoPoint((int)(temp.mMyCurrentLocation.getLatitude()*1E6), (int)(temp.mMyCurrentLocation.getLongitude()*1E6)), endPoint);

   

   Path p = new Path();

   p.reset();

   p.moveTo(startPoint.x, startPoint.y);

   p.lineTo(endPoint.x, endPoint.y);

   mPath.addPath(p);

  }

 }

}


class MyPathLocation
{
 public Location mMyBeforeLocation;
 public Location mMyCurrentLocation;
 
 public MyPathLocation(Location myBeforeLocation, Location myCurrentLocation)
 {
  mMyBeforeLocation = myBeforeLocation;
  mMyCurrentLocation = myCurrentLocation;
 }
}


이 외 자세한 내용은 첨부한 파일을 참고.