0

У меня есть приложение, которое получает ограниченные данные о маршрутной точке, и хотя Google Maps Road Snapping делает замечательную работу по угадыванию правильных дорог на основе этих данных , Я все еще испытываю уровень неточности, который не будет работать для нашего приложения.API для Google Maps API v3 - Как повысить точность с ограниченными данными о путевых точках

Here's an example

В этом примере фиолетовые маркеры представляют в реальном мире «источник» путевые точки, которые посылаются в, в то время как синие маркеры показывают отрезали вэйпоинты данных, поступающие назад от Google на основе данных от источника путевые точки. Я использую привязанные синие путевые точки для генерации полилинии, чтобы показать маршрут (фиолетовая полилиния), к сожалению, привязанные путевые точки и последующий маршрут действительно должны больше напоминать красную полилинию.

Я проверил это вручную в онлайн-демонстрации API с аналогичными «исходными» путевыми точками, и маршрут все еще привязан к некорректному, поэтому я могу только предположить, что данных для Google недостаточно, чтобы точно установить , Вопрос в том, есть ли способ улучшить шансы правильной привязки, учитывая ограниченные данные, подобные этому? Есть ли способ, которым я мог бы интерполировать путевые точки с ограниченным исходным кодом, чтобы попытаться «направлять» Google, чтобы обеспечить более точную привязку?

Вот код похож на то, что я использую - JSFiddle is here

//setup vars 
var trip = [{ 
    "lat": -27.068, 
    "lng": 153.1483 
}, { 
    "lat": -27.0642, 
    "lng": 153.1546 
}, { 
    "lat": -27.0552, 
    "lng": 153.156 
}, { 
    "lat": -27.0518, 
    "lng": 153.1563 
}, { 
    "lat": -27.0503, 
    "lng": 153.1552 
}, { 
    "lat": -27.0457, 
    "lng": 153.1456 
}, { 
    "lat": -27.042, 
    "lng": 153.1463 
}, { 
    "lat": -27.0349, 
    "lng": 153.1476 
}]; 

var unsnappedWaypoints = []; 

var snappedWaypoints = []; 

var map = new google.maps.Map(document.getElementById('map'), { 
    zoom: 14, 
    center: { 
     lat: 0, 
     lng: 0 
    } 
}); 

var bounds = new google.maps.LatLngBounds(); 

//add each waypoint to an array of lat/lngs 
$.each(trip, function(key, waypoint) { 

    unsnappedWaypoints.push(waypoint.lat + ',' + waypoint.lng); 

    var marker = new google.maps.Marker({ 
     map: map, 
     icon: 'http://mt.google.com/vt/icon/name=icons/spotlight/spotlight-ad.png', 
     position: { 
      lat: waypoint.lat, 
      lng: waypoint.lng 
     } 
    }); 

}); 

//perform Google Maps API call with joined array for snapped results 
$.ajax({ 
    url: 'https://roads.googleapis.com/v1/snapToRoads?path=' + unsnappedWaypoints.join('|') + '&key=AIzaSyA1JWR3ohBFQ_P7F5eSMSJb0dwV9PbB3pA&interpolate=true', 
    crossDomain: true, 
    dataType: 'jsonp' 
}).done(function(response) { 

    //iterate through returned waypoints to create array of lat/lngs for polyline 
    $.each(response, function(key, snappedPoints) { 
     $.each(snappedPoints, function(key, snappedPoint) { 

      snappedWaypoints.push({ 
       lat: snappedPoint.location.latitude, 
       lng: snappedPoint.location.longitude 
      }); 

      //add snapped waypoints to map to show difference between originals and returned 
      var marker = new google.maps.Marker({ 
       map: map, 
       icon: 'http://mt.google.com/vt/icon?color=ff004C13&name=icons/spotlight/spotlight-waypoint-blue.png', 
       position: { 
        lat: snappedPoint.location.latitude, 
        lng: snappedPoint.location.longitude 
       } 
      }); 

      //increase the bounds to take into account waypoints 
      bounds.extend(new google.maps.LatLng(snappedPoint.location.latitude, snappedPoint.location.longitude)); 

     }); 
    }); 

    //create polyline from snapped waypoints 
    var tripRoute = new google.maps.Polyline({ 
     path: snappedWaypoints, 
     gseodesic: true, 
     strokeColor: '#663496', 
     strokeOpacity: 1.0, 
     strokeWeight: 2 
    }); 

    tripRoute.setMap(map); 

    //fit these bounds to the map 
    map.fitBounds(bounds); 

}); 
+0

Я думал об использовании API Directions в качестве альтернативы, но некоторые поездки будут иметь более 100 путевых точек, которые делают его довольно что невозможно, учитывая нынешний предел путевой точки. –

+0

Кажется, что API Roads работает неправильно в этой области. [Перекрестная проверка результата на DirectionsService показывает, что данные существуют в базе данных.] (Https://jsfiddle.net/geocodezip/w7Lnbbun/3/) – geocodezip

+0

Спасибо за проверку того, что @geocodezip - если это _is_ проблема API, стоит ли создавать проблему на странице поддержки API? Посмотрите, насколько хорошо работает ваша маршрутизация. Я использую службу направления, но я не знаю, насколько практично это возможно сделать 13 или 14 вызовов API для одной поездки с 100 путевыми точками. –

ответ

0
var ActualRoadpoints = routes[0].overview_path; 
var resolution=100;// This number you can change.But less the number add more points on road. 

getFineData(ActualRoadpoints, resolution).forEach(function (point) { 
var ActualRoadmarker = new google.maps.Marker({ 
           position: new google.maps.LatLng(point.lat(), point.lng()), 
           map: map, 
           // animation: google.maps.Animation.DROP, 
           visible: false 
          }); 
}); 

//This function call internally to find more points on route 
function getFineData(roughData, resolution) { 
       var fineData = []; 
       var latLngA; 
       var latLngB; 
       var steps; 
       var step; 
       for (var i = 1; i < roughData.length; i++) { 
        latLngA = roughData[i - 1]; 
        latLngB = roughData[i]; 
        distanceDiff = google.maps.geometry.spherical.computeDistanceBetween(latLngA, latLngB); 
        steps = Math.ceil(distanceDiff/resolution); 
        step = 1/steps; 
        previousInterpolatedLatLng = latLngA; 
        for (var j = 0; j < steps; j++) { 
         var interpolated = google.maps.geometry.spherical.interpolate(latLngA, latLngB, step * j); 
         fineData.push(interpolated) 
        } 
       } 
       // console.log(fineData.length) 
       return fineData; 
      } 

 Смежные вопросы

  • Нет связанных вопросов^_^