介绍
本文将为您针对轨迹云服务整体流程,从轨迹采集、上报以及查询等环节结合腾讯位置服务产品为您进行讲解。
针对移动端开发场景,我们提供移动端轨迹SDK,您可以集成轨迹SDK进行轨迹上报和轨迹查询等,详情可跳转 Android轨迹 SDK、iOS轨迹 SDK 进行了解。
准备阶段
使用轨迹云服务,您需要在官网控制台创建key以及申请serviceid,具体可以参考轨迹云 - 使用三步走。
轨迹采集
请根据实际场景选择轨迹采集方式,可参考如下方式
(一) 移动端轨迹SDK(推荐)
移动端APP开发场景推荐您使用我们的轨迹SDK,支持轨迹采集、轨迹上报以及轨迹查询,详情可跳转 Android轨迹 SDK、iOS轨迹 SDK 进行了解。
(二) 定位SDK
移动端轨迹采集也可以使用移动端定位SDK,但定位SDK仅提供定位能力,轨迹点上报需通过轨迹云-轨迹上报接口实现,定位SDK接入方法可以参考定位SDK文档(Android 定位SDK、iOS 定位SDK)
定位SDK示例代码
Android 端
TencentLocationManager.setUserAgreePrivacy(true);
TencentLocationManager mLocationManager = TencentLocationManager.getInstance(this);
mLocationManager.setMockEnable(true);
TencentLocationRequest request = TencentLocationRequest
.create() // 创建定位请求
.setInterval(5000) // 设置定位周期
.setAllowGPS(true) // 设置是否允许使用GPS进行定位
.setAllowDirection(true); //设置是否允许使用设备传感器获取方向
mLocationManager.requestLocationUpdates(request, MainActivity.this, getMainLooper());
TencentLocationListener listener = new TencentLocationListener(){
@Override
public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {
double latitude = tencentLocation.getLatitude(); //纬度
double longitude = tencentLocation.getLongitude(); //经度
long time = tencentLocation.getTime(); //时间
float speed = tencentLocation.getSpeed(); //速度
double direction = tencentLocation.getBearing(); //方向,返回当前位置方向,非getDirection传感器方向
double altitude = tencentLocation.getAltitude(); //高度
float accuracy = tencentLocation.getAccuracy(); //定位精度
}
@Override
public void onStatusUpdate(String s, int i, String s1) {
}
};
iOS端
- (void)configLocationManager {
self.locationManager = [[TencentLBSLocationManager alloc] init];
[self.locationManager setDelegate:self];
[self.locationManager setApiKey:@"对应于申请的apiKey "];
[self.locationManager setPausesLocationUpdatesAutomatically:NO];
// 需要后台定位的话,可以设置此属性为YES。
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
// 如果需要POI信息的话,根据所需要的级别来设定,定位结果将会根据设定的POI级别来返回,如:
[self.locationManager setRequestLevel:TencentLBSRequestLevelName];
// 申请的定位权限,得和在info.list申请的权限对应才有效
CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
if (authorizationStatus == kCLAuthorizationStatusNotDetermined) {
[self.locationManager requestWhenInUseAuthorization];
}
}
// 连续定位
- (void)startSerialLocation {
//开始定位
[self.locationManager startUpdatingLocation];
}
- (void)tencentLBSLocationManager:(TencentLBSLocationManager *)manager
didUpdateLocation:(TencentLBSLocation *)location {
//定位结果
NSLog(@"location:%@", location.location);
}
(三) 第三方定位
如您使用的是第三方定位采集,需要确保采集轨迹的连续性、真实性,以及经纬度坐标系(坐标系需要为gcj-02,否则作用在腾讯地图上会有偏差)。
轨迹上报
定位获取到的定位信息,需要通过轨迹上传接口上报至服务端,具体可以参考轨迹云-轨迹上传文档。
轨迹查询/绘制
轨迹上报成功后,可以通过轨迹查询接口查询某时段内的轨迹记录,具体可以参考轨迹云-轨迹查询/优化文档,获取对应时段的轨迹经纬度信息实现绘制展示。
如下提供JS API轨迹绘制方式
路线绘制参考MultiPolyline
小车移动参考MultiMarker
展示效果
示例代码
var map;
function initMap() {
//初始化地图
map = new TMap.Map('mapContainer', {
center: new TMap.LatLng(39.980619,116.321277),
zoom:15 //缩放级别
});
var url="https://apis.map.qq.com/tracks/trace/search"; // 路径名
url+="?key=您的KEY"; // 开发KEY,请在官网控制台-应用管理中申请
url+="&service_id=您的服务ID"; // 服务id,请在官网控制台-轨迹云中申请
url+="&entity_id=您的终端ID"; // 终端id,终端id,终端创建接口创建
url+="&start_time=1653408000"; // 开始时间
url+="&end_time=1653494340"; // 结束时间
url+="&mode=driving"; // 轨迹模式
url+="&get_fields=1"; //返回全部字段
url+="&optimize=1"; // 优化轨迹
url+="&denoising=1"; // 去噪
url+="&snaptoroads=1"; // 绑路
url+="&supplement=1"; // 补偿轨迹
url+="&output=jsonp&callback=cb";
//发起JSONP请求,获取路线规划结果
jsonp_request(url);
}
function jsonp_request(url){
var script=document.createElement('script');
script.src=url;
document.body.appendChild(script);
}
//定义请求回调函数
function cb(ret){
//从结果中取出路线坐标串
var track = ret.result.track;
var polylines = [];
for(var i=0;i<track.length;i++){
var lat = track[i].lat;
console.log(lat)
var lng = track[i].lng;
polylines.push(new TMap.LatLng(lat, lng))
}
display_polyline(polylines)//显示路线,平滑移动
}
function display_polyline(pl){
map.setCenter(pl[0]) // 设置轨迹的第一个点为地图中心点
//创建 MultiPolyline显示折线
var polylineLayer = new TMap.MultiPolyline({
id: 'polyline-layer', //图层唯一标识
map: map,//绘制到目标地图
//折线样式定义
styles: {
'style_blue': new TMap.PolylineStyle({
'color': '#f00', //线填充色
'width': 8, //折线宽度
'lineCap': 'round', //线端头方式
'showArrow':true //显示箭头
})
},
//折线数据定义
geometries: [
{
'id': 'erasePath',//折线唯一标识,删除时使用
'styleId': 'style_blue',//绑定样式名
'paths': pl
}
]
});
var marker = new TMap.MultiMarker({
map,
styles: {
'car-down': new TMap.MarkerStyle({
width: 40,
height: 40,
anchor: {
x: 20,
y: 20,
},
faceTo: 'map',
rotate: 180,
src: 'https://mapapi.qq.com/web/lbs/javascriptGL/demo/img/car.png',
})
},
geometries: [
{
id: 'car',
styleId: 'car-down',
position: pl[0],
}
],
});
// 使用marker 移动接口, https://lbs.qq.com/webApi/javascriptGL/glDoc/glDocMarker
marker.moveAlong(
{
car: {
path:pl,
speed: 500,
},
},
{
autoRotation: true,
}
);
marker.on('moving', (e) => {
var passedLatLngs = e.car && e.car.passedLatLngs;
if (passedLatLngs) {
// 使用路线擦除接口 eraseTo, https://lbs.qq.com/webApi/javascriptGL/glDoc/glDocVector
polylineLayer.eraseTo(
'erasePath',
passedLatLngs.length - 1,
passedLatLngs[passedLatLngs.length - 1]
);
}
});
}
这篇文章对您解决问题是否有帮助?
已解决
未解决