Android高德地图配置及实现定位,目的地路线规划的路线绘制

1.第一步进行高德地图的配置

    1)高德地图控制台https://lbs.amap.com/dev/index创建应用和所需要的key(注意applicationId 和 签名中的SHA1 正确,比如用          正式的签名配的SHA1但是编译项目却用debug的默认签名会出问题)

    

//清单文件配置
<application>

   <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="申请的Key"/>

</application>

    2) gradle配置所需要的依赖包

app下的build.gradle文件中配置

dependencies {

    //.......
    //3D地图so及jar
    compile 'com.amap.api:3dmap:latest.integration'
    //定位功能
    compile 'com.amap.api:location:latest.integration'
    //搜索功能
    compile 'com.amap.api:search:latest.integration'

}

2.UI,初始化,定位代码编写

xml代码

<?xml version="1.0" encoding="utf-8"?>
<com.amap.api.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

activity代码

private MapView mapView;//地图显示view

private AMap aMap;//地图控制器

private MyLocationStyle myLocationStyle;//地图定位样式

 @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_map_base);
     mapView = (MapView) findViewById(R.id.map_view);
     mapView.onCreate(savedInstanceState);  
     if (aMap == null){
      aMap = mapView.getMap();
     }
     /**
      * 设置一些amap的属性
      */        
     aMap.getUiSettings().setZoomControlsEnabled(false);//是否可以缩放
     aMap.moveCamera(CameraUpdateFactory.zoomTo(15));//缩放比例
     //地图文字的Z轴指数,设置为2可以将地图底图文字设置在添加的覆盖物之上
     aMap.setMapTextZIndex(2);
     
     UiSettings uiSettings = aMap.getUiSettings();//地图的UI设置控制器
     uiSettings.setCompassEnabled(false);// 设置指南针是否显示
     uiSettings.setZoomControlsEnabled(false);// 设置缩放按钮是否显示
     uiSettings.setScaleControlsEnabled(true);// 设置比例尺是否显示
     uiSettings.setRotateGesturesEnabled(true);// 设置地图旋转是否可用
     uiSettings.setTiltGesturesEnabled(true);// 设置地图倾斜是否可用
     uiSettings.setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示 

     myLocationStyle = new MyLocationStyle();
     //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为秒。     
     myLocationStyle.interval(3000);
     
     //设置连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
     //具体场景可根据高德API查看
     myLocationStyle.myLocationType(MyLocationStyle
     .LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);

     myLocationStyle.showMyLocation(true);//显示定位蓝点
     //设置图标
     myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
     fromResource(R.mipmap.navi_map_gps_locked));
     //设置圆圈颜色
     myLocationStyle.radiusFillColor(0x70ffffff);
     //设置边框颜色
     myLocationStyle.strokeColor(0xffffffff);
     aMap.setMyLocationStyle(myLocationStyle);//关联myLocationStyle
     //监听定位信息的回调
     aMap.setOnMyLocationChangeListener(new OnMyLocationChangeListener());

     //开启定位,设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认false。
     aMap.setMyLocationEnabled(true);
     
}
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState), 
        //保存地图当前的状态
        mapView.onSaveInstanceState(outState);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
        mapView.onDestroy();
    }
private boolean isFirstLocation = true;//第一次定位成功

class OnMyLocationChangeListener implements AMap.OnMyLocationChangeListener{

   @Override //定位信息的回调监听
   public void onMyLocationChange(Location location) {
      if (location == null){
        return;
      }
      Bundle bundle = location.getExtras();
      if (bundle != null && (bundle.getInt("errorCode",-1)) == 0){//定位成功
         //获取定位数据
         //经度
         double lat = location.getLatitude();
         //纬度
         double lng = location.getLongitude();

         //实现第一次定位成功,将地图中心移动到定位点
          if (isFirstLocation){
             isFirstLocation = false;
             CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new 
             LatLng(lat,lng),17);
             aMap.moveCamera(cameraUpdate);//将地图移动到定位坐标点
          }
         
      }else{
          //错误信息
          String error = bundle.get("errorInfo")
          Log.e("Map",error);
    
      }
   }
}

3.路线规划查询路径

private RouteSearch mRouteSearch;//路线查询器

private void initSearch() {
   mRouteSearch = new RouteSearch(this);
   //设置数据回调监听器
   mRouteSearch.setRouteSearchListener(new OnRouteSearchListener());

   //设置开始位置坐标点(注意经纬度不能写反,会报错1800(只能规划到中国区域里的地图路线))
   LatLonPoint startPoint new LatLonPoint(30.321842,120.141216);
   //设置目的地坐标点
   LatLonPoint endPoint = new LatLonPoint(30.321842,120.141216);
   //查询信息对象
   RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(startPoint,endPoint);

   //设置搜索参数 1.fromAndTo 路径的起点终点  2.路径规划的策略(这里是驾车模式,具体看高德API) 3.途 
   //经点,可选 4.避让区域,可选, 5.避让道路 ,可选
   RouteSearch.DriveRouteQuery query = new 
   RouteSearch.DriveRouteQuery(fromAndTo,RouteSearch.DRIVING_SINGLE_DEFAULT,null,null,"");
   //开始异步查询
   mRouteSearch.calculateDriveRouteAsyn(query);
   
}

class OnRouteSearchListener implements RouteSearch.OnRouteSearchListener{

  @Override
  public void onDriveRouteSearched(DriveRouteResult driveRouteResult, int rCode) {
      if (rCode == 1000){//获取规划路线成功,获取到的是了,路线坐标点的集合

          List<DrivePath> paths = driveRouteResult.getPaths();

          //创建存储坐标点的集合
          List<LatLng> latLngs = new ArrayList<>();

          //遍历获取规划的所有路线坐标点
          for (DrivePath mDrivePath : paths) {
            for (DriveStep mDriveStep : mDrivePath.getSteps()) {
               for (LatLonPoint mLatLonPoint : mDriveStep.getPolyline()) {
                   latLngs.add(new 
                   LatLng(mLatLonPoint.getLatitude(),mLatLonPoint.getLongitude()));
               }
            } 
          }
         
          //先清除一下,避免重复显示
          aMap.clear();

          //绘制起始位置和目的地marker
          aMap.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.fromResource(iconRes))
                    .position(new LatLng(经度,纬度)));
          aMap.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.fromResource(iconRes))
                    .position(new LatLng(经度,纬度)));

          //绘制规划路径路线
          aMap.addPolyline(new PolylineOptions()
                //路线坐标点的集合
                .addAll(latLngs)
                //线的宽度
                .width(30)
                .color(getResources().getColor(R.color.blue))//设置画线的颜色

         //显示完整包含所有marker地图路线
         LatLngBounds.Builder builder = new LatLngBounds.Builder();
         for (int i = 0; i < latLngs.size(); i++) {
            builder.include(latLngs.get(i));
         }
         //显示全部marker,第二个参数是四周留空宽度
         aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(),200));
      }
  }

}

Over~

上一篇:前端常用方法


下一篇:在react中使用原生的高德地图