Подтвердить что ты не робот

Превышение 23 путевой точки на каждый запрос в API Google Directions (уровень бизнеса/работы)

Я хотел бы использовать API-интерфейс google для разработки программного обеспечения для планирования маршрутов для компании, которая занимается зимой снегоочистителями и озеленением летом. Одним из требований клиентов является то, что он сможет рассчитывать маршруты с не менее 30 (предпочтительно более) путевыми точками. Согласно документации (приведенной ниже), даже клиенты Google Maps API for Work ограничены только 23 путевыми точками на запрос.

Использование API Google Directions подлежит лимиту запросов в 2500 запросов на запросы в день. Запросы отдельных направлений могут содержать до 8 промежуточных точек в запросе. Клиенты Google Maps API for Work могут запрашивать до 100 000 запросов на запросы в день, причем в каждом запросе допускается до 23 путевых точек.

Кто-нибудь знает об обходном пути - вообще-то - обойти это?

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

Спасибо!! Марк

4b9b3361

Ответ 1

Вы правы, цена премьер-министра довольно дорога, начиная с 10 000 долларов, в последний раз я разговаривал с репутацией Google по телефону.

Я нашел обходное решение, которое я применил, чтобы обходить ограничение 8 путевых точек. Я смог заставить его работать.

Я сделал это, получив мои путевые точки и разбив их на разные маршруты, но объединив их как один и тот же маршрут.

Например, если было 30 необходимых точек, я бы нарисовал 4 строки, но с тем же цветом и т.д. Таким образом, вы в основном вырезали путевые точки на разные маршруты, каждый раз вызывая визуализаторы направлений, как если бы это был другой маршрут. Ключ после первого маршрута должен начинаться с последней путевой точки предыдущего маршрута (это гарантирует, что линии маршрута связаны друг с другом)

Это работает, но вам нужно написать намного больше кода, чем вы, если бы у вас была главная учетная запись, и вы в этом случае чаще набираете маршруты.

Я искал и думал о других способах сделать это, не имея главной учетной записи и потерпел неудачу.

Хотя, когда я разговаривал с Google, они говорили, что они намеревались создать многоуровневую структуру оплаты для клиентов с разными потребностями/потребностями. Например, если клиенту просто нужно больше пропусков, а не больше запросов направления.

Надеюсь, это поможет, поскольку это сработало для меня в практическом приложении.

Ответ 2

function initMap() {
    var service = new google.maps.DirectionsService;
    var map = new google.maps.Map(document.getElementById('map'));

    // list of points
    var stations = [
        {lat: 48.9812840, lng: 21.2171920, name: 'Station 1'},
        {lat: 48.9832841, lng: 21.2176398, name: 'Station 2'},
        {lat: 48.9856443, lng: 21.2209088, name: 'Station 3'},
        {lat: 48.9861461, lng: 21.2261563, name: 'Station 4'},
        {lat: 48.9874682, lng: 21.2294855, name: 'Station 5'},
        {lat: 48.9909244, lng: 21.2295512, name: 'Station 6'},
        {lat: 48.9928871, lng: 21.2292352, name: 'Station 7'},
        {lat: 48.9921334, lng: 21.2246742, name: 'Station 8'},
        {lat: 48.9943196, lng: 21.2234792, name: 'Station 9'},
        {lat: 48.9966345, lng: 21.2221262, name: 'Station 10'},
        {lat: 48.9981191, lng: 21.2271386, name: 'Station 11'},
        {lat: 49.0009168, lng: 21.2359527, name: 'Station 12'},
        {lat: 49.0017950, lng: 21.2392890, name: 'Station 13'},
        {lat: 48.9991912, lng: 21.2398272, name: 'Station 14'},
        {lat: 48.9959850, lng: 21.2418410, name: 'Station 15'},
        {lat: 48.9931772, lng: 21.2453901, name: 'Station 16'},
        {lat: 48.9963512, lng: 21.2525850, name: 'Station 17'},
        {lat: 48.9985134, lng: 21.2508423, name: 'Station 18'},
        {lat: 49.0085000, lng: 21.2508000, name: 'Station 19'},
        {lat: 49.0093000, lng: 21.2528000, name: 'Station 20'},
        {lat: 49.0103000, lng: 21.2560000, name: 'Station 21'},
        {lat: 49.0112000, lng: 21.2590000, name: 'Station 22'},
        {lat: 49.0124000, lng: 21.2620000, name: 'Station 23'},
        {lat: 49.0135000, lng: 21.2650000, name: 'Station 24'},
        {lat: 49.0149000, lng: 21.2680000, name: 'Station 25'},
        {lat: 49.0171000, lng: 21.2710000, name: 'Station 26'},
        {lat: 49.0198000, lng: 21.2740000, name: 'Station 27'},
        {lat: 49.0305000, lng: 21.3000000, name: 'Station 28'},
    ];
    
    // Zoom and center map automatically by stations (each station will be in visible map area)
    var lngs = stations.map(function(station) { return station.lng; });
    var lats = stations.map(function(station) { return station.lat; });
    map.fitBounds({
        west: Math.min.apply(null, lngs),
        east: Math.max.apply(null, lngs),
        north: Math.min.apply(null, lats),
        south: Math.max.apply(null, lats),
    });
    
    // Show stations on the map as markers
    for (var i = 0; i < stations.length; i++) {
        if (!stations[i].name)
            continue;
        new google.maps.Marker({
            position: stations[i],
            map: map,
            title: stations[i].name
        });
    }

    // Divide route to several parts because max stations limit is 25 (23 waypoints + 1 origin + 1 destination)
    for (var i = 0, parts = [], max = 8 - 1; i < stations.length; i = i + max)
        parts.push(stations.slice(i, i + max + 1));

    // Callback function to process service results
    var service_callback = function(response, status) {
        if (status != 'OK') {
            console.log('Directions request failed due to ' + status);
            return;
        }
        var renderer = new google.maps.DirectionsRenderer;
        renderer.setMap(map);
        renderer.setOptions({ suppressMarkers: true, preserveViewport: true });
        renderer.setDirections(response);
    };
        
    // Send requests to service to get route (for stations count <= 25 only one request will be sent)
    for (var i = 0; i < parts.length; i++) {
        // Waypoints does not include first station (origin) and last station (destination)
        var waypoints = [];
        for (var j = 1; j < parts[i].length - 1; j++)
            waypoints.push({location: parts[i][j], stopover: false});
        // Service options
        var service_options = {
            origin: parts[i][0],
            destination: parts[i][parts[i].length - 1],
            waypoints: waypoints,
            travelMode: 'WALKING'
        };
        // Send request
        service.route(service_options, service_callback);
    }
  }
html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
#map {
    height: 100%;     
    width: 100%;
    height: 100%;
}
<div id="map"></div>

<!-- without API KEY set variable "max" to 8 -->
<script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap"></script>

<!-- with API KEY set variable "max" to 25 -->
<!-- <script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap&key=YOUR_API_KEY"></script>-->

Ответ 4

Об этом решении легко найти.

Храните путевые точки в массиве на основе значения порога расстояния и продолжайте добавлять их. Как только вы достигнете предела в 8 значениях в массиве, присвойте 1-ю позицию (Origin) массива путевых точек новому массиву путевых точек... Назначьте последнюю путевую точку новой путевой точке в качестве второго элемента... теперь замените старый путевой массив с этим новым и продолжите.

Независимо от того, что вы делаете, путевые точки никогда не пересекут более 8 значений, и он будет отслеживать маршрут, принятый для его отображения (если поездка слишком длинная)

var addWaypoint = function(point) {
    if($scope.waypoints.length > 8){
        var temp = [];
        temp.push($scope.waypoints[0]); //Start Point
        temp.push($scope.waypoints[7]); //Last point
        temp.push(point); //New point
        $scope.waypoints = temp; //Replace the old object with this new one
    }
    else 
        $scope.waypoints.push(point);
}

Ответ 5

В приведенном ниже коде на С# вычисляется количество звонков, на которые вы будете вводить API Google Directions и сколько путевых точек на каждой итерации. Вы можете изменить Modmin, чтобы изменить минимальные путевые точки, которые вы хотите на своей последней итерации.

Например, если у вас есть totalWaypoints.Count = 97:

97 Mod 23 = 5, в этом случае я хочу, чтобы Modmin больше 5, поэтому я буду вычислять снова с более низкой путевой точкойByIteration;

97 Mod 22 = 9, (9 > Modmin), OK;

итерации = ((97 - (97% 22))/(22)) + 1 = 5;

На последних итерационных путевых точкахByIteration будет вычет.

        var iterations = 1;//Number of iterations
        var waypointsByIteration = 23;//Number of waypoints by iteration
        var modMin = 5;//Minimum of Waypoints in the last iteration
        var residue = 0;//Residue of the division (totalWaypoints % waypointsByIteration)

        if (totalWaypoints.Count <= waypointsByIteration)
        {
            waypointsByIteration = totalWaypoints.Count;
        }
        else
        {
            while (totalWaypoints.Count % waypointsByIteration < modMin)
            {
                waypointsByIteration--;
            }

            //Calculate number of waypoints by iteracoes
            iterations = ((totalWaypoints.Count - (totalWaypoints.Count % waypointsByIteration)) / (waypointsByIteration)) + 1;
        }

        residue = totalWaypoints % waypointsByIteration;

        for(i=0;i<iterations;i++)
        {
            //If it is the last index, the waypointsByIteration will be the residue
            if(i == iteration - 1)
            {
                waypointsByIteration = residue;
            }
        }