百度地图sdk android2.10版本,8系统用着比较卡

后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 16535|回复: 15
后台定位用系统定位可以无限后台运行用百度地图定位不行
最近的项目需要做无限后台运行,定位获取经纬度上传,先抛开几分钟调一次定位的问题不说.
使用百度定位,进入后台后,持续定位了16分钟就没动静了.
后来试着用系统的CLLocationManager来做后台定位,可以实现无限后台运行.
为何用百度的定位只能后台运行16分钟呢&&求解&&急
项目已在plist中将Required background modes注册为App registers for location updates
使用的百度地图版本为2.4.1, 另附上后台运行的代码.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 要使用百度地图,请先启动BaiduMapManager
_mapManager = [[BMKMapManager
alloc]init];
BOOL ret = [_mapManager
start:@&1wQrBGDMrc1LIyWEydFsrxpT&
generalDelegate:self];
if (!ret) {
NSLog(@&manager start failed!&);
//使用系统CLLocationManager定位
self.locationManager = [[CLLocationManager
alloc] init];& & [self.locationManager
setDelegate:self];
//Only applies when in foreground otherwise it is very significant changes
//要求的精确度& & [self.locationManager
setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
//使用百度定位
self.location = [[BMKLocationService
alloc] init];
self.location.delegate =
& & [self.window
addSubview:navigationController.view];& & [self.window
makeKeyAndVisible];
//- (void)applicationDidEnterBackground:(UIApplication *)application {//& & /*//& &&&Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.//& &&&If your application supports background execution, called instead of applicationWillTerminate: when the user quits.//& &&&*///& & [navigationController viewWillDisappear:NO];//& & //& & NSLog(@&888&);////& & [self buildLocation];//& & //}
- (void)applicationDidEnterBackground:(UIApplication *)application{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
self.inBackground = YES;& & if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])& & { //Check if our iOS version supports multitasking I.E iOS 4
if ([[UIDevice
currentDevice] isMultitaskingSupported])& && &&&{ //Check if device supports mulitasking
UIApplication *application = [UIApplication
sharedApplication]; //Get the shared application instance
& && && && &__block UIBackgroundTaskIdentifier background_ //Create a task object
& && && && &background_task = [application beginBackgroundTaskWithExpirationHandler: ^{& && && && && & /*& && && && && &&&当应用程序后台停留的时间为0时,会执行下面的操作(应用程序后台停留的时间为600s,可以通过backgroundTimeRemaining查看)& && && && && &&&*/& && && && && & [application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks& && && && && & background_task = UIBackgroundTaskI //Set the task to be invalid
//System will be shutting down the app at any point in time now& && && && &}];
// Background tasks require you to use asyncrous tasks
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
& && && && && & while (self.inBackground) {& && && && && && &&&[self.location startUserLocationService];& && && && && && &&&[NSThread sleepForTimeInterval:(550)];& && && && && & }
//Perform your tasks that your application requires& && && && && & NSLog(@&time remain:%f&, application.backgroundTimeRemaining);& && && && && & [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform& && && && && & background_task = UIBackgroundTaskI //Invalidate the background_task& && && && &});& && &&&}& & }}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {& & CLLocationCoordinate2D currentCoordinates = newLocation.
NSLog(@&Entered new Location with the coordinates Latitude: %f Longitude: %f&, currentCoordinates.latitude, currentCoordinates.longitude);}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@&Unable to start location manager. Error:%@&, [error description]);
楼主,我用了你的方法.当真机连着Xcode时,可以无限后台。但是独自真机时没几分钟就挂掉了,我的手机是4s,7. ...
同求。。。。 呼叫楼主
是无限后台定位&&我今天不是更新了帖子吗? 就是进入后台时需要执行的代码&&你可以看看
没有百度地图的相关工作人员来帮忙解惑吗??
这是百度地图本身的bug还是本人代码中的缺陷??
你好 别的帖子给你反馈了&&谢谢
发现好久前的帖子没人回应, 项目做完了抽时间自己解答一下吧 修改了一下后台运行的代码 就可以了
- (void)applicationDidEnterBackground:(UIApplication *)application
& & [self backgroundHandler];
- (void)backgroundHandler {
& & self.loca.locationSpace = YES; //这个属性设置再后台定位的时间间隔 自己在定位类中加个定时器就行了
& & UIApplication * app = [UIApplication sharedApplication];
& & //声明一个任务标记 可在.h中声明为全局的&&__block& & UIBackgroundTaskIdentifier bgT
& & bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
& && &&&dispatch_async(dispatch_get_main_queue(), ^{
& && && && &if (bgTask != UIBackgroundTaskInvalid) {
& && && && && & bgTask = UIBackgroundTaskI
& && && && &}
& && &&&});
& & // 开始执行长时间后台执行的任务 项目中启动后定位就开始了 这里不需要再去执行定位 可根据自己的项目做执行任务调整
& & dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
& && &&&while (1) {
& && && && &NSLog(@&counter:%d&, counter++);
& && && && &sleep(1);
& &你好,请问你的项目是不是用到了后台无限定位啊?我看了下,好像最多10分钟左右,用户更新位置的代理代码就不走了
可以试试:
你这个是处理IOS8上百度地图无法定位的bug
这个只是非百度的解决方式, 还要用百度坐标转换呢
现在问题是百度本身的地图定位 api 里面无法做了, 除非推翻用原来的定位模式
& & 你好你是怎么解决呢?这是百度地图的事,还是?
发现好久前的帖子没人回应, 项目做完了抽时间自己解答一下吧 修改了一下后台运行的代码 就可以了
- (void) ...
楼主你好!我也遇到和你相同的问题,加了你的这段代码后还是过半个小时这样就不能定位了,我用的是百度地图最新的定位api,真机是ios8系统,plist文件也都配置了
发现好久前的帖子没人回应, 项目做完了抽时间自己解答一下吧 修改了一下后台运行的代码 就可以了
- (void) ...
楼主,求代码,我也在做后台定位,求代码参考
楼主,我用了你改后的代码!当真机连着Xcode运行时,可以无限后台,但是真机不连着Xcode运行时程序进入后台几分钟就挂了!求demo啊!QQ:
楼主,我用了你的方法.当真机连着Xcode时,可以无限后台。但是独自真机时没几分钟就挂掉了,我的手机是4s,7.1系统
楼主,求demo,急急急!谢谢!
Powered by百度地图SDK引用问题
Undefined symbols for
architecture armv7:
& "_OBJC_CLASS_$_BMKMapManager", referenced
objc-class-ref in AppDelegate.o
& "_OBJC_CLASS_$_BMKMapView", referenced
objc-class-ref in MapVC.o
& "_OBJC_CLASS_$_BMKSearch", referenced
objc-class-ref in MapVC.o
& "_OBJC_CLASS_$_BMKPointAnnotation", referenced
objc-class-ref in MapVC.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
百度地图SDK调用的时候出现问题,解决方法
1.没有按百度开发文档中的简介介绍解决问题
2.导入多个静态库文件
3.文件路径设置错误
在此位置将不需要的文件路径删除
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 8563|回复: 23
关于百度地图【极速版】显示大数据折线的问题
本帖最后由 配角不配 于
17:37 编辑
业务需求:根据校车定位设备上报的数据点,在微信端通过百度地图实时显示校车轨迹。
现在功能是做出来了。但是显示效果不好。当数据点超过1000个,页面变得相当卡顿。但业务需求是数据点达到万级。
有以下的一些问题:
1.百度地图极速版polyline方法的数据点的数量最大是多少?貌似API没找到说明。找论坛看到一个类似的问题,但那问题是安卓端百度地图开发的。
2.polyline方法的点数组必须是new BMap.Point()方法生成的对象数组吗?一万个点,就有new 了一万个Point()对象了。
3.既然是动态生成轨迹,那么肯定是setInterval根据设定时间间隔去访问服务器接口获取数据,得到数据之后把点描在地图上。貌似百度地图不能在原有折线末端再进行绘制,现在感觉最糟糕的方法就是先map.clearOverlays()清除地图上所有覆盖物,然后再重新画一遍覆盖物了。
结果如下:
百度地图极速版polyline在点数量达到一定程度会出现卡顿感,这个跟手机有关。在有多条折线的情况下(如上面的图片显示,数据断点的处理为多条折线显示),即new 多个polyline方法的情况下:
Iphone5s 2万个点,4个marker,拖动基本上没卡顿感
三星note2&&2万个点,4个marker,拖动的卡顿感还算可以接受
小米1S 2万个点,4个marker,拖动的卡顿感无法接受
var map = new BMap.Map(&allmap&);
&&var point = new BMap.Point(113..943495);
&&map.centerAndZoom(point, 15);
&&map.addControl(new BMap.ZoomControl()); //添加地图缩放控件
&&var start=&113..943495&
&&for(var i=0;i&4000;i++){
& & start+=(';'+(113..0001*i)+','+(22..0001*i))
&&var polyline = new BMap.Polyline(&113....943499&, {strokeColor:&blue&, strokeWeight:6, strokeOpacity:0.5});
&&map.addOverlay(polyline);
&&polyline.setPath(start);
依次生成00,6000,.....3万个点。小米1S机器测试下,发现polyline点数接近5000,地图开始出现不太明显的卡顿感,表现为拖动地图到未探索区域,未探索区域的加载时间更长,折线出现的时间更长,地图拖曳滑动的效果不正常。4500个点以下,地图可以轻松拖曳。基本无卡顿感。3万个点,拖动地图,加载未探索区域的时间更加长,明显的卡顿感,让人觉得地图假死状态。
解决办法:限制polyline显示的点数量,毕竟是手机,不能要求具有PC的性能,根据业务调整数据点数量,例如调整GPS定位设备的发送频率,增大发送时间间隔,找到一个合理的设备发送位置点时间,让位置尽量不失真,1分钟发送一个位置点的处理显然是有问题的,1分钟都可以车已经走了好远距离了。
后台处理部分,减少取点,取所有点,去除时间轴上相邻位置,点相同的数据点,例如等红绿灯过程中上传的点基本上是无用处的。限制地图中polyline所有点数量,多条折线的情况,加起来的点不能超过某个值,具体的值需要自行测试。我这边测试小米1S超过5000个点就开始有卡顿感。
1、可承载的点的数量,跟浏览器、是否使用marker、marker的复杂程度等都有关系。如果静静是polyline上点的个数,那1000肯定不会成为瓶颈
2&3、polyling的点也可以是string,且更新的时候不用clear,只需要调用setPaht即可。以下代码可以参考:
var start=&116.399,39.910&
&&for(var i=0;i&1000;i++){
& & start+=(';'+(116.399+Math.random()*i/2000)+','+(39.910+Math.random()*i/2000))
&&}
& & & & var polyline = new BMap.Polyline(&116.399,39.910;116.405,39.920;116.425,39.900&, {strokeColor:&blue&, strokeWeight:6, strokeOpacity:0.5});
& & & & map.addOverlay(polyline);
&&setTimeout(function(){polyline.setPath(start)},2000)复制代码
1、可承载的点的数量,跟浏览器、是否使用marker、marker的复杂程度等都有关系。如果静静是polyline上点的个 ...
好的,谢谢,我去试一下
1、可承载的点的数量,跟浏览器、是否使用marker、marker的复杂程度等都有关系。如果静静是polyline上点的个 ...
非常感谢百度工程师解答我的问题。
我刚刚刚试了一下,使用string类型可以,但是依旧没解决轨迹点多,地图无法拖动的问题,看了一下后台用于展示轨迹的数据点有3000多个,在微信端,地图卡到没法进行拖动操作。PC端没这类问题。毕竟PC比手机的性能要高好几倍。
以下附上业务图片:
当前只是显示了一台校车的轨迹,轨迹点大概有3000个左右,marker有4个,marker无绑定其他事件。地图显示的轨迹线断断续续的原因是考虑到GPS模块间歇工作不正常,例如通过隧道使用了5分钟,这5分钟内都没数据点,没可能把5分钟前最后的点跟5分钟后第一个点相连,于是后台对轨迹断点进行了断点处理。
QQ图片48.png (202.22 KB, 下载次数: 0)
23:19 上传
QQ图片03.png (138.03 KB, 下载次数: 0)
23:20 上传
地图卡顿到无法拖动。一旦不显示轨迹,只是显示4个marker的话,地图拖动则很顺畅
以下是前台JS处理折线的代码:
后台返回的数据是个三维数组,第一维是校车分组数据(同一时间地图内可能有多台校车),第二维是断点区间(根据设备发送频率对相邻数据进行断点,断点区间为设备发送位置时间 (单位为秒)* 2,即允许每个点之后有两个时间点出现无数据),第三维则是断点数据。所以才有下面的代码。我试过把红色区域的代码注释,即不生成折线对象,地图上不显示折线,地图拖动很顺畅。
QQ图片30.png (56.6 KB, 下载次数: 1)
23:32 上传
一旦生成折线,地图就卡顿得无法拖动了。所以才有本贴的开始的问题。我不知道是我处理数据的方法出了问题还是极速版对于折线的处理效率上不能满足当前业务需求。
PS:测试环境是小米1S手机,微信端下进行,使用百度地图极速版。
本帖最后由 开发工程师_01 于
13:27 编辑
非常感谢百度工程师解答我的问题。
我刚刚刚试了一下,使用string类型可以,但是依旧没解决轨迹点多,地 ...
如之前所说,移动端的性能跟手机配置有很大关系,我这边在iPhone 5s和5下测试了3000个点的polyline,拖动反应都很正常~
应该是您的测试机性能不佳导致卡顿。
本帖最后由 配角不配 于
13:51 编辑
如之前所说,移动端的性能跟手机配置有很大关系,我这边在iPhone 5s和5下测试了3000个点的polyline,拖动 ...
300个点的polyline应该还不足以影响页面拖动。
我这边测试3000个点,小米1S跟三星S3拖动页面时都很卡。当前业务只能以一般性能的手机进行测试。今天看了一下百度鹰眼平台,我这边要实现的功能就跟百度鹰眼那个出租车管理平台的例子()差不多了。不过我这边需要在微信端和PC端同时实现。业务功能基本实现了,就是当数据点超过一定数量,微信端的地图页面卡到没法使用,只能看,不能拖动,组长要求我查找原因,百度搜索关于极速版的帖子很少,所以想到来论坛请教。
审查代码发现当前端页面数据点达到一定数量级,譬如3000个,地图页面拖曳卡顿的问题主要是polyline方法造成。所以我不知道是不是我处理的方法有问题。所以想请教一下百度工程师这类的问题怎么处理。
如果真是百度地图极速版性能不佳或者是测试机性能不行,只能跟组长说明问题,要求微信端不显示轨迹,PC端菜显示轨迹算了。如果是我处理的方法有问题,可能是类的使用方法有误或者是数据处理方法有误,我这边就进行改进。
第一次接触百度地图方面的应用,希望百度工程师可以解答一下。谢谢
300个点的polyline应该还不足以影响页面拖动。
我这边测试3000个点,小米1S跟三星S3拖动页面时都很卡。当 ...
我这边测试的也是3000个点的polyline啊。
300个点的polyline应该还不足以影响页面拖动。
我这边测试3000个点,小米1S跟三星S3拖动页面时都很卡。当 ...
还是建议多换几个机器试试吧。
我这边测试的也是3000个点的polyline啊。
哦。我看错了以为你测试了300个点。不过有一个问题,随着polyline的点数量开始递增,地图的确有明显的卡顿感,但不至于影响使用。只是到达一定数量的点,地图卡到无法拖动,才注意到这个问题。毕竟是手机,不能要求他跟PC有一样的性能。
我在测试一下。测试完再回来反馈一下问题,让有类似问题的朋友可以找到相关的指引。
感谢工程师解答。
还是建议多换几个机器试试吧。
你好,我刚拿同事的5S试了一下,2万个点的polyline,iphone5s在微信端访问地图,拖曳还比较顺畅,不至于感觉到明显的卡顿感,但是自己的小米1S就卡得没法拖曳。三星NOTE2的卡顿尚算可以接受。
考虑到现在大部分用户的手机性能都不高,以自己的小米1S为测试机,在后台减少取数据点的方法来减轻卡顿感了
补充一点,我发现一定数量的点画折线,造成地图卡顿还与折线数量有关。
3000个点,只画一点折线,在小米1S手机访问,页面拖动没有明显的卡顿感,
如果3000个点,分成多段折线(例如我上面通过多段线段来反映GPS设备工作情况,理想情况下当然是一条折线就能显示,但是实际使用中,GPS设备经常会工作不正常,例如入隧道,在大树底下,天桥下面,GPS无法获得位置,那么当GPS设备无法获得位置这段时间内,车辆的轨迹应该是断开的),多段折线在地图上,页面拖动会出现明显的卡顿感。以至于,测试3万个点,一条折线的情况下,卡顿感比3万个点,多条折线的情况下要轻很多。
我觉得是new BMap.Polyline()这个方法比较耗资源导致的。希望懂这个朋友可以解答一下这个问题。
本帖最后由 配角不配 于
18:20 编辑
我这边测试的也是3000个点的polyline啊。
3000个点分多条折线,跟3000个点一条折线画完,效率相差很多。
如果3000个点分多条折线画,出来的结果是,地图拖动出现明显的卡顿感。随着点数增多,折线增多,地图的卡顿越来越强。
3000个点只画一条折线,地图拖动的卡顿感不太明显。
刚测试过,超过万级的数据点,在同样数量的情况下,分多条折线和单条折线,效率真的差天共地。
单条折线,不能反映GPS设备的实际工作情况。但是页面卡顿感不是十分明显,至少可以使用。
多条折线,接近GPS设备的实际工作情况,但是页面卡顿到无法使用。
不知道有没什么有效的方法解决这个问题。百度地图的API好像没提及这类的问题。
还是建议多换几个机器试试吧。
现在问题变成,百度地图极速版,多条折线卡顿了。
小米1S机器,测试过1条折线,3000个点拖动顺畅。分割成4条折线就开始明显的卡顿了。不知道有没办法解决这个问题。
现在问题变成,百度地图极速版,多条折线卡顿了。
小米1S机器,测试过1条折线,3000个点拖动顺畅。分割 ...
ok,这个我们再测一下。
ok,这个我们再测一下。
我测试过,小米1S手机,NOTE2的卡顿感比小米1S稍微轻点。苹果5S基本不卡顿,可能是苹果5S的硬件性能要高很多。
大概10条由2个点组成的折线,就开始感觉到卡顿。20个点基本上卡得没办法使用。
var start=&&;
& &for(k=0;k&=20;k++) {
& && &start = &113..943495&;
& && && &for(var i=0;i&2;i++){
& && && && &start+=(';'+(113.347557+Math.random()*i/2000)+','+(22.943495+Math.random()*i/2000));
& && && &}
& && &map.addOverlay(new BMap.Polyline(start, {strokeColor:&blue&, strokeWeight:6, strokeOpacity:0.5}));
&&}复制代码
如果有新进展,请告诉我一下。谢谢^_^
我测试过,小米1S手机,NOTE2的卡顿感比小米1S稍微轻点。苹果5S基本不卡顿,可能是苹果5S的硬件性能要高 ...
问题已经定位,周一可以修复上线。
我测试过,小米1S手机,NOTE2的卡顿感比小米1S稍微轻点。苹果5S基本不卡顿,可能是苹果5S的硬件性能要高 ...
已经修复上线,麻烦再试试~
已经修复上线,麻烦再试试~
因为业务需求可能要画多条拆线, 怎么才能最高效的画
我前几天也遇到这个问题,不过是网页版的。后来解决办法是:var polyline = new BMap.Polyline(list_BMap_point, {strokeColor:&blue&, strokeWeight:1, strokeOpacity:0});
list_BMap_point是一个数组。
关于处理部分,减少取点,取所有点,去除相邻位置的数据点,& &相邻位置的数据点是如何判断的?
本帖最后由 配角不配 于
09:25 编辑
关于处理部分,减少取点,取所有点,去除相邻位置的数据点,& &相邻位置的数据点是如何判断的? ...
我给一段PHP代码你参考一下。其他语言也差不多。
QQ图片41.png (31.61 KB, 下载次数: 2)
09:15 上传
group_data是个二维数组,第一维是设备,第二纬是位置点.。
在第二维里面判断数组$goup_data[$key][$k - 1](上一个点)与$goup_data[$key][$k](当前的点)的位置点经度和纬度是否同时相同,相同的点就continue。
之前的写法是unset($group_data[$key][$k])而不是continue。但发现一个问题,超过两个点位置相同的,第三个点就不能比较了。因为第二个点被unset了。所以设置了一 个$tmp临时数组,存放新的点。
提供给楼主一个思路,楼主的卡顿主要是因为折线必须断开,导致必须用多个折线,这样就会导致在地图上添加多个图层导致卡顿(每添加一条折线就会在地图上添加一个图层),楼主可以用聚合来解决,就是只在地图添加一个图层,所有点线都在图层上完成,这样就不会卡,具体可参见百度api的mapv类
Powered by

我要回帖

更多关于 c 百度地图sdk 的文章

 

随机推荐