Yandex API Map - как проверить пересечение границ стран Polyline и расстояние в каждой стране
Есть две точки A и B, между ними строю Polyline и получаю расстояние с помощью ymaps.coordSystem.geo.getDistance(startPoint, endPoint); Далее получаю страну точки A и страну точки B через геокодирование. Если страны разные, то нужно получить длину polyline в каждой стране. Есть идеи, как это можно сделать? Может как то можно точку на пересечении границ ставить?
Ответы (2 шт):
Прямо так, чтобы в лоб решения не вижу. Но алгоритм можно построить на базе примера из песочницы Яндекса: Пересечение маршрута с многоугольником на примере МКАД
Что изменить:
- Загрузить в скрипт полигон страны из которой строится маршрут и получить его координаты вместо московского полигона в примере. У Яндекса есть возможность загружать Регионы. Правда получение их координат для своих целей недокументировано, но выцарапать при желании можно попробовать. Либо найти GeoJSON файлы на сторонних ресурсах. Можно и нарисовать этот полигон как в примере.
- Если полилиния подробная, можно сложить линии до пересечения, и после для получения их длины. Если нет, придётся делить линию, которая пересекает полигон, на меньшие участки и выполнять задачу повторно, чтобы сократить длину пересекающегося участка до приемлемого.
- В примере используется маршрут, а не полилиния. Можно либо построить нужный маршрут с промежуточными точками (особенно если ваша полилиния именно маршрутная), либо заменить его на полилинию, и разбить на участки уже его.
Если кому надо, то решил вот так: Загрузил регионы на всю карту
var regionsResult = ymaps.geoQuery(ymaps.regions.load('001'));
Далее, я получаю путь от точки А до точки B
path = ymaps.coordSystem.geo
.solveInverseProblem(start, finish).pathFunction;
И затем, делю отрезок на 200 точек и проверяю, сменился ли регион, если да, то записываю расстояние до смены региона, ну и отдельно после региона.
for (var i = 0; i <= 200 ; i++)
{
// Находим промежуточную точку.
var position = path(i/200).point;
var region = getRegionByCoords(position);
if(country1 != region.name){
country1 = region.name;
space1 = ymaps.coordSystem.geo.getDistance(coordspl1, position);
space2 = ymaps.coordSystem.geo.getDistance(position, coordspl2);
string_countries += region.name+'/'; //Записываем список стран через /
string_space += ymaps.coordSystem.geo.getDistance(temp_metr, position) +'/'; //Записываем расстояние по странам
temp_metr = position;
console.log('Всего:' + spaceAll);
// console.log('от точки до границы:' + space1);
// console.log('от границы до точки:' + space2);
$('#space_km').val(spaceAll);
myCollectionMetka.add(new ymaps.Placemark(position, {
// Покажем в контенте метки пройденное расстояние.
iconContent: 'Пересечение границы на '+ymaps.formatter.distance(
ymaps.coordSystem.geo.getDistance(start, position)
)
}, {
preset: 'islands#blackStretchyIcon',
}
));
}
}