有的项目比如专车、城际车、代驾、顺风车等网约车行业,需要做车辆轨迹回放,这里给大家分享一下如何用腾讯位置服务API完成车辆轨迹回放的,并且在车辆轨迹回放中模拟了真实的速度和方向。
提前要说的几点:
1、首先因为是Web网页端的功能,所以需要用到的是地图模块的API,可以选择百度地图或者腾讯地图。
2、由于需要位置信息,所以地图需要支持点到点的路线绘制功能。
3、关键点:需要一个小车,并且小车是可以根据不同的方向而改变车头朝向。
因为前两点功能百度地图API可以满足,但是第三点,腾讯地图LBS,更新了新版本的接口,图标可以自动根据方向改变朝向。所以选择腾讯地址,减少开放量,另外就是直接API支持,减少了很多的BUG。
1、在腾讯位置服务中注册为开发者:
2、在控制台配置Key
配置完成之后,就可以通过开发文档-web前端-JavaScript-API来获取腾讯位置服务的LBS组件
第一步:画页面,初始化地图:
把key中的XXXXXXXXXXX更换为我们刚才在腾讯地图LBS后台获取的key。
效果如图所示:
第二步:画路线,并根据路线模拟运行
这里需要注意的是,如果路线比较复杂,尽可能的使用分钟级,甚至秒级的坐标,这样绘制的轨迹也会更精准。速度的展示,需要后台在记录坐标的时候计算好,并实时反馈。
另外需要后台配合的是:
1、把汽车的轨迹坐标,按照秒级/分钟级记录,同时记录下轨迹记录的时间。
2、把坐标绘制成轨迹,而不是仅仅设置起点和终点。
3、轨迹与轨迹之间用地图计算出来距离,然后除以时间计算出来速度。前端地图实时更新 markermoveAlong中的car的速度。来达到轨迹回放跟实际车辆运行速度一致的目的。
总结:
使用腾讯位置服务API,是目前最简单的可以花轨迹+Mark图标跟随轨迹移动+Mark图标可以自适应转向的实现。
在百度地图的右上角,点击“地图API”。
在地图API页面,把鼠标移动到“工具”菜单项,在下拉菜单中选择“坐标拾取工具”。
比如在搜索栏输入“百度大厦”点击搜索,就会在地图上出现相应的标记,点击你要找的某一个,就能看到相应的坐标。
同理,把找到的坐标输入到搜索栏,把后面“坐标反查”给勾上,点击搜索,就会对应的坐标打上标记,同时会有相应地址在最右边。
同时,把鼠标在地图上滑行,就可以看到,鼠标滑到每一个地方,都会对应显示坐标。
把inc文件夹拖入到项目中去,引入了头文件,然后如果用真机就把Release-iphoneos里面的a文件拖拽到项目中去,最后别忘了拖入mapapibundle文件,路线节点和图钉的来源于素材包。
此外还要引入CoreLocationframework和QuartzCoreframework,这样引入工作就大功告成,但是要注意一点 很重要的,静态库中采用ObjectC++实现,因此需要保证工程中至少有一个mm后缀的源文件(您可以将任意一个m后缀的文件改名为mm),或者 在工程属性中指定编译方式,即将XCode的Project -> Edit Active Target -> Build -> GCC42 – Language -> Compile Sources As设置为”Objective-C++”。
经过实践,我推荐不这么干,默认是根据文件类型来选择编译的方式,文件要是m就用Objective-C,要是mm就是Objective- C++,手动改变会让整个项目都用一种编译方式,很容易出错或者不兼容,比如NavigationItem实例化的时候就会出错,既然百度地图如此特立独 行,那么最好的方式就是把地图相关的类改为mm,其他的依旧,这样只有这个类会用Objective-C++编译方式。
如何显示地图并定位
要让车发动起来先得有引擎,所以在项目的根delegate类里就要通过BMKMapManager这个类来实现地图引擎的启动,具体代码:
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions
{
// 要使用百度地图,请先启动BaiduMapManager
_mapManager = [[BMKMapManager alloc]init];
// 如果要关注网络及授权验证事件,请设定generalDelegate参数
BOOL ret = [_mapManager start:@"C5DCEBF3F591FCB69EE0A0B9B1BB4C948C3FA3CC" generalDelegate:nil];
if (!ret) {
NSLog(@”manager start failed!”);
}
selfwindow = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch
selfviewController = [[[ViewController alloc] initWithNibName:@”ViewController” bundle:nil] autorelease];
selfwindowrootViewController = selfviewController;
[selfwindow makeKeyAndVisible];
return YES;
}
接下来要做的就是添加地图视图,在需要地图的类头文件里添加如下代码(这个类应该是mm文件):
#import <UIKit/UIKith>
#import “BMapKith”
@interface testViewController : UIViewController<BMKMapViewDelegate,BMKSearchDelegate>//两个协议要引入
{
BMKSearch _search;//搜索要用到的
BMKMapView mapView;//地图视图
IBOutlet UITextField fromeText;
NSString cityStr;
NSString cityName;
CLLocationCoordinate2D startPt;
float localLatitude;
float localLongitude;
BOOL localJudge;
NSMutableArray pathArray;
}
@end
一些成员后面要用到先不提,这里只是实现地图的显示和定位,然后在mm文件里,在@implementation testViewController的前面添加这些代码
#import “testViewControllerh”
#define MYBUNDLE_NAME @ “mapapibundle”
#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]
BOOL isRetina = FALSE;
@interface RouteAnnotation : BMKPointAnnotation
{
int _type; ///<0:起点 1:终点 2:公交 3:地铁 4:驾乘
int _degree;
}
@property (nonatomic) int type;
@property (nonatomic) int degree;
@end
@implementation RouteAnnotation
@synthesize type = _type;
@synthesize degree = _degree;
@end
@interface UIImage(InternalMethod)
- (UIImage)imageRotatedByDegrees:(CGFloat)degrees;
@end
@implementation UIImage(InternalMethod)
- (UIImage)imageRotatedByDegrees:(CGFloat)degrees
{
CGSize rotatedSize = selfsize;
if (isRetina) {
rotatedSizewidth = 2;
rotatedSizeheight = 2;
}
UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(bitmap, rotatedSizewidth/2, rotatedSizeheight/2);
CGContextRotateCTM(bitmap, degrees M_PI / 180);
CGContextRotateCTM(bitmap, M_PI);
CGContextScaleCTM(bitmap, -10, 10);
CGContextDrawImage(bitmap, CGRectMake(-rotatedSizewidth/2, -rotatedSizeheight/2, rotatedSizewidth, rotatedSizeheight), selfCGImage);
UIImage newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
@end
有些代码对实现定位没有帮助,但是后面要用到,并且demo示例代码也是这么写的,所以引入了没有坏处,之后给这个类添加一个方法,获取资源用:
- (NSString)getMyBundlePath1:(NSString )filename
{
NSBundle libBundle = MYBUNDLE ;
if ( libBundle && filename ){
NSString s=[[libBundle resourcePath ] stringByAppendingPathComponent : filename];
NSLog ( @”%@” ,s);
return s;
}
return nil ;
}
下面才是真正添加地图的地方:
- (void)viewDidLoad
{
[super viewDidLoad];
mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 92, 320, 388)];
[selfview addSubview:mapView];
mapViewdelegate = self;
[mapView setShowsUserLocation:YES];//显示定位的蓝点儿
_search = [[BMKSearch alloc]init];//search类,搜索的时候会用到
_searchdelegate = self;
fromeTexttext=@”新中关”;
CGSize screenSize = [[UIScreen mainScreen] currentMode]size;
if ((fabs(screenSizewidth – 6400f) < 01)
&& (fabs(screenSizeheight – 9600f) < 01))
{
isRetina = TRUE;
}
pathArray=[[NSMutableArray array] retain]; //用来记录路线信息的,以后会用到
}
然后我在ib拖拽了几个按钮,功能显而易见,编译运行就应该成功了
腾讯地图是不能查询地点的经纬度的,这也是国家不允许的,你可以通过输入起始位置来查询去这个地点的路线信息,并进行全程的语音导航或者离线导航,还有就是通过腾讯地图的卫星模式或者街景模式来查看这个地点的周边环境,方便找到目的地。
以上就是关于对接腾讯地图API实现车辆轨迹回放全部的内容,包括:对接腾讯地图API实现车辆轨迹回放、腾讯地图我有坐标,如何获取是哪个城市,请高手指点、腾讯地图api android ios共用怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)