百度地图开发之【定位】

在前面几次我们分别完成了数据检索和线路规划的功能,但是如果我们不知道自己位置,检索起来说是不是会很麻烦呢?

知道自己位置就可以根据自己的位置进行检索和路线规划。

定位服务

在读地图的定位服务是与基本地图服务分开的所以需要引入另外的so文件盒jar包,如果你选择的是复合包的话,只用一如so文件就OK了。

首先在清单文件中加上如下的服务

<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
</service>

然后就是加入定位所需要的权限

注意自己去除和地图权限相同的权限

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

依然是 key文件,地图和定位使用同一个key文件

在清单文件的的APPlication节点下配置

<meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="key" />  

涉及地图相关的知识,不再赘述

  // 获取地图控件引用
    mMapView = (MapView) findViewById(R.id.bmapView);

    map = mMapView.getMap();
    // 设置开启定位自己的位置
    map.setMyLocationEnabled(true);

    // 设置定位点图标,可以使用系统的也可以自定义

    mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
    // 如果使用系统的让mCurrentMarker为空即可
    map.setMyLocationConfigeration(new MyLocationConfiguration(LocationMode.NORMAL, true, mCurrentMarker));

基本的定位操作

client = new LocationClient(getApplicationContext()); // 声明LocationClient类
    listener = Mylisetener;
    // 注册监听
    client.registerLocationListener(listener);

    LocationClientOption option = new LocationClientOption();
    option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
    option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
    option.setOpenGps(true);// 打开gps
    // option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
    // option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
    client.setLocOption(option);

具体实现代码

package com.flyou.hellomap;

import android.app.Activity;
import android.os.Bundle;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMapOptions;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatus.Builder;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.platform.comapi.map.s;

public class LocationMapActivity extends Activity {
  private LocationClient client;
  private BDLocationListener listener;
  MapView mMapView = null;
  BitmapDescriptor mCurrentMarker;
  private boolean isFirstLoc = true;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
    // 注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());

    setContentView(R.layout.activity_main);
    // 获取地图控件引用
    mMapView = (MapView) findViewById(R.id.bmapView);

    map = mMapView.getMap();
    // 设置开启定位自己的位置
    map.setMyLocationEnabled(true);

    // 设置定位点图标,可以使用系统的也可以自定义

    mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
    // 如果使用系统的让mCurrentMarker为空即可
    map.setMyLocationConfigeration(new MyLocationConfiguration(LocationMode.NORMAL, true, mCurrentMarker));
    location();
  }

  private void location() {
    client = new LocationClient(getApplicationContext()); // 声明LocationClient类
    listener = Mylisetener;
    // 注册监听
    client.registerLocationListener(listener);

    LocationClientOption option = new LocationClientOption();
    option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
    option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
    option.setOpenGps(true);// 打开gps
    // option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
    // option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
    client.setLocOption(option);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
    mMapView.onDestroy();
    // map.setMyLocationEnabled(false);
  }

  @Override
  protected void onResume() {
    super.onResume();
    location();
    // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
    mMapView.onResume();

    client.start();

  }

  @Override
  protected void onPause() {
    super.onPause();
    // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
    mMapView.onPause();

    client.stop();
  }

  BDLocationListener Mylisetener = new BDLocationListener() {

    @Override
    public void onReceiveLocation(BDLocation location) {
      // map view 销毁后不在处理新接收的位置
      if (location == null || mMapView == null)
        return;
      MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())
      // 此处设置开发者获取到的方向信息,顺时针0-360
          .direction(100).latitude(location.getLatitude()).longitude(location.getLongitude()).build();
      map.setMyLocationData(locData);
      if (isFirstLoc) {
        isFirstLoc = false;
        LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
        // 缩放的范围是3-20
        MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 17f);

        map.animateMapStatus(u);

      }
    }

  };
  private BaiduMap map;
}

实现了定位,再实现前面的数据检索,出行规划会不会很简单呢 ?

哈哈……

开始玩地图吧...

时间: 2024-10-12 17:01:03

百度地图开发之【定位】的相关文章

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定

[android] 百度地图开发 (二).定位城市位置和城市POI搜索

一. 百度地图城市定位和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了如何申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述如何定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么如何在百度地图上定位某一个位置呢?       通过类GeoPoint可以定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法可以获取Location对象,再定位经纬度设置其为地图中心即可显示当

百度地图开发定位与显示Demo(Android)

百度地图给我们提供了非常丰富的API供我们进行二次开发.百度地图的SDK与定位SDK在今年6月份进行了更新.地图更新为3.0,定位更新为4.2.百度说:这次更新对接口有了较大部分的调整,与之前版本不兼容.本篇博文基于以上最新版本的API提供一个小例子:获取自己当前的经纬度坐标,并且显示在地图上.这里只给出核心代码,其他KEY的引入,地图控件的添加,权限的声明,定位服务的声明可在百度地图API官网(http://developer.baidu.com/map/sdkandev-download.h

[android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么怎样在百度地图上定位某一个位置呢?       通过类GeoPoint能够定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法能够获取Location对象,再定位经纬度设置其为地图中心就可以显

C#的百度地图开发(五)IP定位

前面我们已经实现了坐标定位及前端显示,而坐标的获取一般只在移动设备上,对于PC端难以得到.但是在PC端,我们可以得到相应的IP.在得到了IP之后,我们就可以进行定们了.代码如下: public class BaiduMap { /// <summary> /// 依据IP获取定位信息的URL模板. /// 参数1:百度地图API的KEY. /// 参数2:IP. public const string IP_LOCATION_URL_TEMPLATE = "http://api.ma

android 百度地图开发实例(转载)

因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点android 百度地图开发常用的方法. 1初始化 MapManager mBMapMan = new BMapManager(this);boolean isSuccess = mBMapMan.init(this.mStrKey, new MyGeneralListener()); isSuccess 的值

关于用模拟器运行百度地图API无法定位的问题 - 不能用模拟器

模拟器是没有办法定位,当你加入定位模块的时候,传出的参数都是空的. 定位的这个方法函数,是通过回调接口来实现,而且触发该事件的时候,需要经纬度位置改变.官方文档写得很清楚,简单点来说,就是你没有GPS定位设备就没有办法实现(只能真机测试),GPS定位是实时监控定位,随时都在接收和发射你的位置信息,只有不断的改变才能触发该定位事件.(不得不说百度的开发人员很仔细) 转载自 http://blog.csdn.net/chuchu521/article/details/7980270 最后一段 关于用

Android studio 百度地图开发(5)查询周边服务(加油站)

email:[email protected] 开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0. 百度地图应用(1):Android studio 百度地图开发(1)配置工程.显示地图 百度地图应用(2):Android studio 百度地图开发(2)地图定位 百度地图应用(3):Android studio 百度地图开发(3)地图导航 百度地图应用(4):Android studio 百度地图开发(4)触摸选点

百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码

之前写过一篇关于百度地图开发的blog,主要介绍了百度地图的基本地图的显示. 详见:Android百度地图开发(一)之初体验 下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码. 添加覆盖物 在地图上添加覆盖物,一般需要以下几个步骤: 1. 定义坐标点,有可能是一个,有可能是多个(比如:多边形覆盖物). 2. 构造OverlayOptions(地图覆盖物选型基类). 3. 在地图上添加覆盖物. 4. 添加相应的监听事件. 在API中可以看到,BaiDuMap类中有一个方法: 这个方法就是用

android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索

最近跟着百度地图API学地图开发,先是学了路径搜索,对于已知坐标的两点进行驾车.公交.步行三种路径的搜索(公交路径运行没效果,待学习中),后来又 学了定位功能,能够获取到自己所在位置的经纬度,但当将两者合起来先自动获取自己所在位置的经纬度然后与固定地点进行路径搜索时却弄不出来了,因为刚开始 写的两者在两个类中总是取不到经纬度值,后来将两者写到同一个类中去了,终于取到经纬度值了,也运行出来了.需要 在 BDLocationListener的onReceiveLocation里获取到经纬度值,因为已