2011年7月26日 星期二

Google Map Overlay 使用

當使用 Map 時需要在地圖上使用一些座標圖示或是繪圖等功能,這時候就需要在原本的地圖上加上圖層,利用圖層就可以達成並且可以針對不同的圖層給予不同的功能,方便於管理與設計。

Overlay

Overlay是一個抽象類別,所以必須在使用前,先建立一個繼承自此抽象類別的自訂圖層類別,並將需求的功能實做,這裡用一個簡單的例子來說明如何使用圖層,範例功能將利用圖示顯示 animateTo(GeoPoint) 所設定的座標。

原始碼 :

package com.nchu.exMap;

import java.util.ArrayList;
import java.util.List;

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 android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;

public class exMap extends MapActivity {
/** Called when the activity is first created. */
GeoPoint mGeoPoint;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

MapView mMapView = (MapView)findViewById(R.id.mapview);
mMapView.setBuiltInZoomControls(true);
mMapView.setTraffic(false);
MapController mMapController = mMapView.getController();
mMapController.setZoom(17);
mGeoPoint = new GeoPoint(24121194,120675526);
mMapController.animateTo(mGeoPoint);

MyOverlay mOverlay = new MyOverlay();
List<Overlay> list = mMapView.getOverlays();
list.add(mOverlay);
}

@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}

class MyOverlay extends Overlay{
public void draw(Canvas canvas,MapView mapView,boolean shadow){
Paint mPaint = new Paint();
Point mScreenCoords = new Point();
mapView.getProjection().toPixels(mGeoPoint, mScreenCoords);
mPaint.setStrokeWidth(1);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
canvas.drawBitmap(bmp, mScreenCoords.x, mScreenCoords.y,mPaint);
canvas.drawText("地圖中心點", mScreenCoords.x, mScreenCoords.y, mPaint);
}
}
}
首先來看一下 MyOverlay 這個類別,繼承自 Overlay 這個抽象類別,並實作 draw() 這個方法, Paint 為畫筆物件,利用此物件可以設定筆觸的大小或式風格等;而 Point 物件則是螢幕的點,接著利用 getProjection() 所取得的 projection 物件做經緯度與螢幕位置的轉換;我們所要貼的圖可以事先放入 Resource 中,再經由 BitmapFactory 的 decodeResource 取得,最後利用drawBitmap 或是 drawText 將圖或文字繪出。

接著來看如何使用 MyOverlay 類別,建立 MyOverlay 物件的方法跟一般物件建立方法沒什麼兩樣,但是建立出來的圖層必須加入到目前所使用的 MapView 中,不然的話就只是一個毫無用途的物件,首先我們必須取得 MapView 中存放 Overlay 的容器,放在這個容器內的 Overlay 才會被繪出,方法為
List<Overlay> list = mMapView.getOverlays();
要注意的是此處 getOverlays() 所回傳的是 List<Overlay< 所以無法使用 ArrayList 做為代替,最後只要將建立的 Overlay 物件嫁入至此容器中即可。

以下為執行畫面,可以看到中心點已經繪出紅色的 "地圖中心點" 五字,並且在下方貼了一張圖。

0 意見:

張貼留言

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Powered by Blogger