当前位置: 澳门新濠3559 > 操作系统 > 正文

澳门新濠3559定位精度高、覆盖率广、网络定位请

时间:2019-12-21 19:57来源:操作系统
依靠IP地址实现稳定,能够在googlemap上展现,本来思忖用百度地图的,但因为ip是国外的区域,百度不辅助,所以要求用google,定位也不用太规范,定位到城市就能够。 别的文章: 安卓百

依靠IP地址实现稳定,能够在googlemap上展现,本来思忖用百度地图的,但因为ip是国外的区域,百度不辅助,所以要求用google,定位也不用太规范,定位到城市就能够。

澳门新濠3559 1

别的文章:
安卓百度离线地图的下载以致接收
安卓百度地图(二)地图展现以致离线地图的下载使用
安卓百度地图(三)绘制点、线等图层消息
安卓百度地图(四)城市,周围,区域寻觅
安卓百度地图(五)百度地图路径规划
安卓百度地图(六)鹰眼轨迹的上传,历史轨迹的来得
安卓百度地图(七)地理围栏的创建与运用

最近项目中须求用到百度导航,大家都觉的导入百度的导航SDK相比较费心,就平昔跳转到了百度导航。

  • Android百度地图开采(生龙活虎):概述
  • Android百度地图开拓(二):项目开创
  • Android百度地图开拓(三):定位
  • Android百度地图开荒(四):创制地图
  • Android百度地图开辟(五):图层
  • Android百度地图开辟(六):图形绘制
  • Android百度地图开采(七):地图事件监听

本文首要针对百度固定sdk的api进行整合治理

在百度上找到了app调用百度导航的代码基本等同,如下:

百度一定SDK免费门户开放,接口使用无次数节制

风华正茂 定位简要介绍

百度地图Android定位SDK提供GPS、基站、WiFi、地球磁性、蓝牙5.0、传感器等两种一定方式,适用于房内、室外三种稳定场景,具备能够的定点品质:定位精度高、覆盖率广、网络稳固央求流量小、定位速度快。

澳门新濠3559 2

引用官方的图片

在房间里无gps时,百度永久正是选择的WiFi和基站定位的,在户外有gps时,百度是运用的android自带的LocationManager实行定点,当然户外也足以用WiFi基站定位。

  • GPS定位:精度异常高,几米到十几米,然则耗能严重。
  • WiFi定位:精度相对于GPS差了一点,不过也能到十几米、几十米,也是有成都百货上海里的零值误差的,低耗能。
  • 基站定位:精度非常糟糕,经常都有几百米,上海里的基值误差。
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=目的地&mode=driving&coord_type=gcj02",[info.dzwd doubleValue],[info.dzjd doubleValue]] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://map/"]]) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]]; } else { [[[UIAlertView alloc]initWithTitle:@"没有安装百度地图" message:@"" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil,nil] show]; }

百度地图Android定位SDK提供GPS、基站、WiFi、地球磁性、蓝牙5.0、传感器等各个恒定方式,适用于房间里、户外种种永久场景,具备卓越的固定质量:定位精度高、覆盖率广、网络稳定央浼流量小、定位速度快。

二 百度地图配置

关于百度地图的配备,能够查阅官方网址的详细明白教程:传送门

  • 登录API控制台,创造应用,获取使用的AK。
  • 下载所急需的开采能源传送门,解压文件,将lib下的文本copy至app下的lib中,在app的buid文件中输入
android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
  • 添加AK
<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="开发者申请的AK" >
</meta-data>
  • 拉长所需服务
//Application标签中声明service组件,每个App拥有自己单独的定位service
<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>

专一:安卓6.0系统以上,一些权力需求动态申请

开班时百度地图定位坐标

澳门新濠3559 3

三 百度地图定位

澳门新濠3559 4百度一定坐标.PNG

  1. 权限配置

1. 初始化LocationClient类

public LocationClient mLocationClient = null;;
public void onCreate()
{
     mLocationClient = new LocationClient(getApplicationContext());//声明LocationClient类
     mLocationClient.registerLocationListener(myListener);//注册监听函数
}

发轫导航,跳转到百度导航,会意识地方发生了上浮。

2. 安顿定位SDK参数

LocationClientOption mOption = new LocationClientOption();

/**
* 默认高精度,设置定位模式
* LocationMode.Hight_Accuracy 高精度定位模式:这种定位模式下,会同时使用
* LocationMode.Battery_Saving 低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位。
* LocationMode.Device_Sensors 仅用设备定位模式:这种定位模式下,
*/
mOption.setLocationMode(LocationMode.Hight_Accuracy);

/**
* 默认是true,设置是否使用gps定位
* 如果设置为false,即使mOption.setLocationMode(LocationMode.Hight_Accuracy)也不会gps定位
*/
mOption.setOpenGps(true);

/**
* 默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
* 目前国内主要有以下三种坐标系:
1. wgs84:目前广泛使用的GPS全球卫星定位系统使用的标准坐标系;
2. gcj02:经过国测局加密的坐标;
3. bd09:为百度坐标系,其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标;
* 在国内获得的坐标系类型可以是:国测局坐标、百度墨卡托坐标 和 百度经纬度坐标。
  在海外地区,只能获得WGS84坐标。请在使用过程中注意选择坐标。
*/
mOption.setCoorType("bd09ll");

/**
* 默认0,即仅定位一次;设置间隔需大于等于1000ms,表示周期性定位
* 如果不在AndroidManifest.xml声明百度指定的Service,周期性请求无法正常工作
* 这里需要注意的是:如果是室外gps定位,不用访问服务器,设置的间隔是3秒,那么就是3秒返回一次位置
  如果是WiFi基站定位,需要访问服务器,这个时候每次网络请求时间差异很大,设置的间隔是3秒,
  只能大概保证3秒左右会返回就一次位置,有时某次定位可能会5秒才返回
*/
mOption.setScanSpan(3000);

/**
* 默认false,设置是否需要地址信息
* 返回省、市、区、街道等地址信息,这个api用处很大,
  很多新闻类app会根据定位返回的市区信息推送用户所在市的新闻
*/
mOption.setIsNeedAddress(true);

/**
* 默认false,设置是否需要位置语义化结果
* 可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
*/
mOption.setIsNeedLocationDescribe(true);

/**
* 默认false,设置是否需要设备方向传感器的方向结果
* 一般在室外gps定位时,返回的位置信息是带有方向的,但是有时候gps返回的位置也不带方向,
  这个时候可以获取设备方向传感器的方向
* wifi基站定位的位置信息是不带方向的,如果需要可以获取设备方向传感器的方向
*/
mOption.setNeedDeviceDirect(false);

/**
* 默认false,设置是否当gps有效时按照设定的周期频率输出GPS结果
* 室外gps有效时,周期性1秒返回一次位置信息,其实就是设置了
locationManager.requestLocationUpdates中的minTime参数为1000ms,1秒回调一个gps位置
* 如果设置了mOption.setScanSpan(3000),那minTime就是3000ms了,3秒回调一个gps位置
*/
mOption.setLocationNotify(false);

/**
* 默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
* 如果你已经拿到了你要的位置信息,不需要再定位了,不杀死留着干嘛
*/
mOption.setIgnoreKillProcess(true);

/**
* 默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
* POI就是获取到的位置附近的一些商场、饭店、银行等信息
*/
mOption.setIsNeedLocationPoiList(true);

/**
* 默认false,设置是否收集CRASH信息,默认收集
*/
mOption.SetIgnoreCacheException(false);

/**
* 默认false,设置定位时是否需要海拔高度信息,默认不需要,除基础定位版本都可用
*/
mOption.setIsNeedAltitude(false);

mLocationClient.setLocOption(mOption);//设置定位参数

澳门新濠3559 5坐标漂移.PNG

<!-- 这个权限用于进行网络定位-->
<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>

3. 呼吁定位

发起定位,便能够从BDAbstractLocationListener监听接口中获得一定结果音信。

//mLocationClient为第二步初始化过的LocationClient对象
//调用LocationClient的start()方法,便可发起定位请求
mLocationClient.start();
//tart():启动定位SDK;stop():关闭定位SDK。调用start()之后只需要等待定位结果自动回调即可。
//开发者定位场景如果是单次定位的场景,在收到定位结果之后直接调用stop()函数即可。
//如果stop()之后仍然想进行定位,可以再次start()等待定位结果回调即可。
//自v7.2版本起,新增LocationClient.reStart()方法,用于在某些特定的异常环境下重启定位。

是或不是有一点坑!!!每每查看了下贴代码人的疏解,都在说coord_type=gcj02那个都并不是改。

向来SDK那要涉及到四个类

4.实现BDAbstractLocationListener接口

提倡定位后,就可以获得所急需的新闻

private class MyBDAbstractLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果    
           if (null != location && location.getLocType() != BDLocation.TypeServerError) {

           }   
        }
}

查相关资料才晓得,百度一定和百度导航应用的是例外的坐标系gcj02:表示一定打响后回来国测局经纬度坐标系坐标;bd09:表示一定打响后回到百度墨卡托坐标系坐标;bd09ll:表示一定打响后赶回百度经纬度坐标系坐标。即gcj02正是报告百度导航我们选取国测局的坐标表示,而大家一向到的坐标是bd09ll坐标,坑啊!!!!将coord_type=gcj02改为coord_type=bd09ll, 导航坐标成功显示,无漂移。

  • LocationClient
  • LocationClientOption //定位配置
  • BDAbstractLocationListener //定位消息回调

4.1 获取基本牢固音讯

bdLocation.getLatitude();//纬度
bdLocation.getLongitude();//经度
bdLocation.getDirection();//定位方向
bdLocation.getRadius();//定位精度
bdLocation.getCoorType();//定位坐标类型
bdLocation.getLocType();//定位类型、定位错误返回码
bdLocation.getLocTypeDescription();//对应的定位类型说明
bdLocation.getTime();//获取经纬度服务器时间
//判断用户是在室内,还是在室外1:室内,0:室外,这个判断不一定是100%准确的
bdLocation.getUserIndoorState();

澳门新濠3559 6bd09ll坐标.PNG

4.2 获取地址新闻

小心:配置定位SDK参数中,增加获取地址信息option.setIsNeedAddress(true);

bdLocation.getAddrStr();    //获取详细地址信息
bdLocation.getCountry();    //获取国家
bdLocation.getProvince();    //获取省份
bdLocation.getCity();    //获取城市
bdLocation.getDistrict();    //获取区县
bdLocation.getStreet();    //获取街道信息

总计:最近境内项目中多采用百度固定坐标,假若须要将百度固定坐标在百度导航上科学展现,必要将coord_type设置为bd09ll。

    //初始化
    //请在主线程中声明LocationClient类对象,该对象初始化需传入Context类型参数 
    LocationClient mLocationClient = new LocationClient(getApplicationContext());    
    mLocationClient.registerLocationListener(BDAbstractLocationListener);     //回调

    LocationClientOption option = new LocationClientOption();
    option.setLocationMode(LocationMode.Hight_Accuracy);
    ......//具体设置下面说明
    mLocationClient.setLocOption(option);

    //定位的方式分为单次定位和定时定位,在LocationClientOption配置
    mLocationClient.start();  //开始定位
    mLocationClient.stop();  //结束定位,可以在定位返回的时候暂停定位服务


    public class MyLocationListener implements BDAbstractLocationListener{
        @Override
        public void onReceiveLocation(BDLocation location){
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明

            double latitude = location.getLatitude();    //获取纬度信息
            double longitude = location.getLongitude();    //获取经度信息
            float radius = location.getRadius();    //获取定位精度,默认值为0.0f

            String coorType = location.getCoorType();
            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准

            int errorCode = location.getLocType();
            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
    }
}

4.3 获取地点音信描述

注意:首先在布局定位SDK参数中,增多获取地方音讯描述option.setIsNeedLocationDescribe(true);

location.getLocationDescribe();    //获取位置描述信息

LocationClientOption

Setting Describe Option
LocationMode 设置定位模式,默认高精度 LocationMode.Hight_Accuracy:高精度
LocationMode. Battery_Saving:低功耗
LocationMode. Device_Sensors:仅使用设备
CoorType 设置返回经纬度坐标类型,默认gcj02 gcj02:国测局坐标
bd09ll:百度经纬度坐标
bd09:百度墨卡托坐标
ScanSpan 设置发起定位请求的间隔,int类型,单位ms 如果设置为0,则代表单次定位,即仅定位一次,默认为0
如果设置非0,需设置1000ms以上才有效
OpenGps 设置是否使用gps,默认false。
使用高精度和仅用设备两种定位模式的,参数必须设置为true
LocationNotify 设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
IgnoreKillProcess 定位SDK内部是一个service,并放到了独立进程。
设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
IgnoreCacheException 设置是否收集Crash信息,默认收集,即参数为false
WifiCacheTimeOut 如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
EnableSimulateGps 设置是否需要过滤GPS仿真结果,默认需要,即参数为false
IsNeedAddress 是否需要地址信息,默认为不需要
IsNeedLocationDescribe 是否需要位置描述信息,默认为不需要
IsNeedLocationPoiList 是否需要周边POI信息,默认为不需要

>>>>>>>Demo地址<<<<<<<

澳门新濠3559 7

4.4 周边POI信息

获取地点西接的意气风发部分店铺、旅社、银行等音信
注意:首先在配置定位SDK参数中,增添获取周边音讯option.setIsNeedLocationPoiList(true);
在完成的BDAbstractLocationListener接口中,通过getPoiList(卡塔尔方法,就可以得到相近消息

List<Poi> poiList = bdLocation.getPoiList(); //POI信息包括POI ID、名称等,具体信息请参照类参考中POI类的相关说明

4.5 判确定位类型

if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
        bdLocation.getSpeed();// 速度 单位:km/h
        bdLocation.getSatelliteNumber();// 卫星数目
        bdLocation.getAltitude();// 海拔高度 单位:米
        bdLocation.getGpsAccuracyStatus();// *****gps质量判断*****
        Toast.makeText(MainActivity.this, "gps定位成功", Toast.LENGTH_SHORT).show();

} else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
       // 运营商信息
        if (bdLocation.hasAltitude()) {// *****如果有海拔高度*****
            bdLocation.getAltitude();// 单位:米
        }
        (bdLocation.getOperators();   // 运营商信息
        Toast.makeText(MainActivity.this, "网络定位成功", Toast.LENGTH_SHORT).show();

} else if (bdLocation.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
        Toast.makeText(MainActivity.this, "离线定位成功,离线定位结果也是有效的", Toast.LENGTH_SHORT).show();

} else if (bdLocation.getLocType() == BDLocation.TypeServerError) {
        Toast.makeText(MainActivity.this, "服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因", Toast.LENGTH_SHORT).show();

} else if (bdLocation.getLocType() == BDLocation.TypeNetWorkException) {
        Toast.makeText(MainActivity.this, "网络不通导致定位失败,请检查网络是否通畅", Toast.LENGTH_SHORT).show();

} else if (bdLocation.getLocType() == BDLocation.TypeCriteriaException) {

        Toast.makeText(MainActivity.this, "法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结
果,可以试着重启手机", Toast.LENGTH_SHORT).show();
}

4.6 国内外地点剖断

//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举与国内外判断相关的内容
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
//BDLocation.getLocationWhere()方法可获得当前定位点是否是国内,它的取值及含义如下:
//BDLocation.LOCATION_WHERE_IN_CN:当前定位点在国内;
//BDLocation.LOCATION_WHERE_OUT_CN:当前定位点在海外;
//其他:无法判定。

4.7 地方提醒

定位SDK协助地方提示功能,地点提示最多提示3次,3次之后将不再晋升。倘诺供给再行提示、可能要更正提示点坐标,都可由此函数SetNotifyLocation(卡塔尔国来促成。

4.7.1 注册监听函数

 //注册监听函数
 mLocationClient.registerNotify(myListener);    

4.7.2 完毕地点监听的回调

定义MyNotifyLister类,继承BDNotifyListener,实现位置监听的回调。
public class MyNotifyLister extends BDNotifyListener {
    public void onNotify(BDLocation mlocation, float distance){
        //已到达设置监听位置附近
    }           
}

4.7.3 达成设置职分音信提示

调用BDNotifyListener的setNotifyLocation方法,实现设置位置消息提醒。
myListener.setNotifyLocation(40.0f, 116.0f, 3000, mLocationClient.getLocOption().getCoorType());
//设置位置提醒,四个参数分别是:纬度,经度,距离范围,坐标系类型(gcj02,gps,bd09,bd09ll)

4.7.4 启动定位

启动定位,SDK便会自动开启位置消息提醒的监听。
调用LocationClient的start()方法,启动定位。核心代码如下:
mLocationClient.start();
//mLocationClient为第二步初始化过的LocationClient对象
//调用LocationClient的start()方法,开启定位

4.7.5 撤消监听

调用BDNotifyListener的removeNotifyEvent方法,实现取消位置监听。核心代码如下:
myListener.removeNotifyEvent(myListener);
//myListener为第二步中定义过的BDNotifyListener对象
//调用执行removeNotifyEvent方法,即可实现取消监听

5. 刑释财富

mLocationClient.unregisterListener(myLocationListener); //注销掉监听
mLocationClient.stop(); //停止定位

正文主要做于收罗收拾笔记使用,关于小说的源码,请移步我的GitHub

编辑:操作系统 本文来源:澳门新濠3559定位精度高、覆盖率广、网络定位请

关键词: