高德地图基础功能使用心得

个人感觉高德的sdk比百度的好用,而且出错概率也更小,如果用高德地图做一个简单的当前地点定位,不仅不需要设置mapView控件,直接集成在activity里即可。而且还可以按照固定的刷新频率获得经纬度,以及当前所在的街道和建筑物的名字,代码不长,本质上给LocationMangerProxy配置一个AmapLocationLister监听器即可,可以配置在任意一个activity或service中,百度地图换了新版之后旧版的类就没有了,真是太难用了

配置环境

首先去官网下载sdk和demo

下载完后把左边开发包里的jar包和.so文件放到lib目录下,

把demo包里的AMap_Location_v1.4.0.jar也放进去,放完后是这样的

千万注意:AMap_3DMap_v2.6.0_20150914.jar要放在lib文件夹中,上图没有表示出来

最后把从官网申请的key写在manefest中

[html]  view plain  copy
  1. <meta-data  
  2.            android:name="com.amap.api.v2.apikey"  
  3.            android:value="42af3812644d8c1774dba300630980a8"/>    


1、任意activity获取当前经纬度的方法

[java]  view plain  copy
  1. package com.example.qichebaojiata;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Color;  
  5. import android.location.Location;  
  6. import android.os.Bundle;  
  7.   
  8. import com.amap.api.location.AMapLocation;  
  9. import com.amap.api.location.AMapLocationListener;  
  10. import com.amap.api.location.LocationManagerProxy;  
  11. import com.amap.api.location.LocationProviderProxy;  
  12. import com.amap.api.maps.AMap;  
  13. import com.amap.api.maps.LocationSource;  
  14.   
  15. import com.amap.api.maps.model.BitmapDescriptorFactory;  
  16.   
  17. import com.amap.api.services.core.LatLonPoint;  
  18. import com.amap.api.services.poisearch.PoiSearch;  
  19. import com.amap.api.services.poisearch.PoiSearch.SearchBound;  
  20.   
  21. public class MapActivity extends Activity implements AMapLocationListener {//继承位置监听器,有一个最重要的方法,onLocationChanged(AMapLocation arg0)用于时时刷新当前位置  
  22.      //声明变量  
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.           
  27.         //初始化定位对象,LocationManagerProxy类是个位置管理类,给它设置一个回调监听器,指定定位设备,指定刷新频率等就可以用了  
  28.         LocationManagerProxy mLocationManagerProxy =LocationManagerProxy .getInstance(this);//定位对象与监听器绑定  
  29.         //注册定位监听  
  30.         mLocationManagerProxy.requestLocationData(  
  31.                 LocationProviderProxy.AMapNetwork,//定位设备,netWork是全部都用,  
  32.                 1000,//刷新频率,单位ms  
  33.                 15//移动距离后刷新,仅对gps有效  
  34.                 this//AMapLocationListener 回调监听器  
  35.                 );    
  36.           
  37. }  
  38.       
  39.   
  40. @Override  
  41.     /** 
  42.      * 定位回调 
  43.      */  
  44.     public void onLocationChanged(AMapLocation arg0) {  
  45.         // TODO Auto-generated method stub  
  46.         //检测错误码  
  47.         if(arg0!=null&&arg0.getAMapException().getErrorCode()==0){//等于0是成功了  
  48. System.out.println("城市:"+arg0.getCity()+"电话区号"+arg0.getCityCode());  
  49.             System.out.println("省:"+arg0.getProvince());  
  50.             System.out.println("国家:"+arg0.getCountry());  
  51.             System.out.println("经度"+arg0.getLatitude());  
  52.             System.out.println("纬度"+arg0.getLongitude());  
  53.             System.out.println("路是:"+arg0.getRoad());  
  54.             System.out.println("速度:"+arg0.getSpeed());  
  55.             System.out.println("楼层:"+arg0.getFloor());  
  56.             System.out.println("建筑物"+arg0.getPoiName());  
  57.         }else {  
  58.             System.out.println("定位失败");  
  59.         }  
  60.           
  61.     }  
  62.       
  63. }  

附近位置搜索功能:

先让activity继承一个onPoiSearchListener

[java]  view plain  copy
  1. public class MapActivity extends Activity implements AMapLocationListener, OnPoiSearchListener   
在activity中写一个方法

[java]  view plain  copy
  1. public void search(){  
  2.         //Query类是一个搜索条件的封装类,用于封装页数和每页多少个  
  3.         PoiSearch.Query query = new PoiSearch.Query("车","汽车服务|汽车销售|汽车维修|摩托车服务|交通设施服务|道路附属设施","青岛市");  
  4.         // 第一个参数表示搜索字符串,  
  5.         //第二个参数表示POI搜索类型,二者选填其一,  
  6.         //POI搜索类型共分为以下20种:汽车服务|汽车销售|  
  7.         //汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|  
  8.         //住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|  
  9.         //金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施  
  10.         //cityCode表示POI搜索区域的编码,是必须设置参数  
  11.         query.setPageSize(10);//设置每页返回多少条  
  12.         query.setPageNum(0);//设置车讯页码  
  13.         //PoiSearch类是一个搜索引擎,如果要返回搜索结果需要绑定一个OnPoiSearchListener类  
  14.         PoiSearch poiSearch = new PoiSearch(this, query);  
  15.         poiSearch.setOnPoiSearchListener(this);//设置本类为搜索监听类  
  16.         //设置一个地图点,LatLonPoint就是一个经纬度的封装类  
  17.           
  18.         LatLonPoint point = new LatLonPoint(amapLocation.getLatitude(), amapLocation.getLongitude());  
  19.         //地点对象LatLonPoint如果想和引擎poiSearch设置进去,要用另一个封装类SearchBound  
  20.         //它封装了当前位置,搜索半径  
  21.         poiSearch.setBound(new SearchBound(point,2000,true));//第二个参数是搜索半径  
  22.         poiSearch.searchPOIAsyn();  
  23.     }  

这个search()方法需要在获得了当前经纬度之后调用

[java]  view plain  copy
  1. AMapLocation amapLocation;  
  2. boolean searchFlag = false;  
  3. @Override  
  4.     /** 
  5.      * 定位回调 
  6.      */  
  7.     public void onLocationChanged(AMapLocation arg0) {  
  8.         // TODO Auto-generated method stub  
  9.         //检测错误码  
  10.         if(arg0!=null&&arg0.getAMapException().getErrorCode()==0){//等于0是成功了  
  11.             amapLocation = arg0;  
  12.               
  13.             if(!searchFlag){  
  14.                 search();  
  15.                 searchFlag=true;  
  16.             }  
  17.               
  18.         }else {  
  19.             System.out.println("定位失败");  
  20.         }  
  21.           
  22.     }  


写一个专门用来定位的服务也很简单

[java]  view plain  copy
  1. package com.situ.service;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.location.Location;  
  6. import android.os.Bundle;  
  7. import android.os.IBinder;  
  8.   
  9. import com.amap.api.location.AMapLocation;  
  10. import com.amap.api.location.AMapLocationListener;  
  11. import com.amap.api.location.LocationManagerProxy;  
  12. import com.amap.api.location.LocationProviderProxy;  
  13.   
  14. public class GPSService extends Service implements AMapLocationListener {  
  15.       
  16.     public static String PROVENCE = "山东";  
  17.     public static String CITY_NAME = "青岛";  
  18.     public static double LATITUDE = 0.0;  
  19.     public static double LONGITUDE = 0.0;  
  20.     public static String POI_NAME = "未知";  
  21.     @Override  
  22.     public IBinder onBind(Intent intent) {  
  23.         // TODO Auto-generated method stub  
  24.         return null;  
  25.     }  
  26.   
  27.     @Override  
  28.     public int onStartCommand(Intent intent, int flags, int startId) {  
  29.         // TODO Auto-generated method stub  
  30.         System.out.println("服务启动");  
  31.         System.out.println("服务启动");  
  32.         System.out.println("服务启动");  
  33.         System.out.println("服务启动");  
  34.          //初始化定位对象,LocationManagerProxy类是个位置管理类,给它设置一个回调监听器,指定定位设备,指定刷新频率等就可以用了    
  35.         LocationManagerProxy mLocationManagerProxy =LocationManagerProxy .getInstance(getApplicationContext());//定位对象与监听器绑定    
  36.         //注册定位监听    
  37.          
  38.         mLocationManagerProxy.requestLocationData(    
  39.                 LocationProviderProxy.AMapNetwork,//定位设备,netWork是全部都用,    
  40.                 2000,//刷新频率,单位ms    
  41.                 15//移动距离后刷新,仅对gps有效    
  42.                 this//AMapLocationListener 回调监听器    
  43.                 );      
  44.         return super.onStartCommand(intent, flags, startId);  
  45.     }  
  46.   
  47.     @Override  
  48.     public void onLocationChanged(Location location) {  
  49.         // TODO Auto-generated method stub  
  50.           
  51.     }  
  52.   
  53.     @Override  
  54.     public void onStatusChanged(String provider, int status, Bundle extras) {  
  55.         // TODO Auto-generated method stub  
  56.           
  57.     }  
  58.   
  59.     @Override  
  60.     public void onProviderEnabled(String provider) {  
  61.         // TODO Auto-generated method stub  
  62.           
  63.     }  
  64.   
  65.     @Override  
  66.     public void onProviderDisabled(String provider) {  
  67.         // TODO Auto-generated method stub  
  68.           
  69.     }  
  70.   
  71.     @Override    
  72.     /**  
  73.      * 定位回调  
  74.      */    
  75.     public void onLocationChanged(AMapLocation arg0) {    
  76.         // TODO Auto-generated method stub    
  77.         //检测错误码    
  78.         if(arg0!=null&&arg0.getAMapException().getErrorCode()==0){//等于0是成功了    
  79.             System.out.println("城市:"+arg0.getCity()+"电话区号"+arg0.getCityCode());    
  80.             this.PROVENCE = arg0.getProvince();  
  81.             this.CITY_NAME = arg0.getCity();  
  82.             this.POI_NAME = arg0.getPoiName();  
  83.             this.LATITUDE = arg0.getLatitude();  
  84.             this.LONGITUDE = arg0.getLongitude();  
  85.         }else {    
  86.             System.out.println("定位失败");    
  87.         }    
  88.             
  89.     }    
  90.       
  91.   
  92. }  

我就喜欢把AmapLocationListener放在一个service里,实现监听器的分离,那么在activity里的map对象想获得当前定位的蓝色指针,就要外接listener,这样activity就不需要继承

AmapLocationListener接口了,可以实现资源利用的优化

[java]  view plain  copy
  1. package com.situ.schoolsale;  
  2.   
  3. import java.util.ArrayList;    
  4. import java.util.List;    
  5.     
  6.   
  7.   
  8.   
  9.   
  10. import android.app.Activity;    
  11. import android.content.Intent;  
  12. import android.graphics.Color;    
  13. import android.location.Location;    
  14. import android.os.Bundle;    
  15.     
  16.   
  17.   
  18.   
  19.   
  20. import com.amap.api.location.AMapLocation;    
  21. import com.amap.api.location.AMapLocationListener;    
  22. import com.amap.api.location.LocationManagerProxy;    
  23. import com.amap.api.location.LocationProviderProxy;    
  24. import com.amap.api.maps.AMap;    
  25. import com.amap.api.maps.LocationSource;    
  26. import com.amap.api.maps.MapView;    
  27. import com.amap.api.maps.model.BitmapDescriptor;    
  28. import com.amap.api.maps.model.BitmapDescriptorFactory;    
  29. import com.amap.api.maps.model.LatLng;    
  30. import com.amap.api.maps.model.Marker;    
  31. import com.amap.api.maps.model.MarkerOptions;    
  32. import com.amap.api.maps.model.MyLocationStyle;    
  33. import com.situ.service.GPSService;  
  34.     
  35. public class MapActivity extends Activity implements  LocationSource{//地图加载完成的监听器    
  36.      //声明变量    
  37.     private MapView mapView;    
  38.     private AMap aMap;    
  39.     LocationManagerProxy mAMapLocationManager ;    
  40.     OnLocationChangedListener mListener;    
  41.     private Marker marker;// 定位雷达小图标    
  42.         
  43.         
  44.     List<LatLng> list = new ArrayList<LatLng>();//用于存储轨迹的单点    
  45.     @Override    
  46.     protected void onCreate(Bundle savedInstanceState) {    
  47.         super.onCreate(savedInstanceState);    
  48.         setContentView(R.layout.activity_map);   
  49.         if(GPSService.isRunning==false){  
  50.             startService(new Intent(this,GPSService.class));//开启GPS服务  
  51.         }  
  52.         //在onCreat方法中给aMap对象赋值    
  53.         //显示地图用的三句话    
  54.         mapView = (MapView) findViewById(R.id.map);    
  55.         mapView.onCreate(savedInstanceState);// 必须要写    
  56.         aMap = mapView.getMap();    
  57.         setUpMap();    
  58.         new Thread(){  
  59.             public void run() {  
  60.                 while(true){  
  61.                     try {  
  62.                         Thread.sleep(3000);  
  63.                     } catch (InterruptedException e) {  
  64.                         // TODO Auto-generated catch block  
  65.                         e.printStackTrace();  
  66.                     }  
  67.                     System.out.println("正在定位");  
  68.                  if (mListener != null &&GPSService.location!=null) { //外接AMapLocationListener的AmapLocation(在onLocationChanged方法中的参数)  
  69.                      mListener.onLocationChanged(GPSService.location);// 显示系统小蓝点    
  70.                      marker.setPosition(new LatLng(GPSService.LATITUDE, GPSService.LONGITUDE));// 定位雷达小图标    
  71.                      float bearing = aMap.getCameraPosition().bearing;    
  72.                      aMap.setMyLocationRotateAngle(bearing);// 设置小蓝点旋转角度    
  73.                  }    
  74.                 }  
  75.             };  
  76.         }.start();  
  77.     }    
  78.         /**  
  79.          * 设置一些amap的属性  
  80.          */    
  81.         private void setUpMap() {    
  82.             ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();    
  83.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point1));//蓝色圆点    
  84.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point2));    
  85.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point3));    
  86.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point4));    
  87.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point5));    
  88.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point6));    
  89.             marker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)    
  90.                     .icons(giflist).period(50));    
  91.             // 自定义系统定位小蓝点    
  92.             MyLocationStyle myLocationStyle = new MyLocationStyle();    
  93.             myLocationStyle.myLocationIcon(BitmapDescriptorFactory    
  94.                     .fromResource(R.drawable.location_marker));// 设置蓝色箭头    
  95.             myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色    
  96.             myLocationStyle.radiusFillColor(Color.argb(10000180));// 设置圆形的填充颜色    
  97.             // myLocationStyle.anchor(int,int)//设置小蓝点的锚点    
  98.             myLocationStyle.strokeWidth(0.1f);// 设置圆形的边框粗细    
  99.             aMap.setMyLocationStyle(myLocationStyle);    
  100.             aMap.setMyLocationRotateAngle(90);//这个参数好像没什么用    
  101.             aMap.setLocationSource(this);// 设置定位监听    
  102.             aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示    
  103.             aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false    
  104.             //设置定位的类型为定位模式 ,可以由定位、跟随或地图根据面向方向旋转几种     
  105.             aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_ROTATE);//整个地图根据手机旋转,指针始终向前    
  106. //          aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_FOLLOW);//指针始终向手机前方,人走动的也不动    
  107. //          aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);//指针始终指向北方,相当于指北针    
  108.         }    
  109.     
  110.              
  111.             
  112.         /**  
  113.          * 方法必须重写  
  114.          */    
  115.         @Override    
  116.         protected void onResume() {    
  117.             super.onResume();    
  118.             mapView.onResume();    
  119.         }    
  120.     
  121.         /**  
  122.          * 方法必须重写  
  123.          */    
  124.         @Override    
  125.         protected void onPause() {    
  126.             super.onPause();    
  127.             mapView.onPause();    
  128.             deactivate();    
  129.         }    
  130.     
  131.         /**  
  132.          * 方法必须重写  
  133.          */    
  134.         @Override    
  135.         protected void onSaveInstanceState(Bundle outState) {    
  136.             super.onSaveInstanceState(outState);    
  137.             mapView.onSaveInstanceState(outState);    
  138.         }    
  139.     
  140.         /**  
  141.          * 方法必须重写  
  142.          */    
  143.         @Override    
  144.         protected void onDestroy() {    
  145.             super.onDestroy();    
  146.             mapView.onDestroy();    
  147.         }    
  148.     
  149.           
  150.     
  151.          
  152.     
  153.         /**  
  154.          * 激活定位  
  155.          */    
  156.         @Override    
  157.         public void activate(OnLocationChangedListener listener) {    
  158.             mListener = listener;    
  159.             if (mAMapLocationManager == null) {    
  160.                 mAMapLocationManager = LocationManagerProxy.getInstance(this);    
  161.                 /*  
  162.                  * mAMapLocManager.setGpsEnable(false);  
  163.                  * 1.0.2版本新增方法,设置true表示混合定位中包含gps定位,false表示纯网络定位,默认是true Location  
  164.                  * API定位采用GPS和网络混合定位方式  
  165.                  * ,第一个参数是定位provider,第二个参数时间最短是2000毫秒,第三个参数距离间隔单位是米,第四个参数是定位监听者  
  166.                  */    
  167.                  
  168.                 mAMapLocationManager.requestLocationData(    
  169.                         LocationProviderProxy.AMapNetwork, 200010, GPSService.listener); //外接一个AmapListener   
  170.             }    
  171.         }    
  172.     
  173.         /**  
  174.          * 停止定位  
  175.          */    
  176.         @Override    
  177.         public void deactivate() {    
  178.             mListener = null;    
  179.             if (mAMapLocationManager != null) {    
  180.                 mAMapLocationManager.removeUpdates(GPSService.listener);  //外接一个AMapLocationListener  
  181.                 mAMapLocationManager.destroy();;   
  182.             }    
  183.             mAMapLocationManager = null;    
  184.         }    
  185.     
  186.             
  187.         
  188.         
  189. }    




定位成功的回调函数

[java]  view plain  copy
  1. /** 
  2.      * 搜索成功的回调函数 
  3.      * @param arg0 
  4.      * @param arg1 
  5.      */  
  6.     @Override  
  7.     public void onPoiSearched(PoiResult arg0, int arg1) {  
  8.         // TODO Auto-generated method stub  
  9.         if(arg1==0){//搜索成功  
  10.             List<PoiItem> list = arg0.getPois();  
  11.             //PoiItem类是封装查询结果的类  
  12.             for (PoiItem poiItem : list) {  
  13.                 System.out.println("搜索结果区名:"+poiItem.getAdName());//返回:城阳区  
  14.                 System.out.println("结果大概位置:"+poiItem.getSnippet());//返回:是建筑物的话返回如春阳路346附近、春阳路167-2号,如果是公交车站的话返回:117路;613路;903路;905路环线;915路环线,  
  15.                 System.out.println("搜索结果title:"+poiItem.getTitle());// 搜索结果title:金鑫源汽车租赁  
  16.                 System.out.println("目标经纬度是"+poiItem.getLatLonPoint().getLatitude()+","+poiItem.getLatLonPoint().getLongitude());  
  17.             }  
  18. //用标记显示出搜索的结果  
  19.             PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems);  
  20.             poiOverlay.removeFromMap();  
  21.             poiOverlay.addToMap();//把标记添加到地图上  
  22.             poiOverlay.zoomToSpan();//让地图转移到搜索后的位置  
  23.  }  
  24.     }  

3、绘制步行轨迹,这是一个很好玩的功能,可以记录行程,用于跑步计步什么的,一般可以用在service

[java]  view plain  copy
  1. package com.example.qichebaojiata;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.graphics.Color;  
  8. import android.location.Location;  
  9. import android.os.Bundle;  
  10.   
  11. import com.amap.api.location.AMapLocation;  
  12. import com.amap.api.location.AMapLocationListener;  
  13. import com.amap.api.location.LocationManagerProxy;  
  14. import com.amap.api.location.LocationProviderProxy;  
  15. import com.amap.api.maps.AMap;  
  16. import com.amap.api.maps.AMap.OnMapLoadedListener;  
  17. import com.amap.api.maps.MapView;  
  18. import com.amap.api.maps.model.LatLng;  
  19. import com.amap.api.maps.model.PolylineOptions;  
  20.   
  21. public class MapActivity extends Activity implements AMapLocationListener ,OnMapLoadedListener{//地图加载完成的监听器  
  22.      //声明变量  
  23.     private MapView mapView;  
  24.     private AMap aMap;  
  25.     LocationManagerProxy mAMapLocationManager ;  
  26.       
  27.     List<LatLng> list = new ArrayList<LatLng>();//用于存储轨迹的list  
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.activity_map);  
  32.         //在onCreat方法中给aMap对象赋值  
  33.         //显示地图用的三句话  
  34.         mapView = (MapView) findViewById(R.id.map);  
  35.         mapView.onCreate(savedInstanceState);// 必须要写  
  36.         //给mapView绑定加载监听器  
  37.             aMap = mapView.getMap();  
  38.         aMap.setOnMapLoadedListener(this);  
  39.             // AMap类自动处理以下操作  
  40.                1.连接到高德地图服务  
  41.                2.下载地图数据  
  42.                3.在设备屏幕上显示地图  
  43.                4.显示各种控件,如缩放按钮控件  
  44.                5.支持各种手势,如平移和缩放手势  
  45.             //初始化定位对象  
  46.         LocationManagerProxy mLocationManagerProxy =LocationManagerProxy .getInstance(this);//定位对象与监听器绑定  
  47.         //注册定位监听  
  48.         mLocationManagerProxy.requestLocationData(  
  49.                 LocationProviderProxy.AMapNetwork,//定位设备,netWork是全部都用  
  50.                 1000,//刷新频率,单位ms  
  51.                 15//移动距离后刷新,仅对gps有效  
  52.                 this//AMapLocationListener 回调监听器  
  53.                 );  
  54.           
  55.           
  56.     }  
  57.       
  58.       
  59.       
  60.     AMapLocation amapLocation;  
  61.     boolean searchFlag = false;  
  62.     @Override  
  63.     /** 
  64.      * 定位回调 
  65.      */  
  66.     public void onLocationChanged(AMapLocation arg0) {  
  67.         // TODO Auto-generated method stub  
  68.         //检测错误码  
  69.         if(arg0!=null&&arg0.getAMapException().getErrorCode()==0){//等于0是成功了  
  70.             amapLocation = arg0;  
  71.             //latLng对象是一个经纬度的封装类,有点像LatLonPoint类  
  72.             LatLng latLng = new LatLng(arg0.getLatitude(), arg0.getLongitude());  
  73.             System.out.println("当前经纬度"+latLng);  
  74.             //把当前经纬度放到list里去,准备绘制轨迹  
  75.             list.add(latLng);  
  76.             //添加轨迹线  
  77.             if(mapLoaded==true){//如果mapView已经加载完成,否则容易报错  
  78.                 System.out.println("正在绘制轨迹");  
  79.                 mapView.getMap().addPolyline(new PolylineOptions().addAll(list));  
  80.             }  
  81.             if(!searchFlag){  
  82.                 searchFlag=true;  
  83.             }  
  84.               
  85.         }else {  
  86.             System.out.println("定位失败");  
  87.         }  
  88.           
  89.     }  
  90.   
  91.     boolean mapLoaded=false;  
  92.     /** 
  93.      * 地图加载完毕后调用 
  94.      */  
  95.     @Override  
  96.     public void onMapLoaded() {  
  97.         // TODO Auto-generated method stub  
  98.         mapLoaded = true;  
  99.     }  
  100.           
  101.       
  102. }  


下面到了最激动人心的时刻了,用mapView显示一个小蓝色箭头,指示出用户当前的位置和方向:

下面给出高德官方的例程,测试过感觉还行

[java]  view plain  copy
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import android.app.Activity;  
  5. import android.graphics.Color;  
  6. import android.location.Location;  
  7. import android.os.Bundle;  
  8.   
  9. import com.amap.api.location.AMapLocation;  
  10. import com.amap.api.location.AMapLocationListener;  
  11. import com.amap.api.location.LocationManagerProxy;  
  12. import com.amap.api.location.LocationProviderProxy;  
  13. import com.amap.api.maps.AMap;  
  14. import com.amap.api.maps.AMap.OnMapLoadedListener;  
  15. import com.amap.api.maps.LocationSource;  
  16. import com.amap.api.maps.MapView;  
  17. import com.amap.api.maps.model.BitmapDescriptor;  
  18. import com.amap.api.maps.model.BitmapDescriptorFactory;  
  19. import com.amap.api.maps.model.LatLng;  
  20. import com.amap.api.maps.model.Marker;  
  21. import com.amap.api.maps.model.MarkerOptions;  
  22. import com.amap.api.maps.model.MyLocationStyle;  
  23. import com.amap.api.maps.model.PolylineOptions;  
  24.   
  25. public class MapActivity extends Activity implements AMapLocationListener , LocationSource{//地图加载完成的监听器  
  26.      //声明变量  
  27.     private MapView mapView;  
  28.     private AMap aMap;  
  29.     LocationManagerProxy mAMapLocationManager ;  
  30.     OnLocationChangedListener mListener;  
  31.     private Marker marker;// 定位雷达小图标  
  32.       
  33.       
  34.     List<LatLng> list = new ArrayList<LatLng>();//用于存储轨迹的单点  
  35.     @Override  
  36.     protected void onCreate(Bundle savedInstanceState) {  
  37.         super.onCreate(savedInstanceState);  
  38.         setContentView(R.layout.activity_map);  
  39.         //在onCreat方法中给aMap对象赋值  
  40.         //显示地图用的三句话  
  41.         mapView = (MapView) findViewById(R.id.map);  
  42.         mapView.onCreate(savedInstanceState);// 必须要写  
  43.         aMap = mapView.getMap();  
  44.         setUpMap();  
  45.     }  
  46.         /** 
  47.          * 设置一些amap的属性 
  48.          */  
  49.         private void setUpMap() {  
  50.             ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();  
  51.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point1));//蓝色圆点  
  52.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point2));  
  53.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point3));  
  54.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point4));  
  55.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point5));  
  56.             giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.point6));  
  57.             marker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)  
  58.                     .icons(giflist).period(50));  
  59.             // 自定义系统定位小蓝点  
  60.             MyLocationStyle myLocationStyle = new MyLocationStyle();  
  61.             myLocationStyle.myLocationIcon(BitmapDescriptorFactory  
  62.                     .fromResource(R.drawable.location_marker));// 设置蓝色箭头  
  63.             myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色  
  64.             myLocationStyle.radiusFillColor(Color.argb(10000180));// 设置圆形的填充颜色  
  65.             // myLocationStyle.anchor(int,int)//设置小蓝点的锚点  
  66.             myLocationStyle.strokeWidth(0.1f);// 设置圆形的边框粗细  
  67.             aMap.setMyLocationStyle(myLocationStyle);  
  68.             aMap.setMyLocationRotateAngle(90);//这个参数好像没什么用  
  69.             aMap.setLocationSource(this);// 设置定位监听  
  70.             aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示  
  71.             aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false  
  72.             //设置定位的类型为定位模式 ,可以由定位、跟随或地图根据面向方向旋转几种   
  73.             aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_ROTATE);//整个地图根据手机旋转,指针始终向前  
  74. //          aMap.setMyLocationType(AMap.LOCATION_TYPE_MAP_FOLLOW);//指针始终向手机前方,人走动的也不动  
  75. //          aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);//指针始终指向北方,相当于指北针  
  76.         }  
  77.   
  78.            
  79.           
  80.         /** 
  81.          * 方法必须重写 
  82.          */  
  83.         @Override  
  84.         protected void onResume() {  
  85.             super.onResume();  
  86.             mapView.onResume();  
  87.         }  
  88.   
  89.         /** 
  90.          * 方法必须重写 
  91.          */  
  92.         @Override  
  93.         protected void onPause() {  
  94.             super.onPause();  
  95.             mapView.onPause();  
  96.             deactivate();  
  97.         }  
  98.   
  99.         /** 
  100.          * 方法必须重写 
  101.          */  
  102.         @Override  
  103.         protected void onSaveInstanceState(Bundle outState) {  
  104.             super.onSaveInstanceState(outState);  
  105.             mapView.onSaveInstanceState(outState);  
  106.         }  
  107.   
  108.         /** 
  109.          * 方法必须重写 
  110.          */  
  111.         @Override  
  112.         protected void onDestroy() {  
  113.             super.onDestroy();  
  114.             mapView.onDestroy();  
  115.         }  
  116.   
  117.         /** 
  118.          * 此方法已经废弃 
  119.          */  
  120.         @Override  
  121.         public void onLocationChanged(Location location) {  
  122.         }  
  123.   
  124.         @Override  
  125.         public void onProviderDisabled(String provider) {  
  126.         }  
  127.   
  128.         @Override  
  129.         public void onProviderEnabled(String provider) {  
  130.         }  
  131.   
  132.         @Override  
  133.         public void onStatusChanged(String provider, int status, Bundle extras) {  
  134.         }  
  135.   
  136.         /** 
  137.          * 定位成功后回调函数 
  138.          */  
  139.         @Override  
  140.         public void onLocationChanged(AMapLocation aLocation) {  
  141.             if (mListener != null && aLocation != null) {  
  142.                 mListener.onLocationChanged(aLocation);// 显示系统小蓝点  
  143.                 marker.setPosition(new LatLng(aLocation.getLatitude(), aLocation  
  144.                         .getLongitude()));// 定位雷达小图标  
  145.                 float bearing = aMap.getCameraPosition().bearing;  
  146.                 aMap.setMyLocationRotateAngle(bearing);// 设置小蓝点旋转角度  
  147.             }  
  148.         }  
  149.   
  150.         /** 
  151.          * 激活定位 
  152.          */  
  153.         @Override  
  154.         public void activate(OnLocationChangedListener listener) {  
  155.             mListener = listener;  
  156.             if (mAMapLocationManager == null) {  
  157.                 mAMapLocationManager = LocationManagerProxy.getInstance(this);  
  158.                 /* 
  159.                  * mAMapLocManager.setGpsEnable(false); 
  160.                  * 1.0.2版本新增方法,设置true表示混合定位中包含gps定位,false表示纯网络定位,默认是true Location 
  161.                  * API定位采用GPS和网络混合定位方式 
  162.                  * ,第一个参数是定位provider,第二个参数时间最短是2000毫秒,第三个参数距离间隔单位是米,第四个参数是定位监听者 
  163.                  */  
  164.                 mAMapLocationManager.requestLocationData(  
  165.                         LocationProviderProxy.AMapNetwork, 200010this);  
  166.             }  
  167.         }  
  168.   
  169.         /** 
  170.          * 停止定位 
  171.          */  
  172.         @Override  
  173.         public void deactivate() {  
  174.             mListener = null;  
  175.             if (mAMapLocationManager != null) {  
  176.                 mAMapLocationManager.removeUpdates(this);  
  177.                 mAMapLocationManager.destroy();;  
  178.             }  
  179.             mAMapLocationManager = null;  
  180.         }  
  181.   
  182.           
  183.       
  184.       
  185. }  


那么现在让蓝色指针和路径轨迹同时出现一下,只需要把上面的onLocationChanged(AmapLocation)添加一点东西就可以了

[java]  view plain  copy
  1. /** 
  2.          * 定位成功后回调函数 
  3.          */  
  4.         @Override  
  5.         public void onLocationChanged(AMapLocation aLocation) {  
  6.             if (mListener != null && aLocation != null) {  
  7.                 mListener.onLocationChanged(aLocation);// 显示系统小蓝点  
  8.                 marker.setPosition(new LatLng(aLocation.getLatitude(), aLocation  
  9.                         .getLongitude()));// 定位雷达小图标  
  10.                 float bearing = aMap.getCameraPosition().bearing;  
  11.                 System.out.println("当前转角"+bearing);  
  12.                 aMap.setMyLocationRotateAngle(bearing);// 设置小蓝点旋转角度  
  13.                   
  14.                     //latLng对象是一个经纬度的封装类,有点像LatLonPoint类  
  15.                     LatLng latLng = new LatLng(aLocation.getLatitude(), aLocation.getLongitude());  
  16.                     System.out.println("当前经纬度"+latLng);  
  17.                     //把当前经纬度放到list里去,准备绘制轨迹  
  18.                     list.add(latLng);  
  19.                     //添加轨迹线  
  20.                         System.out.println("正在绘制轨迹");  
  21.                         mapView.getMap().addPolyline(new PolylineOptions().addAll(list));  
  22.                       
  23.                 }else {  
  24.                     System.out.println("定位失败");  
  25.                 }  
  26.               
  27.         }  

4、下面是最实用的一个功能,根据指定的经纬度在地图上加一个或多个标记,或者画一条连接本地到标记的虚线,或者根据指定位置画一个规定半径的透明的圆来标明区域


[java]  view plain  copy
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import android.app.Activity;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Color;  
  7. import android.location.Location;  
  8. import android.os.Bundle;  
  9.   
  10. import com.amap.api.location.AMapLocation;  
  11. import com.amap.api.location.AMapLocationListener;  
  12. import com.amap.api.location.LocationManagerProxy;  
  13. import com.amap.api.location.LocationProviderProxy;  
  14. import com.amap.api.maps.AMap;  
  15. import com.amap.api.maps.AMap.OnMapLoadedListener;  
  16. import com.amap.api.maps.LocationSource;  
  17. import com.amap.api.maps.MapView;  
  18. import com.amap.api.maps.model.BitmapDescriptor;  
  19. import com.amap.api.maps.model.BitmapDescriptorFactory;  
  20. import com.amap.api.maps.model.CircleOptions;  
  21. import com.amap.api.maps.model.LatLng;  
  22. import com.amap.api.maps.model.Marker;  
  23. import com.amap.api.maps.model.MarkerOptions;  
  24. import com.amap.api.maps.model.MyLocationStyle;  
  25. import com.amap.api.maps.model.PolylineOptions;  
  26.   
  27. public class MapActivity extends Activity implements AMapLocationListener , LocationSource{//地图加载完成的监听器  
  28.      //声明变量  
  29.     private MapView mapView;  
  30.     private AMap aMap;  
  31.     LocationManagerProxy mAMapLocationManager ;  
  32.     OnLocationChangedListener mListener;  
  33.     private Marker marker;// 定位雷达小图标  
  34.     MarkerOptions markerOptions = new MarkerOptions();//MarkerOptions这个类作用大,position属性:在地图上标记位置的经纬度值,titile属性:当用户点击标记,在信息窗口上显示的字符串  
  35.     //snippet附加文本,显示在标题的下方  
  36.     //draggable 如果您允许用于可以自由移动标记  
  37.     //visible设置false则标记不可见  
  38.     //icon设置Marker的图标  
  39.     //anchor图标摆放在地图上的基准点  
  40.     //perspective设置true,标记有近大远小的效果  
  41.     //可以通过Marker.setRotateAngle()方法设置旋转角度  
  42.       
  43.     List<LatLng> list = new ArrayList<LatLng>();//用于存储轨迹的单点  
  44.     @Override  
  45.     protected void onCreate(Bundle savedInstanceState) {  
  46.         super.onCreate(savedInstanceState);  
  47.         setContentView(R.layout.activity_map);  
  48.         //在onCreat方法中给aMap对象赋值  
  49.         //显示地图用的三句话  
  50.         mapView = (MapView) findViewById(R.id.map);  
  51.         mapView.onCreate(savedInstanceState);// 必须要写  
  52.         aMap = mapView.getMap();  
  53.         setUpMap();  
  54.         markerOptions.position(new LatLng(36.306307,120.396338));//设置标记的位置  
  55.         markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.audi));//设置标记的图片  
  56.         //给地图添加标记  
  57.         Marker marker = aMap.addMarker(markerOptions);//如果这几句添加for循环,可以添加多个标志  
  58.         //设置标记的旋转角度,很好玩的功能  
  59.         marker.setRotateAngle(30);  
  60.           
  61.         //正如markerOptions可以再地图上画标记,polylineOptions可以在地图上画一条线  
  62.         PolylineOptions polylineOptions = new PolylineOptions();  
  63.         polylineOptions.add(new LatLng(36.306307,120.396338),new LatLng(37.306307,120.396338));//可以画多个点组成的折线  
  64.         polylineOptions.color(0xffaabbcc);//设置线的颜色  
  65.         polylineOptions.width(10);//设置线宽  
  66.         polylineOptions.setDottedLine(true);//设置为虚线  
  67.         aMap.addPolyline(polylineOptions);  
  68.           
  69.         //画个圆  
  70.         CircleOptions circleOptions = new CircleOptions();  
  71.         circleOptions.center(new LatLng(36.306307120.396338));//设置圆心  
  72.         circleOptions.radius(1000);//设置半径1000m  
  73.         circleOptions.fillColor(0xaabbccdd);//设置颜色,可以在此设置透明度  
  74.         aMap.addCircle(circleOptions);  
  75.         //还可以设置边框的颜色和宽度  
  76.     }  
  77.           
  78.         //下面的用于定位的显示和上面例程的一样  
  79.           
  80.       
  81.       
  82. }  

4、规划路径功能

有三种方式,步行,驾车,公交,每个方式都有自己的查询类和回调函数,要分类使用,下面以步行为例

首先activity要继承一个监听器来回调

[java]  view plain  copy
  1. public class MapActivity extends Activity implements OnRouteSearchListener  
具体的搜索函数,在oncreate中调用

[java]  view plain  copy
  1. /** 
  2.          * 开始搜索步行路径 
  3.          * @param startPoint 
  4.          * @param endPoint 
  5.          */  
  6.         public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {  
  7.             final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(  
  8.                     startPoint, endPoint);//FromAndTo对象用于封装出发地和目的地的经纬度  
  9.                 WalkRouteQuery query = new WalkRouteQuery(fromAndTo, RouteSearch.WalkDefault);// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路  
  10.                 routeSearch.calculateWalkRouteAsyn(query);// 异步路径规划驾车模式查询  
  11.         }  
复写回调函数

[java]  view plain  copy
  1. /** 
  2.          * 步行路线结果回调 
  3.          */  
  4.         @Override  
  5.         public void onWalkRouteSearched(WalkRouteResult result, int rCode) {  
  6.             if (rCode == 0) {  
  7.                 if (result != null && result.getPaths() != null  
  8.                         && result.getPaths().size() > 0) {  
  9.                     WalkPath walkPath = result.getPaths().get(0);  
  10. //                  aMap.clear();// 清理地图上的所有覆盖物,如果不需要请不要开启  
  11.                     WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay(this,  
  12.                             aMap, walkPath, result.getStartPos(),  
  13.                             result.getTargetPos());  
  14.                     walkRouteOverlay.addToMap();  
  15.                     walkRouteOverlay.zoomToSpan();  
  16.                 } else {  
  17.                     System.out.println("没找到步行结果");  
  18.                 }  
  19.             } else if (rCode == 27) {  
  20.                 System.out.println("失败");  
  21.             } else if (rCode == 32) {  
  22.                 System.out.println("失败");  
  23.             } else {  
  24.                 System.out.println("失败");  
  25.             }  
  26.         }  

如果是驾驶路径,方法几乎一样

[java]  view plain  copy
  1. /** 
  2.      * 开始搜索路径规划方案 
  3.      */  
  4.     public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {  
  5.         showProgressDialog();  
  6.         final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(  
  7.           
  8.           
  9.             DriveRouteQuery query = new DriveRouteQuery(fromAndTo, RouteSearch.DrivingDefault,  
  10.                     nullnull"");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路  
  11.             routeSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询  
  12.           
  13.     }  

回调

[java]  view plain  copy
  1. /** 
  2.      * 驾车结果回调 
  3.      */  
  4.     @Override  
  5.     public void onDriveRouteSearched(DriveRouteResult result, int rCode) {  
  6.         dissmissProgressDialog();  
  7.         if (rCode == 0) {  
  8.             if (result != null && result.getPaths() != null  
  9.                     && result.getPaths().size() > 0) {  
  10.                 driveRouteResult = result;  
  11.                 DrivePath drivePath = driveRouteResult.getPaths().get(0);  
  12.                 aMap.clear();// 清理地图上的所有覆盖物  
  13.                 DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(  
  14.                         this, aMap, drivePath, driveRouteResult.getStartPos(),  
  15.                         driveRouteResult.getTargetPos());  
  16.                 drivingRouteOverlay.removeFromMap();  
  17.                 drivingRouteOverlay.addToMap();  
  18.                 drivingRouteOverlay.zoomToSpan();  
  19.             } else {  
  20. <pre name="code" class="java">  
  21.                     System.out.println("没找到驾车结果");  
  22.                 }  
  23.             } else if (rCode == 27) {  
  24.                 System.out.println("失败");  
  25.             } else if (rCode == 32) {  
  26.                 System.out.println("失败");  
  27.             } else {  
  28.                 System.out.println("失败");  
  29.             }  
  30.         }  

 
 公交结果请参考官网给的demo,在下面贴出来 
 
[java]  view plain  copy
  1. package com.amap.map3d.demo.route;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.ProgressDialog;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.ArrayAdapter;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.ImageButton;  
  14.   
  15. import com.amap.api.maps.AMap;  
  16. import com.amap.api.maps.AMap.InfoWindowAdapter;  
  17. import com.amap.api.maps.AMap.OnInfoWindowClickListener;  
  18. import com.amap.api.maps.AMap.OnMapClickListener;  
  19. import com.amap.api.maps.AMap.OnMarkerClickListener;  
  20. import com.amap.api.maps.MapView;  
  21. import com.amap.api.maps.MapsInitializer;  
  22. import com.amap.api.maps.model.BitmapDescriptorFactory;  
  23. import com.amap.api.maps.model.LatLng;  
  24. import com.amap.api.maps.model.Marker;  
  25. import com.amap.api.maps.model.MarkerOptions;  
  26. import com.amap.api.maps.overlay.BusRouteOverlay;  
  27. import com.amap.api.maps.overlay.DrivingRouteOverlay;  
  28. import com.amap.api.maps.overlay.WalkRouteOverlay;  
  29. import com.amap.api.services.core.LatLonPoint;  
  30. import com.amap.api.services.core.PoiItem;  
  31. import com.amap.api.services.poisearch.PoiItemDetail;  
  32. import com.amap.api.services.poisearch.PoiResult;  
  33. import com.amap.api.services.poisearch.PoiSearch;  
  34. import com.amap.api.services.poisearch.PoiSearch.OnPoiSearchListener;  
  35. import com.amap.api.services.route.BusPath;  
  36. import com.amap.api.services.route.BusRouteResult;  
  37. import com.amap.api.services.route.DrivePath;  
  38. import com.amap.api.services.route.DriveRouteResult;  
  39. import com.amap.api.services.route.RouteSearch;  
  40. import com.amap.api.services.route.RouteSearch.BusRouteQuery;  
  41. import com.amap.api.services.route.RouteSearch.DriveRouteQuery;  
  42. import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;  
  43. import com.amap.api.services.route.RouteSearch.WalkRouteQuery;  
  44. import com.amap.api.services.route.WalkPath;  
  45. import com.amap.api.services.route.WalkRouteResult;  
  46. import com.amap.map3d.demo.route.RouteSearchPoiDialog.OnListItemClick;  
  47. import com.amap.map3d.demo.util.AMapUtil;  
  48. import com.amap.map3d.demo.util.OffLineMapUtils;  
  49. import com.amap.map3d.demo.util.ToastUtil;  
  50. import com.amap.map3d.demo.R;  
  51.   
  52. /** 
  53.  * AMapV2地图中简单介绍route搜索 
  54.  */  
  55. public class RouteActivity extends Activity implements OnMarkerClickListener,  
  56.         OnMapClickListener, OnInfoWindowClickListener, InfoWindowAdapter,  
  57.         OnPoiSearchListener, OnRouteSearchListener, OnClickListener {  
  58.     private AMap aMap;  
  59.     private MapView mapView;  
  60.     private Button drivingButton;  
  61.     private Button busButton;  
  62.     private Button walkButton;  
  63.   
  64.     private ImageButton startImageButton;  
  65.     private ImageButton endImageButton;  
  66.     private ImageButton routeSearchImagebtn;  
  67.   
  68.     private EditText startTextView;  
  69.     private EditText endTextView;  
  70.     private ProgressDialog progDialog = null;// 搜索时进度条  
  71.     private int busMode = RouteSearch.BusDefault;// 公交默认模式  
  72.     private int drivingMode = RouteSearch.DrivingDefault;// 驾车默认模式  
  73.     private int walkMode = RouteSearch.WalkDefault;// 步行默认模式  
  74.     private BusRouteResult busRouteResult;// 公交模式查询结果  
  75.     private DriveRouteResult driveRouteResult;// 驾车模式查询结果  
  76.     private WalkRouteResult walkRouteResult;// 步行模式查询结果  
  77.     private int routeType = 1;// 1代表公交模式,2代表驾车模式,3代表步行模式  
  78.     private String strStart;  
  79.     private String strEnd;  
  80.     private LatLonPoint startPoint = null;  
  81.     private LatLonPoint endPoint = null;  
  82.     private PoiSearch.Query startSearchQuery;  
  83.     private PoiSearch.Query endSearchQuery;  
  84.   
  85.     private boolean isClickStart = false;  
  86.     private boolean isClickTarget = false;  
  87.     private Marker startMk, targetMk;  
  88.     private RouteSearch routeSearch;  
  89.     public ArrayAdapter<String> aAdapter;  
  90.   
  91.     @Override  
  92.     protected void onCreate(Bundle bundle) {  
  93.         super.onCreate(bundle);  
  94.         setContentView(R.layout.route_activity);  
  95.         /* 
  96.          * 设置离线地图存储目录,在下载离线地图或初始化地图设置; 
  97.          * 使用过程中可自行设置, 若自行设置了离线地图存储的路径, 
  98.          * 则需要在离线地图下载和使用地图页面都进行路径设置 
  99.          * */  
  100.         //Demo中为了其他界面可以使用下载的离线地图,使用默认位置存储,屏蔽了自定义设置  
  101.         MapsInitializer.sdcardDir =OffLineMapUtils.getSdCacheDir(this);  
  102.         mapView = (MapView) findViewById(R.id.map);  
  103.         mapView.onCreate(bundle);// 此方法必须重写  
  104.         init();  
  105.     }  
  106.   
  107.     /** 
  108.      * 初始化AMap对象 
  109.      */  
  110.     private void init() {  
  111.         if (aMap == null) {  
  112.             aMap = mapView.getMap();  
  113.             registerListener();  
  114.         }  
  115.         routeSearch = new RouteSearch(this);  
  116.         routeSearch.setRouteSearchListener(this);  
  117.         startTextView = (EditText) findViewById(R.id.autotextview_roadsearch_start);  
  118.         endTextView = (EditText) findViewById(R.id.autotextview_roadsearch_goals);  
  119.         busButton = (Button) findViewById(R.id.imagebtn_roadsearch_tab_transit);  
  120.         busButton.setOnClickListener(this);  
  121.         drivingButton = (Button) findViewById(R.id.imagebtn_roadsearch_tab_driving);  
  122.         drivingButton.setOnClickListener(this);  
  123.         walkButton = (Button) findViewById(R.id.imagebtn_roadsearch_tab_walk);  
  124.         walkButton.setOnClickListener(this);  
  125.         startImageButton = (ImageButton) findViewById(R.id.imagebtn_roadsearch_startoption);  
  126.         startImageButton.setOnClickListener(this);  
  127.         endImageButton = (ImageButton) findViewById(R.id.imagebtn_roadsearch_endoption);  
  128.         endImageButton.setOnClickListener(this);  
  129.         routeSearchImagebtn = (ImageButton) findViewById(R.id.imagebtn_roadsearch_search);  
  130.         routeSearchImagebtn.setOnClickListener(this);  
  131.     }  
  132.   
  133.     /** 
  134.      * 方法必须重写 
  135.      */  
  136.     @Override  
  137.     protected void onResume() {  
  138.         super.onResume();  
  139.         mapView.onResume();  
  140.     }  
  141.   
  142.     /** 
  143.      * 方法必须重写 
  144.      */  
  145.     @Override  
  146.     protected void onPause() {  
  147.         super.onPause();  
  148.         mapView.onPause();  
  149.     }  
  150.   
  151.     /** 
  152.      * 方法必须重写 
  153.      */  
  154.     @Override  
  155.     protected void onSaveInstanceState(Bundle outState) {  
  156.         super.onSaveInstanceState(outState);  
  157.         mapView.onSaveInstanceState(outState);  
  158.     }  
  159.   
  160.     /** 
  161.      * 方法必须重写 
  162.      */  
  163.     @Override  
  164.     protected void onDestroy() {  
  165.         super.onDestroy();  
  166.         mapView.onDestroy();  
  167.     }  
  168.   
  169.     /** 
  170.      * 选择公交模式 
  171.      */  
  172.     private void busRoute() {  
  173.         routeType = 1;// 标识为公交模式  
  174.         busMode = RouteSearch.BusDefault;  
  175.         drivingButton.setBackgroundResource(R.drawable.mode_driving_off);  
  176.         busButton.setBackgroundResource(R.drawable.mode_transit_on);  
  177.         walkButton.setBackgroundResource(R.drawable.mode_walk_off);  
  178.   
  179.     }  
  180.   
  181.     /** 
  182.      * 选择驾车模式 
  183.      */  
  184.     private void drivingRoute() {  
  185.         routeType = 2;// 标识为驾车模式  
  186.         drivingButton.setBackgroundResource(R.drawable.mode_driving_on);  
  187.         busButton.setBackgroundResource(R.drawable.mode_transit_off);  
  188.         walkButton.setBackgroundResource(R.drawable.mode_walk_off);  
  189.     }  
  190.   
  191.     /** 
  192.      * 选择步行模式 
  193.      */  
  194.     private void walkRoute() {  
  195.         routeType = 3;// 标识为步行模式  
  196.         walkMode = RouteSearch.WalkMultipath;  
  197.         drivingButton.setBackgroundResource(R.drawable.mode_driving_off);  
  198.         busButton.setBackgroundResource(R.drawable.mode_transit_off);  
  199.         walkButton.setBackgroundResource(R.drawable.mode_walk_on);  
  200.     }  
  201.   
  202.     /** 
  203.      * 在地图上选取起点 
  204.      */  
  205.     private void startImagePoint() {  
  206.         ToastUtil.show(RouteActivity.this"在地图上点击您的起点");  
  207.         isClickStart = true;  
  208.         isClickTarget = false;  
  209.         registerListener();  
  210.     }  
  211.   
  212.     /** 
  213.      * 在地图上选取终点 
  214.      */  
  215.     private void endImagePoint() {  
  216.         ToastUtil.show(RouteActivity.this"在地图上点击您的终点");  
  217.         isClickTarget = true;  
  218.         isClickStart = false;  
  219.         registerListener();  
  220.     }  
  221.   
  222.     /** 
  223.      * 点击搜索按钮开始Route搜索 
  224.      */  
  225.     public void searchRoute() {  
  226.         strStart = startTextView.getText().toString().trim();  
  227.         strEnd = endTextView.getText().toString().trim();  
  228.         if (strStart == null || strStart.length() == 0) {  
  229.             ToastUtil.show(RouteActivity.this"请选择起点");  
  230.             return;  
  231.         }  
  232.         if (strEnd == null || strEnd.length() == 0) {  
  233.             ToastUtil.show(RouteActivity.this"请选择终点");  
  234.             return;  
  235.         }  
  236.         if (strStart.equals(strEnd)) {  
  237.             ToastUtil.show(RouteActivity.this"起点与终点距离很近,您可以步行前往");  
  238.             return;  
  239.         }  
  240.   
  241.         startSearchResult();// 开始搜终点  
  242.     }  
  243.   
  244.     @Override  
  245.     public void onInfoWindowClick(Marker marker) {  
  246.         isClickStart = false;  
  247.         isClickTarget = false;  
  248.         if (marker.equals(startMk)) {  
  249.             startTextView.setText("地图上的起点");  
  250.             startPoint = AMapUtil.convertToLatLonPoint(startMk.getPosition());  
  251.             startMk.hideInfoWindow();  
  252.             startMk.remove();  
  253.         } else if (marker.equals(targetMk)) {  
  254.             endTextView.setText("地图上的终点");  
  255.             endPoint = AMapUtil.convertToLatLonPoint(targetMk.getPosition());  
  256.             targetMk.hideInfoWindow();  
  257.             targetMk.remove();  
  258.         }  
  259.     }  
  260.   
  261.     @Override  
  262.     public boolean onMarkerClick(Marker marker) {  
  263.         if (marker.isInfoWindowShown()) {  
  264.             marker.hideInfoWindow();  
  265.         } else {  
  266.             marker.showInfoWindow();  
  267.         }  
  268.         return false;  
  269.     }  
  270.   
  271.     @Override  
  272.     public void onMapClick(LatLng latng) {  
  273.         if (isClickStart) {  
  274.             startMk = aMap.addMarker(new MarkerOptions()  
  275.                     .anchor(0.5f, 1)  
  276.                     .icon(BitmapDescriptorFactory  
  277.                             .fromResource(R.drawable.point)).position(latng)  
  278.                     .title("点击选择为起点"));  
  279.             startMk.showInfoWindow();  
  280.         } else if (isClickTarget) {  
  281.             targetMk = aMap.addMarker(new MarkerOptions()  
  282.                     .anchor(0.5f, 1)  
  283.                     .icon(BitmapDescriptorFactory  
  284.                             .fromResource(R.drawable.point)).position(latng)  
  285.                     .title("点击选择为目的地"));  
  286.             targetMk.showInfoWindow();  
  287.         }  
  288.     }  
  289.   
  290.     @Override  
  291.     public View getInfoContents(Marker marker) {  
  292.         return null;  
  293.     }  
  294.   
  295.     @Override  
  296.     public View getInfoWindow(Marker marker) {  
  297.         return null;  
  298.     }  
  299.   
  300.     /** 
  301.      * 注册监听 
  302.      */  
  303.     private void registerListener() {  
  304.         aMap.setOnMapClickListener(RouteActivity.this);  
  305.         aMap.setOnMarkerClickListener(RouteActivity.this);  
  306.         aMap.setOnInfoWindowClickListener(RouteActivity.this);  
  307.         aMap.setInfoWindowAdapter(RouteActivity.this);  
  308.     }  
  309.   
  310.     /** 
  311.      * 显示进度框 
  312.      */  
  313.     private void showProgressDialog() {  
  314.         if (progDialog == null)  
  315.             progDialog = new ProgressDialog(this);  
  316.         progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
  317.         progDialog.setIndeterminate(false);  
  318.         progDialog.setCancelable(true);  
  319.         progDialog.setMessage("正在搜索");  
  320.         progDialog.show();  
  321.     }  
  322.   
  323.     /** 
  324.      * 隐藏进度框 
  325.      */  
  326.     private void dissmissProgressDialog() {  
  327.         if (progDialog != null) {  
  328.             progDialog.dismiss();  
  329.         }  
  330.     }  
  331.   
  332.     /** 
  333.      * 查询路径规划起点 
  334.      */  
  335.     public void startSearchResult() {  
  336.         strStart = startTextView.getText().toString().trim();  
  337.         if (startPoint != null && strStart.equals("地图上的起点")) {  
  338.             endSearchResult();  
  339.         } else {  
  340.             showProgressDialog();  
  341.             startSearchQuery = new PoiSearch.Query(strStart, """010"); // 第一个参数表示查询关键字,第二参数表示poi搜索类型,第三个参数表示城市区号或者城市名  
  342.             startSearchQuery.setPageNum(0);// 设置查询第几页,第一页从0开始  
  343.             startSearchQuery.setPageSize(20);// 设置每页返回多少条数据  
  344.             PoiSearch poiSearch = new PoiSearch(RouteActivity.this,  
  345.                     startSearchQuery);  
  346.             poiSearch.setOnPoiSearchListener(this);  
  347.             poiSearch.searchPOIAsyn();// 异步poi查询  
  348.         }  
  349.     }  
  350.   
  351.     /** 
  352.      * 查询路径规划终点 
  353.      */  
  354.     public void endSearchResult() {  
  355.         strEnd = endTextView.getText().toString().trim();  
  356.         if (endPoint != null && strEnd.equals("地图上的终点")) {  
  357.             searchRouteResult(startPoint, endPoint);  
  358.         } else {  
  359.             showProgressDialog();  
  360.             endSearchQuery = new PoiSearch.Query(strEnd, """010"); // 第一个参数表示查询关键字,第二参数表示poi搜索类型,第三个参数表示城市区号或者城市名  
  361.             endSearchQuery.setPageNum(0);// 设置查询第几页,第一页从0开始  
  362.             endSearchQuery.setPageSize(20);// 设置每页返回多少条数据  
  363.   
  364.             PoiSearch poiSearch = new PoiSearch(RouteActivity.this,  
  365.                     endSearchQuery);  
  366.             poiSearch.setOnPoiSearchListener(this);  
  367.             poiSearch.searchPOIAsyn(); // 异步poi查询  
  368.         }  
  369.     }  
  370.   
  371.     /** 
  372.      * 开始搜索路径规划方案 
  373.      */  
  374.     public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {  
  375.         showProgressDialog();  
  376.         final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(  
  377.                 startPoint, endPoint);  
  378.         if (routeType == 1) {// 公交路径规划  
  379.             BusRouteQuery query = new BusRouteQuery(fromAndTo, busMode, "北京"0);// 第一个参数表示路径规划的起点和终点,第二个参数表示公交查询模式,第三个参数表示公交查询城市区号,第四个参数表示是否计算夜班车,0表示不计算  
  380.             routeSearch.calculateBusRouteAsyn(query);// 异步路径规划公交模式查询  
  381.         } else if (routeType == 2) {// 驾车路径规划  
  382.             DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode,  
  383.                     nullnull"");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路  
  384.             routeSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询  
  385.         } else if (routeType == 3) {// 步行路径规划  
  386.             WalkRouteQuery query = new WalkRouteQuery(fromAndTo, walkMode);  
  387.             routeSearch.calculateWalkRouteAsyn(query);// 异步路径规划步行模式查询  
  388.         }  
  389.     }  
  390.   
  391.     @Override  
  392.     public void onPoiItemDetailSearched(PoiItemDetail arg0, int arg1) {  
  393.   
  394.     }  
  395.   
  396.     /** 
  397.      * POI搜索结果回调 
  398.      */  
  399.     @Override  
  400.     public void onPoiSearched(PoiResult result, int rCode) {  
  401.         dissmissProgressDialog();  
  402.         if (rCode == 0) {// 返回成功  
  403.             if (result != null && result.getQuery() != null  
  404.                     && result.getPois() != null && result.getPois().size() > 0) {// 搜索poi的结果  
  405.                 if (result.getQuery().equals(startSearchQuery)) {  
  406.                     List<PoiItem> poiItems = result.getPois();// 取得poiitem数据  
  407.                     RouteSearchPoiDialog dialog = new RouteSearchPoiDialog(  
  408.                             RouteActivity.this, poiItems);  
  409.                     dialog.setTitle("您要找的起点是:");  
  410.                     dialog.show();  
  411.                     dialog.setOnListClickListener(new OnListItemClick() {  
  412.                         @Override  
  413.                         public void onListItemClick(  
  414.                                 RouteSearchPoiDialog dialog,  
  415.                                 PoiItem startpoiItem) {  
  416.                             startPoint = startpoiItem.getLatLonPoint();  
  417.                             strStart = startpoiItem.getTitle();  
  418.                             startTextView.setText(strStart);  
  419.                             endSearchResult();// 开始搜终点  
  420.                         }  
  421.   
  422.                     });  
  423.                 } else if (result.getQuery().equals(endSearchQuery)) {  
  424.                     List<PoiItem> poiItems = result.getPois();// 取得poiitem数据  
  425.                     RouteSearchPoiDialog dialog = new RouteSearchPoiDialog(  
  426.                             RouteActivity.this, poiItems);  
  427.                     dialog.setTitle("您要找的终点是:");  
  428.                     dialog.show();  
  429.                     dialog.setOnListClickListener(new OnListItemClick() {  
  430.                         @Override  
  431.                         public void onListItemClick(  
  432.                                 RouteSearchPoiDialog dialog, PoiItem endpoiItem) {  
  433.                             endPoint = endpoiItem.getLatLonPoint();  
  434.                             strEnd = endpoiItem.getTitle();  
  435.                             endTextView.setText(strEnd);  
  436.                             searchRouteResult(startPoint, endPoint);// 进行路径规划搜索  
  437.                         }  
  438.   
  439.                     });  
  440.                 }  
  441.             } else {  
  442.                 ToastUtil.show(RouteActivity.this, R.string.no_result);  
  443.             }  
  444.         } else if (rCode == 27) {  
  445.             ToastUtil.show(RouteActivity.this, R.string.error_network);  
  446.         } else if (rCode == 32) {  
  447.             ToastUtil.show(RouteActivity.this, R.string.error_key);  
  448.         } else {  
  449.             ToastUtil.show(RouteActivity.this, getString(R.string.error_other)  
  450.                     + rCode);  
  451.         }  
  452.     }  
  453.   
  454.     /** 
  455.      * 公交路线查询回调 
  456.      */  
  457.     @Override  
  458.     public void onBusRouteSearched(BusRouteResult result, int rCode) {  
  459.         dissmissProgressDialog();  
  460.         if (rCode == 0) {  
  461.             if (result != null && result.getPaths() != null  
  462.                     && result.getPaths().size() > 0) {  
  463.                 busRouteResult = result;  
  464.                 BusPath busPath = busRouteResult.getPaths().get(0);  
  465.                 aMap.clear();// 清理地图上的所有覆盖物  
  466.                 BusRouteOverlay routeOverlay = new BusRouteOverlay(this, aMap,  
  467.                         busPath, busRouteResult.getStartPos(),  
  468.                         busRouteResult.getTargetPos());  
  469.                 routeOverlay.removeFromMap();  
  470.                 routeOverlay.addToMap();  
  471.                 routeOverlay.zoomToSpan();  
  472.             } else {  
  473.                 ToastUtil.show(RouteActivity.this, R.string.no_result);  
  474.             }  
  475.         } else if (rCode == 27) {  
  476.             ToastUtil.show(RouteActivity.this, R.string.error_network);  
  477.         } else if (rCode == 32) {  
  478.             ToastUtil.show(RouteActivity.this, R.string.error_key);  
  479.         } else {  
  480.             ToastUtil.show(RouteActivity.this, getString(R.string.error_other)  
  481.                     + rCode);  
  482.         }  
  483.     }  
  484.   
  485.     /** 
  486.      * 驾车结果回调 
  487.      */  
  488.     @Override  
  489.     public void onDriveRouteSearched(DriveRouteResult result, int rCode) {  
  490.         dissmissProgressDialog();  
  491.         if (rCode == 0) {  
  492.             if (result != null && result.getPaths() != null  
  493.                     && result.getPaths().size() > 0) {  
  494.                 driveRouteResult = result;  
  495.                 DrivePath drivePath = driveRouteResult.getPaths().get(0);  
  496.                 aMap.clear();// 清理地图上的所有覆盖物  
  497.                 DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(  
  498.                         this, aMap, drivePath, driveRouteResult.getStartPos(),  
  499.                         driveRouteResult.getTargetPos());  
  500.                 drivingRouteOverlay.removeFromMap();  
  501.                 drivingRouteOverlay.addToMap();  
  502.                 drivingRouteOverlay.zoomToSpan();  
  503.             } else {  
  504.                 ToastUtil.show(RouteActivity.this, R.string.no_result);  
  505.             }  
  506.         } else if (rCode == 27) {  
  507.             ToastUtil.show(RouteActivity.this, R.string.error_network);  
  508.         } else if (rCode == 32) {  
  509.             ToastUtil.show(RouteActivity.this, R.string.error_key);  
  510.         } else {  
  511.             ToastUtil.show(RouteActivity.this, getString(R.string.error_other)  
  512.                     + rCode);  
  513.         }  
  514.     }  
  515.   
  516.     /** 
  517.      * 步行路线结果回调 
  518.      */  
  519.     @Override  
  520.     public void onWalkRouteSearched(WalkRouteResult result, int rCode) {  
  521.         dissmissProgressDialog();  
  522.         if (rCode == 0) {  
  523.             if (result != null && result.getPaths() != null  
  524.                     && result.getPaths().size() > 0) {  
  525.                 walkRouteResult = result;  
  526.                 WalkPath walkPath = walkRouteResult.getPaths().get(0);  
  527.                 aMap.clear();// 清理地图上的所有覆盖物  
  528.                 WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay(this,  
  529.                         aMap, walkPath, walkRouteResult.getStartPos(),  
  530.                         walkRouteResult.getTargetPos());  
  531.                 walkRouteOverlay.removeFromMap();  
  532.                 walkRouteOverlay.addToMap();  
  533.                 walkRouteOverlay.zoomToSpan();  
  534.             } else {  
  535.                 ToastUtil.show(RouteActivity.this, R.string.no_result);  
  536.             }  
  537.         } else if (rCode == 27) {  
  538.             ToastUtil.show(RouteActivity.this, R.string.error_network);  
  539.         } else if (rCode == 32) {  
  540.             ToastUtil.show(RouteActivity.this, R.string.error_key);  
  541.         } else {  
  542.             ToastUtil.show(RouteActivity.this, getString(R.string.error_other)  
  543.                     + rCode);  
  544.         }  
  545.     }  
  546.   
  547.     @Override  
  548.     public void onClick(View v) {  
  549.         switch (v.getId()) {  
  550.         case R.id.imagebtn_roadsearch_startoption:  
  551.             startImagePoint();  
  552.             break;  
  553.         case R.id.imagebtn_roadsearch_endoption:  
  554.             endImagePoint();  
  555.             break;  
  556.         case R.id.imagebtn_roadsearch_tab_transit:  
  557.             busRoute();  
  558.             break;  
  559.         case R.id.imagebtn_roadsearch_tab_driving:  
  560.             drivingRoute();  
  561.             break;  
  562.         case R.id.imagebtn_roadsearch_tab_walk:  
  563.             walkRoute();  
  564.             break;  
  565.         case R.id.imagebtn_roadsearch_search:  
  566.             searchRoute();  
  567.             break;  
  568.         default:  
  569.             break;  
  570.         }  
  571.     }  
  572. }  

猜你喜欢

转载自blog.csdn.net/blackbigdragon/article/details/52102351