介绍

本文将为您针对轨迹云服务整体流程,从轨迹采集、上报以及查询等环节结合腾讯位置服务产品为您进行讲解。

针对移动端开发场景,我们提供移动端轨迹SDK,您可以集成轨迹SDK进行轨迹上报和轨迹查询等,详情可跳转 Android轨迹 SDKiOS轨迹 SDK 进行了解。


准备阶段

使用轨迹云服务,您需要在官网控制台创建key以及申请serviceid,具体可以参考轨迹云 - 使用三步走

轨迹采集

请根据实际场景选择轨迹采集方式,可参考如下方式

(一) 移动端轨迹SDK(推荐)
移动端APP开发场景推荐您使用我们的轨迹SDK,支持轨迹采集、轨迹上报以及轨迹查询,详情可跳转 Android轨迹 SDKiOS轨迹 SDK 进行了解。

(二) 定位SDK
移动端轨迹采集也可以使用移动端定位SDK,但定位SDK仅提供定位能力,轨迹点上报需通过轨迹云-轨迹上报接口实现,定位SDK接入方法可以参考定位SDK文档(Android 定位SDKiOS 定位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]
          );
        }
    });
}

这篇文章对您解决问题是否有帮助?

已解决
未解决