Переместить заданную точку на X, Y метров Openlayers

#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());