素材巴巴 > 程序开发 >

Google Map API v2 (四)----- 导航路径

程序开发 2023-09-13 22:22:26

仍然是建议个异步小任务

1 private GetPathTask mGetPathTask = null;
 2     
 3 private void getGuidePath(LatLng origin){
 4     if(mGetPathTask != null){
 5         mGetPathTask.cancel(true);
 6     }
 7     mGetPathTask = new GetPathTask();
 8     mGetPathTask.execute(origin, mMarker.getPosition());
 9 }

第8行的两个入参都是LatLng对象,分别为其实地点和目标地点。

GetPathTask任务定义如下:

  1 private class GetPathTask extends AsyncTask>{
   2 
   3   @Override
   4   protected void onPostExecute(List result){
   5     if((result == null) || result.isEmpty()){
   6       Toast.makeText(MapsActivity.this, R.string.GetPathErr, Toast.LENGTH_LONG).show(); 
   7       return;
   8     }    
   9 
  10   if(mGuidePath == null){
  11     mGuidePath = mMapView.addPolyline(new PolylineOptions()
  12                    .color(0xfff5cb08)
  13                    .width(10)
  14                    .geodesic(true));
  15   }
  16   mGuidePath.setPoints(result);
  17 }
  18 
  19   @Override
  20   protected List doInBackground(LatLng... params) {
  21     LatLng origin = params[0];
  22     LatLng destination = params[1];
  23     String responseString = null;
  24     String urlString = "http://maps.google.com/maps/api/directions/xml?sensor=true&mode=walking&avoid=highways";
  25 
  26     HttpGet httpGet = new HttpGet(urlString + "&origin=" + origin.latitude + "," + origin.longitude
  27                                   + "&destination=" + destination.latitude + "," + destination.longitude);
  28 
  29     HttpResponse mHttpResponse = null;
  30     HttpEntity mHttpEntity = null;
  31     try{
  32       HttpParams httpParameters = new BasicHttpParams();  
  33       HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);  
  34       HttpClient httpClient = new DefaultHttpClient(httpParameters);   
  35 
  36       mHttpResponse = httpClient.execute(httpGet);
  37 
  38       if (mHttpResponse.getStatusLine().getStatusCode() == 200){  
  39         mHttpEntity = mHttpResponse.getEntity();
  40         responseString = mHttpEntity.toString();
  41         responseString = EntityUtils.toString(mHttpEntity);  
  42       }
  43     }
  44     catch (Exception e){
  45       log("Exception in GetPathTask doInBackground():" + e);
  46     }
  47 
  48     if(responseString == null){
  49         log("GetPathTask doInBackground() responseString == null");
  50     }else if (-1 == responseString.indexOf("OK")){  
  51         log("GetPathTask doInBackground() response status error");
  52     }else{
  53         int pos1 = responseString.indexOf("");  
  54         pos1 = responseString.indexOf("", pos1 + 1);  
  55         int pos2 = responseString.indexOf("", pos1);  
  56         responseString = responseString.substring(pos1 + 8, pos2);
  57 
  58         List points = decodePoly(responseString); 
  59         return points;
  60     }
  61     return null;
  62   }
  63 
  64   private List decodePoly(String encoded) {  
  65     List poly = new ArrayList();  
  66     int index = 0, len = encoded.length();  
  67     int lat = 0, lng = 0;  
  68 
  69     while (index < len) {  
  70       if(isCancelled())
  71         break;
  72       int b, shift = 0, result = 0;  
  73       do {  
  74         b = encoded.charAt(index++) - 63;  
  75         result |= (b & 0x1f) << shift;  
  76         shift += 5;  
  77       } while (b >= 0x20);  
  78       int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));  
  79       lat += dlat;  
  80 
  81       shift = 0;  
  82       result = 0;  
  83       do {  
  84         b = encoded.charAt(index++) - 63;  
  85         result |= (b & 0x1f) << shift;  
  86         shift += 5;  
  87       } while (b >= 0x20);  
  88       int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));  
  89       lng += dlng;  
  90 
  91       double dLat = lat / 1E5;
  92       double dLng = lng / 1E5;
  93       LatLng p = new LatLng(dLat, dLng);
  94 
  95       poly.add(p);  
  96     }  
  97     if(isCancelled())
  98       return null;
  99 
 100     return poly;  
 101   }  
 102 }

看doInBackgound函数

24~27行,构造一个google directions API的HTTP请求,格式类似这样:

http://maps.google.com/maps/api/directions/xml?sensor=true&mode=walking&avoid=highways&origin=纬度,经度&destination=纬度,经度
我这个设置的步行模式,避免高速,返回数据是XML格式。更多的可选项请参考官文:

https://developers.google.com/maps/documentation/directions/

 

48~59行,返回的response中标签中是base64编码的数据,是一组point,即google direction 服务为我们规划出的路径途经的各个点,调用decodePoly解析成List

4行,onPostExecute函数中

10~16行,调用GoogleMap.addPolyline(PolylineOptions polylineOption) 在地图上加一个折线。调用Polyline.setPoints(point)设置折线的各个点。

贴个图看看,黄色的粗线把我们导向了美丽的莫愁湖。这里我还加了一条细红线,直接指向目的地,用于在移动过程中始终标识出目的地所在方位。

google地图支持在地图上添加几种shape对象,详见官文。

 

转载于:https://www.cnblogs.com/inkheart0124/p/3536860.html


标签:

上一篇: HTML自定义标签开发入门实例 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。