歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android Google地圖上overlay顯示位置,路線

做了下手機google地圖上的定位和圖層標簽的顯示,先學學基礎,把想要顯示的標簽搞定。

好,首先是定位,這次用到的定位只是簡單的傳入經緯度,然後顯示標簽,畫上圖層就達到目的啦,Geoconding什麼的根據地址名字來確定的話這次先不用。

定位用到的是LocationManager,根據它的成員方法requestLocationUpdates如果我們的位置在一定范圍內改變了,或者經過一定時間了,那就重新標記了。

   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new TestLocationListener(myloctionController,mapOverlays, firstOverlay));

這個函數中的最後一個參數要求是一個LocationListener對象,我就新建了一個類,實現了LocationListener

package myOverlay;
/*
 * 這個類用來定位mylocation,有一個位置監聽器的接口,一旦位置發生改變之後就讓圖標也變化
 *
 *
 */
import java.util.ArrayList;
import java.util.List;

import com.google.Android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;

public class TestLocationListener implements LocationListener{

 private List<Overlay> mapOverlays=null;
 private MylocationOverlay firstOverlay=null;
 private MapController myloctionController=null;//用於定位移動的動畫效果
 
 public TestLocationListener(MapController myloctionController2, List<Overlay> mapOverlays,
   MylocationOverlay firstOverlay) {
  super();
  this.mapOverlays = mapOverlays;
  this.firstOverlay = firstOverlay;
  this.myloctionController=myloctionController2;
 }

 //位置發生變化的時候就讓定位自己的圖標也發生相應的變化
 @Override
 public void onLocationChanged(Location location) {
  double lon=0,lat=0;
  lon=location.getLongitude();
  lat=location.getLatitude();
  System.out.println("現在的設置的位置經度為:  "+location.getLongitude());
  System.out.println("現在的設置的位置緯度為:  "+location.getLatitude());
  
        //創建一個GeoPoint對象,通過經緯度,指定地圖上的一個點
  //GeoPoint point = new GeoPoint(19240000,-99120000);
        GeoPoint point = new GeoPoint((int) (lat*1000000),(int) (lon*1000000));
        System.out.println(point);
        //創建一個OverLayItem對象,一個對象代表一個標記
        OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
        //將創建好的OverLayItem對象,添加到firstOverlay對象當中
        firstOverlay.addOverlay(overlayitem);
        //將firstOverlay對象,添加到mapOverlays當中
        mapOverlays.add(firstOverlay);
      //以動畫的形式以一定的速度移動到某個點
        myloctionController.animateTo(point);
        myloctionController.setZoom(10);//設置放大的級別
        myloctionController.setCenter(point);//估計是中間設置吧
        System.out.println("成功將用圖標顯示我現在的位置");
 }

 @Override
 public void onProviderDisabled(String provider) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void onProviderEnabled(String provider) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void onStatusChanged(String provider, int status, Bundle extras) {
  // TODO Auto-generated method stub
  
 }

}

現在就用到一個函數,只要覆蓋它就行。因為一些參數設置都是默認的,所以只要位置改變了就會調用onLocationChanged,來繪制地圖上的圖層,也就是我們自己的位置的這個圖層。這個類沒什麼好講的,重點也不在這裡,講講圖層的實現。

首先獲得當前位置的左邊點,函數的參數中自動傳入了,很輕松拿到;

接著生成標記對象,這裡一個overlayitem就是一個標記咯,加上些提示信息,定位中總共也就一個標記;

然後把標記添加到firstOverlay這個圖層中;

再要做的就是把圖層放在手機原來的圖層裡咯,mapOverlays就是在主窗口中獲得了手機原來的圖層,傳參到這裡。只要添加進去就搞定了。

要是要弄的稍微動感點就加個myloctionController咯。定位就OK了

對了,還有firstOverlay要說下,這是個MylocationOverla對象,繼承ItemizedOverlay<OverlayItem>,是google map提供的api中查到的,是google map上面畫圖層需要用到的。還是老辦法,繼承了這個類那就覆蓋裡面的一些方法,其中要注意的就是因為其中有些參數是傳進來的,所以在構造函數中要稍微處理下。(構造函數神馬的還是用系統自動生成的比較好,免得弄錯,上次就是因為調用super方法弄錯了,找了半天才發現。。自己java基礎真得檢討了。。)這個類中具體繼承的類自己也可以查查看,像onTap()這個函數現在用到的就是點擊標簽的時候彈出窗口來顯示一些信息咯。簡單用法是這樣,當然更復雜的以後用到了再說吧。

那麼定位就OK了。

 

接下來說路線的顯示。。方法倒是一樣,一個是顯示一個標簽,一個是顯示N個標簽。。。

因為顯示的標簽不少,我怕主界面會卡,我就放到了另外一個線程中了,先看看

class ShowRouteThread implements Runnable {
  @Override
  public void run() {
   System.out.println("進入了顯示路徑函數,開始畫圖吧");    
   stopTag=routeData.getStopTag();
   stopTitle=routeData.getStopTitle();
   stopLat=routeData.getStopLat();
   stopLon=routeData.getStopLon();
   int lat,lon;   
   for (int i = 0; i < stopTag.size(); i++) {
    lat=(int)(Double.parseDouble(stopLat.get(i))*1000000);
    lon=(int)(Double.parseDouble(stopLon.get(i))*1000000);
    GeoPoint point=new GeoPoint(lat,lon);
    //一個overitem就是一個點,一個對象
    OverlayItem overlayitem = new OverlayItem(point, stopTag.get(i), stopTitle.get(i));
    //RouteOverlay間接繼承ItemizedOverlay<OverlayItem>,表示一個圖層,在這個圖層上面可以有很多的圖標
    RouteOverlay.addOverlay(overlayitem);         
   } 
   //mapOverlays在前面已經和手機圖層聯系起來了,將一個個圖層添加進去就能顯示在手機上
   mapOverlays.add(RouteOverlay);
   GeoPoint lastpPoint=new GeoPoint( (int)(Double.parseDouble(stopLat.get(stopTag.size()-1))*1000000), (int)(Double.parseDouble(stopLon.get(stopTag.size()-1))*1000000) );
   //以動畫的形式以一定的速度移動到某個點
         myloctionController.animateTo(lastpPoint);
         //myloctionController.setZoom(10);//設置放大的級別
         myloctionController.setCenter(lastpPoint);//估計是中間設置吧
  }
 }

 

首先是把原來解析到的數據都拿來吧

stopTag=routeData.getStopTag();
   stopTitle=routeData.getStopTitle();
   stopLat=routeData.getStopLat();
   stopLon=routeData.getStopLon();

之前設計的xml的數據存放方法還是不錯的,這樣拿來就簡單多了。這次是直接顯示路線,就不用等改變了經緯度再顯示位置啦,當然就不用Locationmanager了,直接根據四個arraylist裡面的數據來確定位置,生成標簽對象,一個個添加到圖層裡面,然後等全部都添加完以後再把這個圖層放在手機圖層裡面,和上面的差不多。

這樣子的話我們這個程序裡面現在有兩個圖層,一個是定位我們自己位置的firstoverlay,然後就是現在這個RouteOverlay,當然現在這個圖層裡面標簽多了點而已。那麼這兩個就都搞定了。

哦,對了,最後還得說下權限問題,上次也就是因為這個卡了好久。

要用google map的話除了apikey以外(這個就自己去申請吧),權限也是要的,就是這個<uses-library android:name="com.google.android.maps" />

然後就是要精確點的定位的話就要用 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

當然咯,還有一個就是因為要聯網嘛,所以要 <uses-permission android:name="android.permission.INTERNET" />

好,這樣就木有問題了!

Copyright © Linux教程網 All Rights Reserved