#openlayers #openlayers-6
#openlayers #openlayers-6
Вопрос:
В настоящее время мне нужно вычислить новую точку (долготу и широту) из заданной точки и смещение X и Y в метрах в Openlayers. Я попытался использовать функцию перевода, уже доступную в классе ol / geom / Point, но результат выглядит некорректно, поскольку позиция результата отличается от ожидаемой.
Мой вопрос в том, есть ли в ol какой-либо другой способ вычислить желаемую позицию. Я использую ol 6.0.3.
Спасибо.
Комментарии:
1. Смещение должно быть в тех же единицах, что и координаты точки, поэтому вы не можете добавлять метры непосредственно к долготе и широте, вам нужно будет преобразовать координаты в метрическую проекцию, добавить смещение, а затем преобразовать обратно в долготу и широту. Также имейте в виду, что некоторые метрические проекции не являются истинным масштабом во всех положениях (например, один метр на EPSG: проекция веб-меркатора 3857 верна только на экваторе).
2. Привет, @Mike В настоящее время я использую проекцию веб-меркатора по умолчанию (EPSG: 3857) на моей карте, и, согласно документации , это метрическая проекция, я все еще не получаю правильных результатов. Я делаю следующее: var point = new
Point(fromLonLat([-76.091308, 18.427501]));
Затем применяю переводpoint.translate(500, 0);
, но новые координаты точки не соответствуют ожидаемому значению. Я делаю что-то не так?
Ответ №1:
Веб-меркатор не является метрическим … расстояние на полюсе бесконечно…
Для небольших расстояний необходимо рассчитать разрешение в точке:
import {getPointResolution} from '../src/ol/proj.js';
let pointRes = getPointResolution(map.getView().getProjection(), 1, point);
let dx = 500 / pointRes;
point.translate(dx, 0);
Для большего расстояния вы должны вычислить расстояние на сфере вдоль большого круга.
Вы можете посмотреть на ol-ext lib, чтобы вычислить точку назначения с учетом начальной точки, расстояния и азимута: используя ol_sphere_computeDestinationPoint
функцию.
Комментарии:
1. getPointResolution ожидает координаты точки
let pointRes = getPointResolution(map.getView().getProjection(), 1, point.getCoordinates());