Можно ли получить из api яндекс карт точку пересечения границы страны?
Есть задача - рассчитать стоимость маршрута на автомобиле из точки A в точку B. Известно: Расход автомобиля, тип топлива, расстояние от точки A до точки B. Но проблема заключается, в том, что стоимость бензина например в России и условной Франции разная.
Ответы (1 шт):
Встроенного метода в API Яндекс.Карт для нахождения точки пересечения маршрутом границы нет. Самостоятельно это можно решить, либо проверив точки маршрута на вхождение в регион страны, либо прогнав точки через геокодер.
Первый вариант менее универсальный, поскольку модуль регионов содержит полигоны не слишком высокой точности. Да и не всем нужны лишние полигоны на карте.
Второй требует дополнительного решения задачи минимизации запросов к геокодеру, поскольку маршрут Минск-Новосибирск, например, состоит из более 40000 точек, а ограничения бесплатного использования, да и здравый смысл говорят, что так нехорошо. Его решение примерно такое:
- Строим маршрут и находим все точки его пути.
- Бьём число точек пополам и запрашиваем от геокодера код страны в этой точке.
- Сравниваем полученный от код с кодом стартовой точки
- Повторяем с пункта 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/