当前位置:   article > 正文

地图常见操作总结_settrafficoff

settrafficoff

百度地图

显示地图

  1. 申请API Key, 并放入清单文件
    1. <meta-data
    2. android:name="com.baidu.lbsapi.API_KEY"
    3. android:value="3zajzkwwhq4leyIWkleneoyN" />
  2. 添加权限
    1. <!-- 这个权限用于进行网络定位-->
    2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    3. <!-- 这个权限用于访问GPS定位-->
    4. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    5. <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    7. <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
    8. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    9. <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    10. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    11. <!-- 用于读取手机当前的状态-->
    12. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    13. <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
    14. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    15. <!-- 访问网络,网络定位需要上网-->
    16. <uses-permission android:name="android.permission.INTERNET" />
    17. <!-- SD卡读取权限,用户写入离线定位数据-->
    18. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
    19. <!-- 允许应用读取低级别的系统日志文件 -->
    20. <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
  3. 初始化SDK, 并接收结果通知

    1. private void initSDK() {
    2. SDKInitializer.initialize(getApplicationContext());
    3. IntentFilter filter = new IntentFilter();
    4. // 网络错误
    5. filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
    6. // 权限异常
    7. filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
    8. receiver = new MyBroadcastReceiver();
    9. registerReceiver(receiver, filter);
    10. }
    11. class MyBroadcastReceiver extends BroadcastReceiver {
    12. @Override
    13. public void onReceive(Context context, Intent intent) {
    14. if (SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR
    15. .equals(intent.getAction())) {
    16. Toast.makeText(BaseActivity.this, "网络异常", Toast.LENGTH_SHORT).show();
    17. }
    18. if (SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR
    19. .equals(intent.getAction())) {
    20. Toast.makeText(BaseActivity.this, "Key验证异常", Toast.LENGTH_SHORT).show();
    21. }
    22. }
    23. }
  4. 实现生命周期方法

    1. @Override
    2. protected void onResume() {
    3. mapView.onResume();
    4. super.onResume();
    5. }
    6. @Override
    7. protected void onPause() {
    8. mapView.onPause();
    9. super.onPause();
    10. }
    11. @Override
    12. protected void onDestroy() {
    13. mapView.onDestroy();
    14. // 反注册广播接收者
    15. unregisterReceiver(receiver);
    16. super.onDestroy();
    17. }
  5. 初始化地图

    1. private void initMap() {
    2. // 得到地图控件
    3. mapView = (MapView) findViewById(R.id.mapView);
    4. // 得到地图控制器
    5. mapControl = mapView.getMap();
    6. // 更改中心点
    7. MapStatusUpdate update1 = MapStatusUpdateFactory.newLatLng(new LatLng(34.196421, 108.868445));
    8. mapControl.animateMapStatus(update1);
    9. // 更改缩放级别, 缩放级别取值范围: 3 - 19
    10. MapStatusUpdate update2 = MapStatusUpdateFactory.zoomTo(16);
    11. mapControl.animateMapStatus(update2);
    12. }

图层控制

  1. 添加选项菜单
    1. @Override
    2. public boolean onCreateOptionsMenu(Menu menu) {
    3. menu.add(1, 1, 1, "显示普通图层");
    4. menu.add(1, 2, 2, "显示卫星图");
    5. menu.add(1, 3, 3, "显示/关闭交通图");
    6. return super.onCreateOptionsMenu(menu);
    7. }
  2. 更改底图

    图层类似于一叠扑克牌
    最下层是一个底图, 底图有两种类型

    1. 普通地图
    2. 卫星图
      在这之上可以有其它图层, 类似交通图, 热力图
    1. super.mapControl.setMapType(BaiduMap.MAP_TYPE_NORMAL);
    2. super.mapControl.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
  3. 添加交通图
    1. @Override
    2. public boolean onOptionsItemSelected(MenuItem item) {
    3. switch (item.getItemId()) {
    4. case 1:
    5. super.mapControl.setMapType(BaiduMap.MAP_TYPE_NORMAL);
    6. break;
    7. case 2:
    8. super.mapControl.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
    9. break;
    10. case 3:
    11. super.mapControl.setTrafficEnabled(!isShowTraffic);
    12. isShowTraffic = !isShowTraffic;
    13. break;
    14. }
    15. return super.onOptionsItemSelected(item);
    16. }

圆形覆盖物

  1. 创建覆盖物
     CircleOptions options = new CircleOptions();
    
  2. 设置覆盖物内容
    1. // 设置位置
    2. options.center(new LatLng(34.196421, 108.868445));
    3. // 设置半径, 单位: 米
    4. options.radius(100);
    5. // 填充颜色
    6. options.fillColor(Color.TRANSPARENT);
    7. // 设置圆边样式, 参数一: 边的宽度, 参数二: 边的颜色
    8. options.stroke(new Stroke(2, Color.BLUE));
  3. 添加到界面上
     mapControl.addOverlay(options);
    

文字覆盖物

  1. 创建覆盖物
     TextOptions textOptions = new TextOptions();
    
  2. 设置覆盖物内容
    1. // 设置文字
    2. textOptions.text("西安传智");
    3. // 设置字体大小, 单位 px
    4. textOptions.fontSize(100);
    5. // 设置字体颜色
    6. textOptions.fontColor(Color.BLUE);
    7. // 设置覆盖物位置
    8. textOptions.position(new LatLng(34.196421, 108.868445));
  3. 添加到界面上
     mapControl.addOverlay(textOptions);
    

图形覆盖物

  1. 创建覆盖物
     MarkerOptions options = new MarkerOptions();
    
  2. 设置覆盖物内容

    1. // 设置Overlay的标题
    2. options.title("产品狗");
    3. // 设置位置
    4. options.position(new LatLng(34.196421, 108.868445));
    5. // 创建对应的BitmapDescripter数组
    6. ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
    7. bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.eat_icon));
    8. bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));
    9. // 给Overlay设置图片数组, 如果有一组图片的话, 可以通过period来控制刷新速度
    10. options.icons(bitmaps);
    11. options.period(30);
    12. // 设置Options可以拖动
    13. options.draggable(true);
  3. 添加到界面上
     mapControl.addOverlay(options);
    

点击Marker的时候显示弹框

  1. 初始化弹框, 加入控件中, 并设置隐藏, 这样的做法是为了加快速度, 节省资源

    1. private void initPopView() {
    2. // 创建出来PopView
    3. popView = getLayoutInflater().inflate(R.layout.pop, null);
    4. popView.setVisibility(View.INVISIBLE);
    5. // 得到文字对应的TextView
    6. tv_title = (TextView) popView.findViewById(R.id.title);
    7. // 创建MapView中的子View的描述类
    8. MapViewLayoutParams params = new MapViewLayoutParams.Builder()
    9. .width(MapViewLayoutParams.WRAP_CONTENT)
    10. .height(MapViewLayoutParams.WRAP_CONTENT)
    11. .layoutMode(ELayoutMode.absoluteMode)
    12. .point(new Point(100, 100))
    13. .build();
    14. // 加入到界面
    15. mapView.addView(popView, params);
    16. }
  2. 给MarkerOverlay设置点击事件
    1. // 设置marker的点击事件
    2. mapControl.setOnMarkerClickListener(new OnMarkerClickListener() {
    3. /**
    4. * marker: markeroverlay的属性
    5. */
    6. @Override
    7. public boolean onMarkerClick(Marker marker) {
    8. showPopView(marker.getTitle(), marker.getPosition());
    9. return false;
    10. }
    11. });
  3. 在点击事件的时候显示出来弹框, 并更新弹框位置

    1. private void showPopView(String title, LatLng position) {
    2. popView.setVisibility(View.VISIBLE);
    3. tv_title.setText(title);
    4. // 创建MapView中的子View的描述类
    5. MapViewLayoutParams params = new MapViewLayoutParams.Builder()
    6. .width(MapViewLayoutParams.WRAP_CONTENT)
    7. .height(MapViewLayoutParams.WRAP_CONTENT)
    8. .layoutMode(ELayoutMode.mapMode)
    9. .position(position)
    10. .build();
    11. // 加入到界面
    12. mapView.updateViewLayout(popView, params);
    13. }

POI搜索

  • 通过PoiSearch开始搜索
  • 通过PoiBoundSearchOption传递矩形范围搜索的参数
  • 通过PoiNearbySearchOption传递圆形搜索的参数
  • 通过PoiCitySearchOption传递城市搜索的参数

矩形搜索

  1. 创建用于矩形搜索的参数

    1. // 新建搜索选项
    2. PoiBoundSearchOption searchOption = new PoiBoundSearchOption();
    3. searchOption.keyword("酒店");
    4. // 拼装范围
    5. LatLngBounds bounds = new LatLngBounds.Builder()
    6. .include(new LatLng(34.196421 - 0.011, 108.868445 - 0.011))
    7. .include(new LatLng(34.196421 + 0.011, 108.868445 + 0.011))
    8. .build();
    9. searchOption.bound(bounds);
  2. 创建Poi搜索入口, 并将参数传入开始检索

    1. // 新建搜索类
    2. PoiSearch search = PoiSearch.newInstance();
    3. // 开始搜索
    4. search.searchInBound(searchOption);
  3. 创建搜索结果监听, 并设置给Poi搜索入口

    1. // 由于是一个异步的过程, 所以需要通过回调接口来接受相关参数
    2. search.setOnGetPoiSearchResultListener(this);
    3. /**
    4. * 当Poi详情搜索完成的时候调用此方法, 传入详情搜索的结果集
    5. * @param result 详情结果集
    6. */
    7. @Override
    8. public void onGetPoiDetailResult(PoiDetailResult result) {
    9. }
    10. /**
    11. * 当Poi搜索完成的时候调用此方法, 传入Poi搜索的结果集
    12. * @param result poi搜索的结果集
    13. */
    14. @Override
    15. public void onGetPoiResult(PoiResult result) {
    16. // 创建用于展示Poi搜索结果集的覆盖物
    17. PoiOverlay overlay = new PoiOverlay(mapController);
    18. overlay.setData(result);
    19. overlay.addToMap();
    20. overlay.zoomToSpan();
    21. }

路线搜索

类似于Poi搜索, 路线搜索页是几乎相同的构造方式
主要有:

  • RoutePlanSearch 是搜索的入口
  • DrivingRoutePlanOption 保存驾车搜索的参数
  • WalkingRoutePlanOption 保存步行搜索的参数
  • TransitRoutePlanOption 保存公交换乘的参数

驾车搜索

  1. 创建搜索参数类, 创建相应的参数
    1. //发起请求
    2. DrivingRoutePlanOption drivingPlanOptoin = new DrivingRoutePlanOption();
    3. // 起点
    4. drivingPlanOptoin.from(PlanNode.withLocation(new LatLng(34.798413, 113.551107)));
    5. // 终点
    6. drivingPlanOptoin.to(PlanNode.withLocation(new LatLng(34.813292 ,113.552154)));
    7. // 策略
    8. drivingPlanOptoin.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_TIME_FIRST);
  2. 创建搜索入口, 并传入参数, 开启搜索

    1. //搜索核心类
    2. RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();
    3. routePlanSearch.drivingSearch(drivingPlanOptoin);
  3. 创建监听并注册, 获取搜索结果

    1. //设置监听
    2. routePlanSearch.setOnGetRoutePlanResultListener(new MyOnGetRoutePlanResultListener());
    3. class MyOnGetRoutePlanResultListener implements OnGetRoutePlanResultListener{
    4. @Override
    5. public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
    6. //展示驾车路线
    7. DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(mapController);
    8. drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(0));//结果中有多种路线选择,直接选择第一种即可
    9. drivingRouteOverlay.addToMap();
    10. drivingRouteOverlay.zoomToSpan();
    11. }
    12. @Override
    13. public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
    14. }
    15. @Override
    16. public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
    17. }
    18. }

定位

  1. 注册百度定位所需要的服务器
     <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>
    
  2. 创建定位所需要的一些主类

    1. mLocationClient = new LocationClient(getApplicationContext());
    2. initLocaion();
  3. 创建监听并注册, 获取定位成功的结果

    1. mLocationClient.registerLocationListener( myListener ); //注册监听函数
    2. public class MyLocationListener implements BDLocationListener {
    3. @Override
    4. public void onReceiveLocation(BDLocation location) {
    5. mapController.setMyLocationData(new MyLocationData.Builder()
    6. .latitude(location.getLatitude())
    7. .longitude(location.getLongitude())
    8. .build());
    9. }
    10. }
  4. 对定位进行设置, 模板代码

    1. LocationClientOption option = new LocationClientOption();
    2. option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
    3. option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
    4. int span=1000;
    5. option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
    6. option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
    7. option.setOpenGps(true);//可选,默认false,设置是否使用gps
    8. option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
    9. option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
    10. option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
    11. mLocationClient.setLocOption(option);
    12. mapController.setMyLocationEnabled(true);
  5. 在Activity开启的时候开启定位, 在Activity结束的时候结束定位

    1. @Override
    2. protected void onStart() {
    3. mLocationClient.start();
    4. super.onStart();
    5. }
    6. @Override
    7. protected void onStop() {
    8. mLocationClient.stop();
    9. super.onStop();
    10. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/105935
推荐阅读
相关标签
  

闽ICP备14008679号