Android開發之Google Map


2013-07-03

Google Map 提供三種視圖:

1. 傳統的矢量地圖,提供行政區域、交通以及商業信息等。

2. 不同分辨率的衛星照片,與Google Earth 基本一樣。

3. 地形地圖,可以顯示地形和等高線。

Google Map的姐妹產品Google Earth是一個桌面應用程序,在三維模型上提高街景、更多的衛星視圖以及GPS定位的功能。

基於Google Earth 和 Google Map 的游戲舉例:

在全球任何地方甚至海底模擬開飛機或者潛水艇,來漫游整個世界,詳見:http://www.sea-seek.com/

在地球上任何地方開着自己喜歡的奔跑車,在自己周圍以及熟悉的地方模擬駕駛,詳見:http://geoquake.jp/en/webgame/DrivingSimulatorGM/

 

手機上如何應用Google Map

1. 我的位置

通過識別你附近無線發射塔的信息廣播確定你的位置,在地圖上顯示出來。通常在1000米范圍之內。即使沒有GPS,也可以確定位置。支持內置GPS,可以鏈接到藍牙GPS傳感器。

2. 地圖和衛星視圖

提供所查看地區的地圖和衛星視圖,其界面使用感覺與在台式機上相同。

3. 商戶列表

不需要輸入當前位置即可找到附近的商戶。

4. 駕車路線

不需要輸入出發點,就可方便地獲得駕車路線,其中會清楚地標明每次轉彎。

5. 公交換乘

查看公交和地鐵路線,確定轉車路線。

6. 路況信息

Google Map中的公路會根據實時路況數據,以綠色、黃色或紅色顯示。

7. 收藏夾

為你常去的地方加上書簽,以便能在地圖上非常方便地返回到這些地方。

使用 Android Maps API 和 Android Location API 就可以實現這些功能。

 

准備工作

1. 找到/下載Map擴展庫:com.google.android.maps

<ANDROID_SDK_ROOT>/add-ons/google_apis-3/libs/

2. 申請Android Map API Key

准備Google賬號。Google賬號是通用的,Gmail的賬號就可以。

當一個APP發布時必須要證明書。證明書就是MD5。

debug版的證明書:debug.keystore

a. 找到debug.keystore文件

Eclipse中,Windows->Preference->Android->Build ,其中Default debug keystore的值便是debug.keystore的路徑。

b. 取得debug.keystore的MD5值

在命令提示符下進入debug.keystore文件所在路徑,執行命令:keytool –list –keystore debug.keystore ,輸入keystore密碼:android ,即可取得MD5值。

c. 申請Android Map的API Key

http://code.google.com/intl/zh-CN/android/maps-api-signup.html

d. 記下申請的Android Map API Key值

3. 創建基於Google APIs的AVD

Eclipse中,AVD管理,Create AVD,Target處選擇Google APIs-1.5(或其他版本)

4. 創建基於Google APIs的Android 工程

在創建Android工程時,Target處選擇Google APIs

在AndroidManifest.xml文件中添加權限

<uses-library android:name=”com.google.android.maps”/>

 

Google Map API 的使用

Android 中定義了一個名為com.google.android.maps的包,其中包含了一系列用於在Google Map上顯示、控制和層疊信息的功能類。

MapActivity, 用於顯示Google Map的Activity類,需要連接底層網絡。必須被擴展並在子類onCreate()方法中創建一個MapView實例。

MapView, 用於顯示地圖的View組件。派生自android.view.ViewGroup,只能在MapActivity中創建。MapView需要通過后台線程來連接網絡或文件系統,這些線程由MapActivity管理。

MapController, 用於控制地圖的移動、縮放等。

Overlay, 可顯示於地圖之上的可繪制的對象。

GeoPoint, 包含經緯度位置的對象。

 

創建MapView的兩種方法:

a. 在xml布局文件中創建MapView

<com.google.android.maps.MapView

  android:id=”@+id/mapview01”

  android:layout_width=”fill_parent”

  android:layout_height=”fill_parent”

  android:apiKey=”xxx” />

其中apiKey在之前已經申請。

b. 在代碼中創建MapView

MapView map = new MapView(this, apiKey);

 

實現MapActivity

在MapActivity中,方法isRoutedDisplayed必須要被重寫

MapView提供三種模式分別是

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

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

mapView.setStreetView(true); // 設置為街景模式

 

使用MapController在地圖定位到某地以及設置放大的倍數

mapController = mapView.getController();

要定位地點,需要構建一個GeoPoint來表示地點的經度和緯度,然后使用animateTo將地圖定位到指定的GeoPoint上

// 在地圖上定位到成都

geoPoint = new GeoPoint((int)(30.659259*1000000), (int)(104.065762*1000000));

mapController.animateTo(geoPoint);

 

使用Overlay在地圖上標注一些圖標文字等信息

首先,將地圖上的經度和緯度轉換為屏幕上的坐標

Projection.toPixels(GeoPoint in, Point out);

其次,實現Overlay的draw方法

class LocationOverlay extends Overlay {

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

    // 繪制圖標文字等信息

    super.draw(canvas, mapView, shadow);

    Paint paint = new Paint();

    Point point = new Point();

    mapView.getProjection().toPixels(geoPoint, point);

    paint.setStrokeWidth(1);

    paint.setARGB(255, 255, 0, 0);

    paint.setStyle(Paint.Style.STROKE);

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.home);

    canvas.drawBitmap(bitmap, point.x, point.y, point);

    canvas.drawText(“天府廣場”, point.x, point.y, point);

    return true;

  }

}

創建LocationActivity,將LocationOverlay作為其的內部類

public class LocationActivity extends MapActivity {

  private MapView mapView;

  private MapController mapController;

  private GeoPoint geoPoint;

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

 

    mapView = (MapView) findViewById(R.id.mapView01);

    mapView.setTraffic(true);

    mapView.setSatellite(true);

    mapView.setStreetView(true);

    mapView.setEnabled(true);

    mapView.setClickable(true);

    mapView.setBuiltInZoomControls(true);

 

    mapController = mapView.getController();

    geoPoint = new GeoPoint((int)(30.659259*1000000), (int)(104.065762*1000000));

    mapController.animateTo(geoPoint);

    mapController.setZoom(12);

 

    LocationOverlay locationOverlay = new LocationOverlay();

    List<Overlay> list = mapView.getOverlays();

    list.add(locationOverlay);

  }

  protected boolean isRouteDisplayed() {

    return false;

  }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM