android手機地圖開發流程基礎

今天看到瞭某網站上的一個僅3萬元的手機地圖顯示系統的開發項目,心動之餘隻恨自己當時沒有好好的學好手機地圖開發,現在將android手機地圖開發的流程溫習一遍。

一、註冊 Android 地圖 API 密鑰

運行:keytool -list -keystore ~/.android/debug.keystore

用得到的MD5碼到https://code.google.com/intl/zh-CN/android/maps-api-signup.html註冊API密鑰。

註冊完成後會得到如下的網頁:

您的密鑰是:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

此密鑰適用於所有使用以下指紋所對應證書進行驗證的應用程序:

XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX

下面是一個 xml 格式的示例,幫助您瞭解地圖功能:

<com.google.android.maps.MapView
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”

android:apiKey=”XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
/>

二、Google Map API的使用

Android中定義瞭一個名為com.google.android.map的包,其中包含瞭一系列用於在google map上顯示、控制和疊層信息的功能類,以下是該包中最重要的幾個類:

1.MapActivity:這個類是用於顯示Google Map的Activity類,它需要連接底層網絡。MapActivity是一個抽象類,任何想要顯示MapView的activity都需要派生自MapActivity,並且在其派生類的onCreate()中,都要創建一個MapView實例。

2.MapView:MapView是用於顯示地圖的View組件。它派生自android.view.ViewGroup。它必須和MapActivity配合使用,而且隻能被MapActivity創建,這是因為MapView需要通過後臺的線程來連接網絡或者文件系統,而這些線程需要有MapActivity來管理。

3.MapController:MapController用於控制地圖的移動、縮放等。

4.OverLay:這是一個可顯示於地圖之上的可繪制的對象。

5.GeoPoint:這是一個包含經緯度位置的對象。

三、實例開發

1.創建工程,註意SDK旋轉為”Goolge APIs”

2.修改AndroidManifest.xml文件

由於使用Google Map API,所以必須添加

由於需要從網絡獲取地圖數據,所以需要訪問網絡的權限

可能還需要添加其他權限。

例如:

AndroidManifest.xml



    
       
        
            
                
                
            
        
    
    
    

3.創建MapView

要顯示地圖,需要創建一個MapView,在Xml文件中的佈局如下。其中的android:apiKey的值就是我們第一步申請的Key瞭。

main.xml

 
 

當然,可以在程序中通過如下代碼來創建MapView:

MapView map = new MapView( this, “(android maps api key)”);

4.實現MapActivity

MapView需要由MapActivity來管理,所以程序部分應該繼承自MapActivity類,必須實現isRouteDisplay方法。

MapView提供瞭3中模式的地圖,分別可以通過以下方式設置采用什麼模式來顯示地圖。

mMapView.setTraffic(true); //設置為交通模式

mMapView.setSatellite(true); //設置為衛星模式//

mMapView.setStreetView(false); //設置為街景模式

通過setBuiltZoomControls方法設置地圖是否支持縮放。

5.MapController的使用

如果需要設置地圖顯示的地點以及放大倍數等,就需要使用MapController來控制地圖。可以通過如下代碼獲得MapController對象:

mMapController = mMapView.getController();

要定位地點,需要構造一個GeoPoint來表示地點的經緯度,然後使用animateTo方法將地圖定位到指定的GeoPoint上,代碼如下:

//設置起點為成都
mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
//定位到成都
mMapController.animateTo(mGeoPoint); 

6.Ovelay的使用

如果需要在地圖上標註一些圖標文字等信息,就需要使用Overlay。這裡我們首先要將地圖上的經度和緯度轉換成屏幕上的實際坐標,才能將信息繪制上去。Map API中提供瞭Projection.toPixels(GeoPoint in,GeoPoint out)方法,可以將經度和緯度轉換成屏幕上的坐標。

首先需要實現OverLay中的draw方法才能在地圖上繪制信息,代碼如下:

class MyLocationOverlay extends Overlay
{
     @Override
     public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
     {
             ........
     }
}

綜合上面的代碼如下

Activity01.java

import java.util.List;
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 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;

public class Activity01 extends MapActivity
{
    private MapView     mMapView;
    private MapController mMapController; 
    private GeoPoint mGeoPoint;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mMapView = (MapView) findViewById(R.id.MapView01);
        //設置為交通模式
//        mMapView.setTraffic(true);
        //設置為衛星模式
//        mMapView.setSatellite(true); 
        //設置為街景模式
        mMapView.setStreetView(false);
        //取得MapController對象(控制MapView)
        mMapController = mMapView.getController(); 
        mMapView.setEnabled(true);
        mMapView.setClickable(true);
        //設置地圖支持縮放
        mMapView.setBuiltInZoomControls(true); 
        
        
        //設置起點為成都
        mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000));
        //定位到成都
        mMapController.animateTo(mGeoPoint); 
        //設置倍數(1-21)
        mMapController.setZoom(15); 
        
        
        
        //添加Overlay,用於顯示標註信息
        MyLocationOverlay myLocationOverlay = new MyLocationOverlay();
        List list = mMapView.getOverlays();
        list.add(myLocationOverlay);
    }
    protected boolean isRouteDisplayed()
    {
        return false;
    }
    class MyLocationOverlay extends Overlay
    {
        @Override
        public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
        {
            super.draw(canvas, mapView, shadow);
            Paint paint = new Paint();
            Point myScreenCoords = new Point();
            // 將經緯度轉換成實際屏幕坐標
            mapView.getProjection().toPixels(mGeoPoint, myScreenCoords);
            paint.setStrokeWidth(1);
            paint.setARGB(255, 255, 0, 0);
            paint.setStyle(Paint.Style.STROKE);
            Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.home);
            canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
            canvas.drawText("天府廣場", myScreenCoords.x, myScreenCoords.y, paint);
            return true;
        }
    }
}

發佈留言