尾货通拒绝重新鉴定了自动定位地图找货功能,如何重新开起?

53807人阅读
android开发(45)
& & 转载请注明出处:
& & 前两篇关于百度地图的blog写的是,&和&。
& & 接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能。
& & 百度地图提供的关于地图的操作主要有:单击、双击、长按、缩放、旋转、俯视等。
& & 我们现在已经知道,想要显示一个地图,只需要在xml文件中添加一个MapView控件即可,但是想要对其进行一些控制,就需要通过这个控件返回一个BaiduMap对象。
从API中先看一下MapView的方法:
& & 对于MapView这个类,官方解释是一个显示地图的视图,负责从服务器端获取地图数据,并且会捕捉到屏幕触控手势事件。使用这个类必须按照它的生命周期进行操作,从上图可以看到,它包括一些类似于activity生命周期的方法:onResume()、onPause()、onDestory()。所以我们需要在activity的各个生命周期中,把MapView的各个生命周期函数添加进去。
& & 在使用地图控件之前必须调用SDKInitializer.initialize(Context)函数用以提供全局Context信息。
& & 默认情况下,地图显示的时候会带着原生的缩放控件:。还有比例尺控件:。
通过showZoomControls(boolean show)和showScaleControl(boolean show)这两个方法可以设置显示或者不显示两个控件。还可以通过设置setxxxPosition(Point p)方法来设置控件的位置。
mapView.showZoomControls(false);// 不显示默认的缩放控件
mapView.showScaleControl(false);// 不显示默认比例尺控件& & 要想实现地图的一些控制,就需要使用到BaiduMap,这个类是专门用来操作地图控件的。
& & 上面的四个接口就是用来对地图添加相应的事件的。我们主要看一下下面的两个方法,它们都是以动画的方式更新地图状态。不同的是一个可以指定时长,另一个有默认的动画耗时。
& & 参数MapStatusUpdate描述的是地图状态将要发生的变化。也就是说,要想改变地图的某些状态,需要构造出一个MapStatusUpdate对象,然后使用animateMapStatus()方法来更新地图状态。但是并没有在API中找到它的相关的构造方法。但是在com.baidu.mapapi.map包下面找到了对应的&工厂类&。
& & 打开MapStatusUpdateFactory可以看到很多静态的方法:
& & 通过这些静态的方法能够构造出各种类型的MapStatusUpdate对象。
& & zoomIn()和zoomOut()分别是放大和缩小地图,分别是在当前基础上增加或较少1个级别。zoomTo()可以自己设置某一个缩放级别。百度地图将地图的级别定义为【3~19】。
msu = msuFactory.zoomIn();
bdMap.animateMapStatus(msu);
msu = msuFactory.zoomOut();
bdMap.animateMapStatus(msu);
设置地图中心点:
msu = msuFactory.newLatLng(arg0);
bdMap.animateMapStatus(msu);
& & 其他的方法就不一一叙述了。
& & 关于地图控制状态的还有两个类:MapStatus和MapStatus.Builder。Builder是MapStatus的一个内部类,用于构造它,我们在API中可以看到MapStatus中是没有构造函数的。
& & 使用这两个类可以对地图进行旋转、俯视、设置中心点、设置缩放级别等操作。通过这些方法构造出MapStatus方法之后,怎么让BaiduMap调用它呢?
& & 查阅BaiduMap的所有方法之后也没有找到参数是MapStatus的方法。那么,猜想可能是通过把MapStatus转换成一个其他的对象,然后在由BaiduMap调用。而BaiduMap只有animateMapStatus()方法来更新地图状态。所以很定是MapStatus---&MapStatusUpdate。在MSU的工厂类中有这样一个方法:newMapStatus(MapStatus
mapStatus)。OK,通过这个方法,可以把构造的MapStatus对象转成MapStatusUpdate,然后在通过animateMapStatus()调用就行了。
mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).rotate(rotateAngle += 30).build();
msu = msuFactory.newMapStatus(mapStatus);
bdMap.animateMapStatus(msu);
俯视(-45°~0):
mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).overlook(overlookAngle -= 10).build();
msu = msuFactory.newMapStatus(mapStatus);
bdMap.animateMapStatus(msu);& & 这里,lz有一个疑问:MapStaus.Builder中有一个设置地图中心点的方法:
,在MapStatusUpdateFactory中也有一个设置中心点的方法:。连个都是设置中心点,不知道区别是什么?希望知道的给我留个言,告知一下!!谢谢!~~
& & 在BaiduMap中有一个截屏的回调接口和一个截图的请求方法:
很明显,调用这个截图请求方法,参数是上面的回调接口。在回调接口中只有一个方法:onSnapshotReady(Bitmap snapshot)。我们得到这个bitmap之后,就可以生成图片保存起来了。
& & 有Bitmap转成图片就需要用到press()方法:
bdMap.snapshot(new SnapshotReadyCallback() {
public void onSnapshotReady(Bitmap bitmap) {
File file = new File(&/mnt/sdcard/test.png&);
FileOutputS
out = new FileOutputStream(file);
if (press(
pressFormat.PNG, 100, out)) {
out.flush();
out.close();
Toast.makeText(MapControllActivity.this,
&屏幕截图成功,图片存在: & + file.toString(),
Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
& & LZ采用的是百度最新版本,该版本支持全球定位。
& & 开发定位功能一般都是按照以下步骤:
1. 导入库文件。
& & 下载下来lib压缩包之后,会看到很多文件夹(对应很多架构),官方建议全部拷贝到lib下,这样程序兼容性大大提升,不要忘了把locSDK_5.0.jar拷贝到lib下。
2. 添加定位service
android:name=&com.baidu.location.f&
android:enabled=&true&
android:process=&:remote& &
&/service&3. 添加权限
&!-- 这个权限用于进行网络定位 --&
&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&4. 编写定位程序
& & 这一步才是重点。百度地图可以使用GPS和网络定位(WIFI和基站)进行定位。基本定位功能还支持定位结果的反地理编码功能,离线定位,位置提醒功能和地理围栏功能。
& & 主要会用到LocationClient、BDLocationListener、BDNotifyListener、LocationClientOption等类。
& & (1)初始化LocationClient类:
& & LocationClient类是定位SDK的核心类,必须在主线程中声明。需要传入一个Context类型的参数,推荐使用getApplicationContext()来获取全局进程有效的context。
& & 主要会用到该类中的以下几个方法:
& &(2)设置定位参数:
& & 主要的参数有:定位模式、返回坐标类型、是否打开GPS等。
定位模式分为三种:
1. 高精度定位模式:同时使用网络定位和GPS定位,优先返回最高精度的定位结果。
2. 低功耗定位模式:不使用GPS,只使用网络定位(WiFi和基站)。
3. 仅用设备定位模式: 不适用网络定位,只使用GPS进行定位。但是此模式下不支持室内环境的定位。
& & 在API中主要关注“setxxx”类型的函数。主要用到红色框标注的方法。
LocationClientOption locOption = new LocationClientOption();
locOption.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
locOption.setCoorType(&bd09ll&);// 设置定位结果类型
locOption.setScanSpan(5000);// 设置发起定位请求的间隔时间,ms
locOption.setIsNeedAddress(true);// 返回的定位结果包含地址信息
locOption.setNeedDeviceDirect(true);// 设置返回结果包含手机的方向
locationClient.setLocOption(locOption);& & 坐标类型分为三种:国测局经纬度坐标系(gcj02),百度墨卡托坐标系(bd09),百度经纬度坐标系(bd09ll)。
& & 设置请求定位时间间隔:
& & 设置返回结果包含地址信息:
& & 设置返回结果中包含手机方向:
& & (3)设置定位监听函数
locationClient.registerLocationListener(locationListener);
class MyLocationListener implements BDLocationListener {
// 异步返回的定位结果
public void onReceiveLocation(BDLocation location) {
}& & 百度官网说明有一些是不准确的。实现BDLocationListener接口的时候,在之前的版本是有两个方法需要实现,新版本(5.0)的只有一个方法需要实现:onReceiveLocation()。BDLocation类封装了定位SDK的定位结果,通过该可以获取定位返回的结果、位置坐标、精度半径等信息。
& & 定位成功与否,定位的错误码都是通过getLocType()这个方法得到的,返回值是int类型。
& & 注意:只有在使用网络定位的情况下,才能获取当前位置的反地理编码。
} else if (locType == BDLocation.TypeNetWorkLocation) {
addrStr = location.getAddrStr();// 获取反地理编码(文字描述的地址)
Toast.makeText(LocationActivity.this, addrStr,
Toast.LENGTH_SHORT).show();
}& & (4)添加位置提醒监听函数
notifyListener = new MyNotifyListener();
notifyListener.SetNotifyLocation(longitude, latitude, 3000, &bd09ll&);//精度,维度,范围,坐标类型
locationClient.registerNotify(notifyListener);
* 位置提醒监听器
* @author ys
class MyNotifyListener extends BDNotifyListener {
public void onNotify(BDLocation bdLocation, float distance) {
super.onNotify(bdLocation, distance);
mVibrator.vibrate(1000);//振动提醒已到设定位置附近
Toast.makeText(LocationActivity.this, &震动提醒&, Toast.LENGTH_SHORT).show();
}& & (5)开启定位
& & LocationClient的start()方法用来启动定位SDK,requestLocation()方法用来请求一次定位,请求过程是异步的。调用start()方法之后,会根据你设置的定位事件间隔来请求定位。
& & (6)最后不要忘了在不用的时候注销定位监听和位置提醒监听,并且关闭地图。
protected void onDestroy() {
super.onDestroy();
mapview.onDestroy();
locationClient.unRegisterLocationListener(locationListener);
//取消位置提醒
locationClient.removeNotifyEvent(notifyListener);
locationClient.stop();
}& & 此时可以完成了一个基本的地图定位功能和位置提醒。如果要显示在地图上,就想百度那样出现一个点表示地图的定位点,就需要用到MyLocationConfiguration(配置定位图层显示方式)和MylocationData(定位数据)。
& & MyLocationData包含一个内部了Builder用于构建MyLocationData对象:
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(radius)//
.direction(direction)// 方向
.latitude(latitude)//
.longitude(longitude)//
// 设置定位数据
bdMap.setMyLocationData(locData);& & 通过定位的onReceiveLocation()方法可以得到定位的经纬度,然后可以通过animationMapStatus()方法把定位到的点移动到地图中心。
LatLng ll = new LatLng(latitude, longitude);
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);
bdMap.animateMapStatus(msu);& & 定位图层的显示方式有三种:普通、跟随、罗盘,在MyLocationConfiguration.LocationMode这个内部类中定义为枚举常量。
& & 我们来看一下MyLocationConfiguration的构造函数:
& & 第一个参数就是图层的显示方式(LocationMode类型),第二个参数表示是否显示方向信息(booleab类型),第三个参数是(bitmapDescriptor类型,我们在前面的blog有过介绍了)。构造出这个对象之后,就可以调用BaiduMap的setMyLocationConfigeration()方法来设置定位图层配置信息了。
switch (currentMode) {
case NORMAL:
locateBtn.setText(&跟随&);
currentMode = MyLocationConfiguration.LocationMode.FOLLOWING;
case FOLLOWING:
locateBtn.setText(&罗盘&);
currentMode = PASS;
case COMPASS:
locateBtn.setText(&普通&);
currentMode = MyLocationConfiguration.LocationMode.NORMAL;
bdMap.setMyLocationConfigeration(new MyLocationConfiguration(
currentMode, true, currentMarker));
& & OK,本篇blog主要讲解了地图的控制(缩放、旋转、俯视等)和定位功能,其中定位方面比较复杂一些。
lz也是自己一个人研究,未免有遗漏或者错误之处,希望大家指出,谢谢!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:839368次
积分:6696
积分:6696
排名:第2833名
原创:113篇
评论:658条
新浪微博:
微信订阅号:
文章:20篇
阅读:82570
阅读:37585
阅读:266486
文章:29篇
阅读:544712
(1)(3)(1)(1)(2)(3)(2)(17)(1)(2)(3)(1)(1)(1)(2)(2)(2)(3)(6)(2)(1)(3)(1)(7)(7)(5)(9)(10)(9)(3)(2)(11)百度地图一打开就自动将中心点移动到定位位置
百度地图一打开,中心点定位在天安门,移动下地图,会移动到定位位置,显示出定位覆盖物,问题是如何在地图一打开就自动将中心点移动到定位位置?我用的是v3.0.0,谢谢
LatLng center
MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLngZoom(center, 18); mBaiduMap.setMapStatus(mapStatus); 现在用的是这样的
--- 共有 1 条评论 ---
可能百度的API更新了吧
MapStatusUpdate mapStatus = MapStatusUpdateFactory.newLatLngZoom(center, 18);
mBaiduMap.setMapStatus(mapStatus);
现在用的是这样的
--- 共有 1 条评论 ---
这个说明文档在哪找到的,谢谢
解决办法:
//设定中心点坐标
LatLng cenpt =& new LatLng(30..07281);&
//定义地图状态
MapStatus mMapStatus = new MapStatus.Builder()
.target(cenpt)
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
--- 共有 1 条评论 ---
太感谢了。找了一晚上,3.0之前的版本要用MapController来改变视图的位置。但是现在不能用这个方法了,官方论坛上的傻逼回答让人醉了,官方demo也没有用到,还有谜一般的开发指南...
如果还有同学一出来就在天安门的位置,需要缩小再去找到定位,那这个方法绝对靠谱。点个赞!
请问楼主最终是怎么解决的?多谢!
GeoPoint point = new GeoPoint((int) (40.818* 1E6),(int) (111.697 * 1E6));
mMapController.setCenter(point); //设置地图中心点
--- 共有 1 条评论 ---
谢谢,不过v3.0.0没有MapController这个类怎么知道我在哪里 用Google地图开启“我的位置”自动定位就行
  Google地图已经开始支持HTML 5的新特性之一,地理位置信息识别API了。
  现在就打开Google地图(中英文均可),看到街景模式小人上面多了一个小按钮吧?快按它!
  FireFox 3.5会询问你是否允许该站点共享位置信息,赶快确定:
  Chrome与FireFox 3.5略有不同,是通过Google Gears来实现位置识别,而非Geolocation API:
  等待几秒种,按钮变蓝,你的位置就被找到了:
  &我的位置&启用后,地图会自动定位到你的位置的中心。很不幸的是Google将我定位在长安街上&&北京的默认中心,我估计因为我是小区宽带上网的问题吧?或者是我周围的WiFi热点太少了?
  谷奥的另外一位作者gkp试用后惊呼:Google把我的小区定位出来了!误差在500米之内。我想这是由于他是ADSL上网,所以通过IP可以判断出更详细的地区信息。
  不管你是Firefox 3.5(使用Geolocation API),还是Chrome(使用Gears),定位你的地址原理都是一样的:先寻找你的WiFi接入点和你周围的WiFi接入点来确定位置,如果你周围 没有WiFi而且你的电脑也是通过有线线路连接互联网的,那么就是通过IP确定位置了,这样可能就不如WiFi定位来的准。
  什么?你是IE用户?无视这篇文章吧,IE根本不打算支持HTML 5的。如果你是Opera用户,也还需要等待,Opera 10今后的更新才会支持。
  各位,你们的定位情况如何?来汇报一下吧!(如果你不明白Geo API是如何知道你的位置的,可以参考Firefox的帮助,中文)
  Update 1:我挂上SSH代理,定位到英国了就。
  Update 2:谷 奥另外一位作者gkp之所以能定位到他们小区可能跟他的G1开着网络定位服务有关,但我后来把G1的GPS和Latitude都打开了,依然只能模糊的定 位到北京市,看来目前Google Maps的&我的位置&服务还只是纯IP定位,没有跟Google账号的Latidute整合起来吧?
  Update 3:读者ray说IE8也支持&我的位置&服务,有图有真相,但是按照官方提供的资料看IE系是不支持的啊?读者mob_17也确认说IE8不支持。 本文网址 //22497.html
更多相关资讯
推荐 精华文章
声明:本站所有文章内容均由网友提供或转载于互联网,版权归为作者所有
若有文章侵犯了您的权益,请马上联系删除。
苏ICP备号-4}

我要回帖

更多关于 用户拒绝请求地理定位 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信