#javascript #алгоритм #yandex_maps_api
На карте есть несколько точек. Все эти точки требуется переместить на 30 метров от первоначального положения. Мысль, которая есть у меня - перевести эти 30 метров в градусы и задать новое значение точки. Расстояние в 1 градусе, если я не ошибаюсь, около 111 км. Но результат перемещения скорее всего будет очень не точным. Есть ли какие-нибудь функции для упрощения этой задачи?
Ответы
Ответ 1
У Апи Яндекс карт есть специальный метод для этого, в документации ниже есть пример : https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ICoordSystem-docpage/#method_detail__solveDirectProblem // Начальная точка var startPoint = [60, 30], // Движемся на северо-восток, азимут 45 градусов // или pi/4 радиан. azimuth = Math.PI / 4, // Направление движения. direction = [Math.cos(azimuth), Math.sin(azimuth)], // Путевая функция path = ymaps.coordSystem.geo .solveDirectProblem(startPoint, direction, 2e5).pathFunction;Ответ 2
При движении по меридиану изменится широта на 30/111111 градуса, при движении по параллели на широте φ изменится долгота на 30/111111/(cos φ) Для общего случая при движении по произвольному азимуту можно воспользоваться формулами отсюда (раздел Destination point given distance and bearing from start point ) Formula: φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ ) λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 ) where φ is latitude, λ is longitude, θ is the bearing (clockwise from north), δ is the angular distance d/R; d being the distance travelled, R the earth’s radius JavaScript: (all angles in radians) var φ2 = Math.asin( Math.sin(φ1)*Math.cos(d/R) + Math.cos(φ1)*Math.sin(d/R)*Math.cos(brng) ); var λ2 = λ1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(φ1), Math.cos(d/R)-Math.sin(φ1)*Math.sin(φ2));Ответ 3
Считать лучше непосредственно через Яндекс, если Вы получаете координаты от него, если для Вас критично получить точные значения. Это связано с тем, что координаты могут отличаться, в зависимости от того, какие проекции использует Яндекс при геокодировании. YandexMaps Api обладает 3мя возможностями посчитать расстояние между точками: Во фронте На бэке Через маршруты. Во фронте: ymaps.route(['Минск','Москва']); В бекенде: Если координат нет, то их можно получить через геокодер: https://geocode-maps.yandex.ru/1.x/?geocode=Москва&format=json https://geocode-maps.yandex.ru/1.x/?geocode=Минск&format=json Считаем расстояние: https://api.routing.yandex.net/v1.0.0/distancematrix?origins=55.753215,37.622504&destinations=27.561481,53.902496&mode=driving&apikey={{ваш ключ}} Но есть одно "Но". В итоге мы можем получить разные дистанции. Чтобы этого избежать следует использовать API Маршрутизатора. Этот API возвращает сразу и геометрию маршрута (полилинию), которую можно отобразить на карте. Но здесь следует учитывать тот факт, что
Комментариев нет:
Отправить комментарий