Страницы

Поиск по вопросам

Показаны сообщения с ярлыком yandex-maps-jsapi. Показать все сообщения
Показаны сообщения с ярлыком yandex-maps-jsapi. Показать все сообщения

четверг, 9 января 2020 г.

Нарисовать полукруг / сектор круга на карте

#yandex_maps_api #yandex_maps_jsapi


Можно ли с помощью API создать полуокружность на карте или сектор (не в виде треугольника,
а чтобы на конце была дуга), посоветуйте как это сделать.

В качестве известных данных. Радиус, Направление, угол ф, начальная точка. Знаю что
есть прямая и обратная геодезическая задача, но у меня нет конечной точки, только расстояние
и направление. По большому счёту интересует вопрос отрисовки секторов на карте.
    


Ответы

Ответ 1



Можно просто нарисовать полигон нужной формы. Самое простое решение выглядит так: http://jsfiddle.net/tLs0d51u/ Но там получился не совсем круг, поскольку круг формируется в сферических координатах (в широте и долготе), а не в декартовых. Чтобы нарисовать нормальный круг, нужно работать с глобальными пиксельными координатами, а затем перевести их в сферические. Это можно сделать так: var zoom = map.getZoom(); var projection = map.options.get('projection'); // широта и долгота -> пиксели projection.toGlobalPixels([55.73, 37.75], zoom); // пиксели -> широта и долгота projection.fromGlobalPixels([158560.7111111111, 82211.42703728657], zoom); Сектор нормального круга: http://jsfiddle.net/tLs0d51u/1/

Ответ 2



Отрисовывал сектор через решение прямой геодезической задачи, при этом в исходных данных имел радиус, угол, координаты начальной точки. function getAreaCoord(point, azimut, corner, length) {// получение координат сектора var sector = []; var firstSide = Math.PI * ((360 - azimut) + 90) / 180, // азимут в радианах secondSide = firstSide - (Math.PI * corner / 180), dir2 = [Math.sin(firstSide), Math.cos(firstSide)]; // направление по азимуту sector[0] = ymaps.coordSystem.geo.solveDirectProblem(point, dir2, length).endPoint; var i = 1; for(var sectopPoint = 5; sectopPoint <= corner; sectopPoint += 5) { var middlePoint = sectopPoint; var side = firstSide - (Math.PI * middlePoint / 180); var dir4 = [Math.sin(side), Math.cos(side)]; sector[i] = ymaps.coordSystem.geo.solveDirectProblem(point, dir4, length).endPoint; i++ } return sector; }

пятница, 12 июля 2019 г.

Найти точку пересечения между маршрутом и границами МКАД

Ищу координаты пересечения маршрута с МКАД. По аналогии с примером из песочницы "Пересечение маршрута с многоугольником на примере МКАД":
Строю мультимаршрут Получаю активный маршрут let route = this._route.getActiveRoute() Получаю первый путь маршрута let firstPath = route.model.getPaths()[0] Получаю его сегменты let segments = firstPath.getSegments(); Собираю координаты сегментов в один массив
let coords = []; for (let segment of segments) { coords = coords.concat(segment.geometry.getCoordinates()) } По аналогии с примером собираю участки путей edges
let edges = []; for (let i = 1, l = coords.length; i < l; i++) { edges.push({ type: 'LineString', coordinates: [coords[i], coords[i - 1]] }); } Создаю geoQuery и получаю элементы пересекающие МКАД
let routeObjects = ymaps.geoQuery(edges).addToMap(this._map); let boundaryObjects = routeObjects.searchIntersect(this._mkadPolygon); Получаю последний элемент (мне нужны его координаты, чтобы поставить там точку маршрута)
let lastBoundary = boundaryObjects.get(boundaryObjects.getLength() - 1);
Как получить его координаты?
P.S. Может быть, есть метод проще? Я хочу добавить эту точку в маршрут, чтобы получать параметры маршрута внутри МКАД и после МКАД отдельно.
Получение этой точки с помощью метода getClosest даёт не корректную точку. Он ищет ближайшую точку по прямой, что не есть ближайшая точка по дорогам.


Ответ

coords = lastBoundary.geometry.getCoordinates()

понедельник, 18 февраля 2019 г.

Нарисовать полукруг / сектор круга на карте

Можно ли с помощью API создать полуокружность на карте или сектор (не в виде треугольника, а чтобы на конце была дуга), посоветуйте как это сделать.
В качестве известных данных. Радиус, Направление, угол ф, начальная точка. Знаю что есть прямая и обратная геодезическая задача, но у меня нет конечной точки, только расстояние и направление. По большому счёту интересует вопрос отрисовки секторов на карте.


Ответ

Можно просто нарисовать полигон нужной формы.
Самое простое решение выглядит так: http://jsfiddle.net/tLs0d51u/ Но там получился не совсем круг, поскольку круг формируется в сферических координатах (в широте и долготе), а не в декартовых.
Чтобы нарисовать нормальный круг, нужно работать с глобальными пиксельными координатами, а затем перевести их в сферические. Это можно сделать так:
var zoom = map.getZoom(); var projection = map.options.get('projection');
// широта и долгота -> пиксели projection.toGlobalPixels([55.73, 37.75], zoom);
// пиксели -> широта и долгота projection.fromGlobalPixels([158560.7111111111, 82211.42703728657], zoom);
Сектор нормального круга: http://jsfiddle.net/tLs0d51u/1/