个人感觉高德的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 plaincopy
  1. <meta-data
  2. android:name="com.amap.api.v2.apikey"
  3. android:value="42af3812644d8c1774dba300630980a8"/>

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

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

附近位置搜索功能:

先让activity继承一个onPoiSearchListener

[java] view plaincopy
  1. public class MapActivity extends Activity implements AMapLocationListener, OnPoiSearchListener

在activity中写一个方法

[java] view plaincopy
  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. LatLonPoint point = new LatLonPoint(amapLocation.getLatitude(), amapLocation.getLongitude());
  18. //地点对象LatLonPoint如果想和引擎poiSearch设置进去,要用另一个封装类SearchBound
  19. //它封装了当前位置,搜索半径
  20. poiSearch.setBound(new SearchBound(point,2000,true));//第二个参数是搜索半径
  21. poiSearch.searchPOIAsyn();
  22. }

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

[java] view plaincopy
  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. if(!searchFlag){
  13. search();
  14. searchFlag=true;
  15. }
  16. }else {
  17. System.out.println("定位失败");
  18. }
  19. }

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

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

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

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

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

定位成功的回调函数

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

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

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

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

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

[java] view plaincopy
  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. //latLng对象是一个经纬度的封装类,有点像LatLonPoint类
  14. LatLng latLng = new LatLng(aLocation.getLatitude(), aLocation.getLongitude());
  15. System.out.println("当前经纬度"+latLng);
  16. //把当前经纬度放到list里去,准备绘制轨迹
  17. list.add(latLng);
  18. //添加轨迹线
  19. System.out.println("正在绘制轨迹");
  20. mapView.getMap().addPolyline(new PolylineOptions().addAll(list));
  21. }else {
  22. System.out.println("定位失败");
  23. }
  24. }

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

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

4、规划路径功能

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

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

[java] view plaincopy
  1. public class MapActivity extends Activity implements OnRouteSearchListener

具体的搜索函数,在oncreate中调用

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

回调

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

高德地图基础功能使用心得相关推荐

  1. 高德地图基础使用教程(附demo)

    高德地图基础使用教程 简介 带大家一步步实现地图显示特定位置,或定位到当前位置.并且拖拽地图界面能够查询出指定位置周边的信息.通过关键字搜索周边信息. 本教程适合初学者. demo git 地址 一. ...

  2. 最新车载导航端口检测工具_高德地图这个功能 把微信都没做好的车载社交解决了?...

    在汽车网联化和智能化带给人们的诸多想象里,车内社交似乎是最虚无缥缈的那个.在移动互联网领域,微信通过满足人们社交需求这个基本点,构建起庞大的用户群体,展示出巨大的市场前景.但在驾车场景下,车载社交该怎 ...

  3. 高德地图大头针功能_【iOS】高德地图MAMapKit的使用:地图显示、添加大头针、导航、定位功能介绍...

    最近在做基于高德地图的定位.导航及添加大头针的功能,特此记录下来...方便刚接触的同学参考... 一.申请 Key:获取用户Key 2.在"KEY管理"页面点击上方的"获 ...

  4. vue 高德地图搜索功能_VUE中使用高德地图做轨迹添加功能,帮助轨迹展示

    准备工作 使用前准备 : 高德地图key 使用插件: vue-amap 1.npm安装vue-amap npm install vue-amap --save import AMap from 'vu ...

  5. android中高德地图定位功能并且获取定位的城市

    一.概述 今天再一次用到了地图定位功能和地图显示功能,以前一直用的是高德地图定位,这次还是用高德,记录一下以便以后再做时方便一些.因为业务需要的功能不是很全,可以参考https://www.2cto. ...

  6. VUE学习(六) 高德地图常用功能总结

    项目中使用地图的场景比较多,将常用的功能整理一下,方便后期使用. 目录 1.地图的引入 2.地图在页面显示 3.点标记 3.1快速点标记 3.2点标记详细配置 4.圆形.方形.多边形标记 4.1创建圆 ...

  7. android高德方向,Android 高德地图进阶功能

    本文接本人上一篇文章:Android APP接入高德SDK问题与记录,如果还不熟悉高德地图接入,可以先阅读这篇文章. 1 切换图层及显示路况 通过设置mapType,可以切换地图的类型: aMap.m ...

  8. 高德地图完整功能的html,揭秘高德地图八大不为人知的强大功能

    高德地图作为国内车主使用最多的手机地图,在日常扮演着为用户搜索地点.规划线路.躲避拥堵等等"出行服务小帮手"的重要角色.其实,作为国内领先的数字地图内容.导航和位置服务提供商高德的 ...

  9. vue高德地图搜索功能

    一.开发环境: vue版本:v2.5.2 vue-cli版本:v2.9.3 webpack版本:3.6.0 高德地图api版本:JavaScript API V1.4.12 二.直入主题 首先在,in ...

最新文章

  1. Linux内核学习笔记十一——I/O层和I/O调度机制
  2. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况...
  3. mysql Navcat触发器生成订单号
  4. python 基础笔记十一 - random模块
  5. 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 1 Convolutional Neural Networks: Step by Step
  6. android 发送重启广播,Android实现关机重启的方法分享
  7. leetcode45 跳跃游戏II 秒杀所有答案
  8. 理解计算机网络的拓扑结构,认识计算机网络拓扑结构
  9. 前端周刊第58期:送你 3 道面试题
  10. 二分法03:x 的平方根
  11. 《模拟电子技术基础》课程笔记(一)——绪论
  12. 万恶的ie(还好只是ie11)
  13. 2019华为网络技术大赛模拟题
  14. 看不见的,就是不存在么?《平面国》读后感
  15. 数据分析案例:对拉勾网数据分析岗位进行分析
  16. Python自动批量删除微博
  17. 号外!号外!豪车出租啦!
  18. 微信小程序wx.request封装
  19. Redis缓存:java写入文件不覆盖
  20. 基于php049校园团购网站

热门文章

  1. 为什么道理我都懂,却仍过不好一生 | 认知突破
  2. html做一个抽奖游戏,js实现大转盘抽奖游戏实例
  3. php 判断 几维,php推断数组是几维的要领_后端开发
  4. 分享10个免费H5模版(主题)资源网站
  5. vue项目打包给后端遇到的问题
  6. CISCO ASA设备任意文件读取漏洞复现 (CVE-2020-3452)
  7. 计算机 hdmi不显示桌面,请问各位网友,用HDMI线接电脑主机和液晶显示器时。显示器显示没有桌面图标,只有桌面壁纸。怎么回事...
  8. 基于阿克曼转向的车辆运动学模型 在simulink中建立车辆运动学模型
  9. 微信去除EMOJI表情
  10. 关于ACM,关于CSU