Android地圖開發之Overlay應用(高德)

 

做過Android地圖應用開發的人員都知道,現在流行的地圖框架不外乎是Google,百度以及高德地圖。

對於Google和百度的地圖開發,首先需要獲得一個API KEY,然後才能被授權開發應用。而高德地圖則不用這麼麻煩。因此,本篇采用高德地圖來開發一個簡單的DEMO。

在開始之前,需要在高德官網上下載相應的jar開發包,下載地址為:http://api.amap.com/Android/download

首先介紹下Overlay:

Overlay是一個基類,它表示可以覆蓋在地圖上方顯示的overlay。添加一個overlay時,從這個基類派生出一個子類,創建一個實例,然後把它加入到一個列表中。 這個列表通過調用getOverlays()得到。 為瞭允許用戶觸摸去對齊一個點,子類應當實現Overlay.Snappable接口。

構造方法隻有一個,Overlay()   —>空構造方法

關鍵方法:

draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) ,負責在地圖上繪畫

onTap(GeoPoint p, MapView mapView) 處理一個“點擊”事件。

下面利用這兩個方法做一個小小的應用。在地圖上某個點繪制一個圖像。處理點擊事件,彈出一個對話框,顯示點擊的經緯度。

具體信息在代碼的註釋裡:

首先是在清單裡添加相應的權限:

[html] 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 
   <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 

然後是往項目裡添加下載的Map開發包(右鍵項目->properties->Java Build Path->Libraries->Add external Jars->定位到你的Map開發包)

接下來是核心繼承自MapActivity類的實現類:

[java]
package zjut.tsw.overlay; 
 
import java.util.List; 
 
import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.widget.Toast; 
 
import com.amap.mapapi.core.GeoPoint; 
import com.amap.mapapi.map.MapActivity; 
import com.amap.mapapi.map.MapController; 
import com.amap.mapapi.map.MapView; 
import com.amap.mapapi.map.Overlay; 
import com.amap.mapapi.map.Projection; 
 
/**
 * 高德地圖示例之Overlay
 * 
 * @author tsw
 * 
 */ 
public class MainActivity extends MapActivity { 
 
    private MapView mapView; 
 
    private MapController mController; 
 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
 
        mapView = (MapView) findViewById(R.id.mapView); // 得到MapView對象 
 
        mapView.setBuiltInZoomControls(true); // 開啟縮放控件 
 
        mController = mapView.getController(); // 獲取地圖控制對象 
 
        mController.setZoom(10); // 設置初始縮放級別 
 
        GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6), 
                (int) (120.040687 * 1E6)); // 定位到浙工大,左參數為緯度,右參數為經度,單位為微度(1度=10^6微度) 
 
        mController.setCenter(gp); // 設置為地圖中心 
 
        List<Overlay> list = mapView.getOverlays(); // 獲取圖層列表 
 
        DemoOverlay demo = new DemoOverlay(this); // 新建自定義Overlay 
 
        list.add(demo); // 往列表添加自定義圖層 
    } 
 
    public class DemoOverlay extends Overlay { 
 
        Context mContext; // 上下文 
 
        public DemoOverlay() { 
            super(); 
        } 
 
        public DemoOverlay(Context c) { 
            this(); 
            mContext = c; 
        } 
 
        @Override 
        public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
 
            Projection proj = mapView.getProjection(); // 獲取投影對象 
            Point mPoint = new Point(); 
            GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6), 
                    (int) (120.040687 * 1E6)); 
            proj.toPixels(gp, mPoint); // 將經緯度轉換成手機屏幕上的像素,存儲在Point對象中 
            Paint mPaint = new Paint(); 
            // mPaint.setColor(Color.RED); //設置為紅色 
            Bitmap pic = BitmapFactory.decodeResource(getResources(), 
                    R.drawable.da_marker_red); // 得到Bitmap對象 
 
            canvas.drawBitmap(pic, mPoint.x, mPoint.y, mPaint); // 繪圖 
            super.draw(canvas, mapView, shadow); 
        } 
 
        @Override 
        public boolean onTap(GeoPoint gp, MapView mapView) { 
            new AlertDialog.Builder(mContext) 
                    .setTitle("詳情信息") 
                    .setMessage( 
                            "當前緯度為:" + gp.getLatitudeE6() * 1.0 / (1E6) 
                                    + "\n經度為:" + gp.getLongitudeE6() * 1.0 
                                    / (1E6)).setPositiveButton("確定", null) 
                    .create().show(); 
            return super.onTap(gp, mapView); 
        } 
 
    } 
 
 

佈局文件裡需添加Map標簽:

[html] 
<com.amap.mapapi.map.MapView 
    android:id="@+id/mapView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" /> 

圖片資源放在drawable文件夾裡.

                

You May Also Like