Google maps 谷歌地图。在地图上追踪历史。由于坐标错误,路线不正确

Google maps 谷歌地图。在地图上追踪历史。由于坐标错误,路线不正确,google-maps,google-maps-api-3,google-directions-api,Google Maps,Google Maps Api 3,Google Directions Api,我的应用程序在谷歌地图上显示车辆的跟踪历史。我们每2分钟从移动应用程序接收一次位置信息,并将其存储在DB中。之后,我们在地图上显示路线(使用JSAPI、方向服务) { origin: 'Chicago, IL', destination: 'Los Angeles, CA', waypoints: [ ... ], provideRouteAlternatives: false, travelMode: 'DRIVING', unitSystem: go

我的应用程序在谷歌地图上显示车辆的跟踪历史。我们每2分钟从移动应用程序接收一次位置信息,并将其存储在DB中。之后,我们在地图上显示路线(使用JSAPI、方向服务)

{
  origin: 'Chicago, IL',
  destination: 'Los Angeles, CA',
  waypoints: [
    ...
     ],
  provideRouteAlternatives: false,
  travelMode: 'DRIVING',
  unitSystem: google.maps.UnitSystem.IMPERIAL
}
然而,有时位置可能仅在3-5米范围内不准确。例如,一些位置可以显示在迎面而来的交通线上。因此,谷歌在几个街区周围创建了路线等。

所以问题是:有没有可能忽略这些不准确的点,只是“强迫”谷歌在一个方向上创建路线


谢谢

我有个主意。它看起来很有效,至少对于我在类似情况下选择的航路点是如此

我将支腿(=航路点之间的航路段)放在for循环中。对于每个区段,我计算/读取“沿路线的距离”,并将其除以flightpath距离。这个比率应该在1左右。如果它远远大于1,则表示有问题。我将阈值设置为2.0,您可能应该将其降低(guestimate一个介于1和2之间的值)

当找到这样一个因素时,我移除该航路点(好吧,我制作了一个新的数组“newWaypoints”,没有这个项目),然后重新开始,在2秒设置超时后,这会生成一条红色路线

函数是递归的,我不知道应该删除的多个点会发生什么。也许它会再试不止一次

<style>
  #map {height: 400px;}
</style>
<div id="map"></div>
<div id="log"></div>
<input type="button" value="click" onclick="calc()">
<script>
var directionsDisplay;
var directionsService;
var map;
var maxFactor = 2.0;    // FEEL FREE TO GUESTIMATE ANOTHER VALUE
function initMap() {
  var start = new google.maps.LatLng(50.96622130043278,3.8518730520809185);
  var mapOptions = {
    zoom:7,
    center: start
  }
  map = new google.maps.Map(document.getElementById('map'), mapOptions);
  directionsService = new google.maps.DirectionsService();
}
function calcRoute(start, end, waypoints, color) {
  directionsDisplay = new google.maps.DirectionsRenderer({ map: map, polylineOptions: {strokeColor: color} });
  var request = {
    origin: start,
    destination: end,
    waypoints: waypoints,
    provideRouteAlternatives: false,
    travelMode: 'DRIVING',
    unitSystem: google.maps.UnitSystem.IMPERIAL
  };
  directionsService.route(request, function(result, status) {
    if (status == 'OK') {
      var newWaypoints = [];

      directionsDisplay.setDirections(result);
      var legs = result.routes[0].legs;
      var problemIndex = -1;
      for(var i in legs) {
        var routeSegment = legs[i].distance.value;
        var origin = legs[i].start_location;
        var destination = legs[i].end_location;
        var flightpathDistance = google.maps.geometry.spherical.computeDistanceBetween(origin, destination);
        var factor = (routeSegment / flightpathDistance);
        if(factor > maxFactor && problemIndex == -1) {
          // too long
          problemIndex = i;
          document.getElementById('log').innerHTML += 'factor ' + factor.toFixed(2) + ' - segment looks too long. romove waypoint ' + i + ' (0 based)<br/>'; 
        }
        else if(factor > maxFactor && problemIndex == i -1) {
          if(i<legs.length - 1) {  // skip the destination; this is not a waypoint
            newWaypoints.push(waypoints[i]);
          }
          document.getElementById('log').innerHTML += 'factor ' + factor.toFixed(2) + ' - segment also too long, but the problem is probably the previous segment<br/>'; 
        }
        else {
          if(i<legs.length - 1) {  // skip the destination; this is not a waypoint
            newWaypoints.push(waypoints[i]);
          }
          document.getElementById('log').innerHTML += 'factor ' + factor.toFixed(2) + '<br/>';
        }
      }
      document.getElementById('log').innerHTML += '<hr/>';
      if(problemIndex > -1) {
        setTimeout(function() {
          calcRoute(start, end, newWaypoints, 'red');
        }, 2000);

      }
    }
  });      
}
function calc() {
  calcRoute(
    '50.95487921891042,3.879781222422025', 
    '51.002379049703315,3.757394492495223',
    [
      {location: '50.96622130043278,3.8518730520809185', stopover: true},
      {location: '50.9725522849737,3.8379914402503345', stopover: true},
      {location: '50.97957292616706,3.8236401199901593', stopover: true},  // This is the problem point, on the opposite side of the road
      {location: '50.98570531465853,3.81125807762146', stopover: true},
      {location: '50.98941308813775,3.8019619700935436', stopover: true}
    ],
    "blue"
  );
}
</script>
<script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap&libraries=geometry"></script>

#地图{高度:400px;}
var方向显示;
var定向服务;
var映射;
var maxFactor=2.0;//请随意估算另一个值
函数initMap(){
var start=new google.maps.LatLng(50.96622130043278,3.8518730520809185);
变量映射选项={
缩放:7,
中心:开始
}
map=new google.maps.map(document.getElementById('map'),mapOptions);
directionsService=new google.maps.directionsService();
}
功能计算(开始、结束、航路点、颜色){
directionsDisplay=new google.maps.DirectionsRenderer({map:map,polylineOptions:{strokeColor:color}});
var请求={
来源:start,
目的地:完,
航路点:航路点,
ProviderRouteAlternatives:false,
travelMode:‘驾驶’,
unitSystem:google.maps.unitSystem.IMPERIAL
};
路由(请求、功能(结果、状态){
如果(状态=‘正常’){
var newWaypoints=[];
方向显示。设置方向(结果);
var legs=result.routes[0]。legs;
var problemIndex=-1;
用于(腿部中的var i){
var routeSegment=legs[i].distance.value;
var origin=legs[i]。开始位置;
var destination=legs[i]。结束位置;
var flightpathDistance=google.maps.geometry.spheremic.ComputedDistanceBeween(起点、终点);
var系数=(路由分段/飞行路径距离);
if(factor>maxFactor&&problemIndex==-1){
//太久
problemIndex=i;
document.getElementById('log').innerHTML+='factor'+factor.toFixed(2)+'-段看起来太长。romove航路点'+i+'(基于0)
; } else if(factor>maxFactor&&problemIndex==i-1){ if(i-1){ setTimeout(函数(){ calcRoute(起点、终点、新航路点,“红色”); }, 2000); } } }); } 函数计算(){ 卡尔克劳特( '50.95487921891042,3.879781222422025', '51.002379049703315,3.757394492495223', [ {地点:'50.96622130043278,3.8518730520809185',中途停留:true}, {地点:'50.9725522849737,3.8379914402503345',中途停留:true}, {地点:'50.97957292616706,3.823640119901593',中途停留:true},//这是问题点,在道路的另一侧 {地点:'50.98570531465853,3.81125807762146',中途停留:true}, {地点:'50.98941308813775,3.8019619700935436',中途停留:true} ], “蓝色” ); }
据我所知,只有在“不正确”的支腿形成“圆”的情况下,它才有帮助。但是,如果根据“因子”错误的支腿看起来正常,但方向不正确,情况会怎样?您尝试过吗?您能给出一组坐标来说明问题(不是大的循环,而是一个更微妙的错误);因此我有一些目标。我会看看是否能想出一种更好的技术。我没有尝试过。我担心它会过滤很多有用的点。例如:我认为对于资产跟踪目的,API可能比Directions API更合适。然而,Roads API中使用的捕捉算法假设GPS点非常接近(小于400米)。间隔2分钟,我担心点会稀疏,插值算法不会很好地工作。似乎应该会有帮助。我会尝试。据我所知,除了方向API之外,我还可以使用此API。因此,我可以使用道路API“更正”点,并使用方向API绘制路线。没有帮助:(似乎它只适用于点之间距离太近的情况。在我的情况下,两点之间可能有2-10英里。