Можно ли получить из api яндекс карт точку пересечения границы страны?

Есть задача - рассчитать стоимость маршрута на автомобиле из точки A в точку B. Известно: Расход автомобиля, тип топлива, расстояние от точки A до точки B. Но проблема заключается, в том, что стоимость бензина например в России и условной Франции разная.


Ответы (1 шт):

Автор решения: YaCor'

Встроенного метода в API Яндекс.Карт для нахождения точки пересечения маршрутом границы нет. Самостоятельно это можно решить, либо проверив точки маршрута на вхождение в регион страны, либо прогнав точки через геокодер.

Первый вариант менее универсальный, поскольку модуль регионов содержит полигоны не слишком высокой точности. Да и не всем нужны лишние полигоны на карте.

Второй требует дополнительного решения задачи минимизации запросов к геокодеру, поскольку маршрут Минск-Новосибирск, например, состоит из более 40000 точек, а ограничения бесплатного использования, да и здравый смысл говорят, что так нехорошо. Его решение примерно такое:

  1. Строим маршрут и находим все точки его пути.
  2. Бьём число точек пополам и запрашиваем от геокодера код страны в этой точке.
  3. Сравниваем полученный от код с кодом стартовой точки
  4. Повторяем с пункта 2, пока длина отрезка не уменьшится до 1. Так можно сократить количество запросов к геокодеру до 10-15 на маршрут.

Получение точек в массив edge:

ymaps.route(["Минск", "Вильнюс"]).then( // строим маршрут для последующей обработки
    function (res) {
        myMap.setBounds(res.properties.get('boundedBy'))
        myMap.geoObjects.add(res);
        // Объединим в выборку все сегменты маршрута.
        var pathsObjects = ymaps.geoQuery(res.getPaths())
        // Переберем все сегменты и разобьем их на отрезки.
        pathsObjects.each(function (path) {
            var coordinates = path.geometry.getCoordinates();
            for (var i = 1, l = coordinates.length; i < l; i++) {
                edges.push(coordinates[i]);
            }
        });

Функция определения кода страны в точке:

            function getCode(coords,i) { // определение кода страны в точке
                ymaps.geocode(coords, {results: 1})
                .then(function (res) {
                    var firstGeoObject = res.geoObjects.get(0) // Выбираем первый результат геокодирования.
                        ccodeX = firstGeoObject.properties.get('metaDataProperty').GeocoderMetaData.Address.country_code; // код страны в точке
                        compareX(ccodeX)
                })
            }

Рабочий пример с точностью нахождения границы до одного элемента пути на jsfiddle: https://jsfiddle.net/Coroner1st/f48u1pxy/

→ Ссылка