Отображение изображений с географической привязкой с помощью OpenLayers 5 - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь создать приложение, в котором пользователь может привязывать отсканированные карты.Вы можете посмотреть пример здесь: https://codesandbox.io/s/2o99jvrnyy Есть два изображения:

Первое изображение правильно загружено на карту, а с поворотом - нет.

Я могу 'Найти информацию о том, может ли OpenLayers 5 обрабатывать изображения с параметрами преобразования, хранящимися в файле мира .Возможно, я что-то упустил, но не могу понять, что.

Вот как работает моя логика:

Параметры преобразования вычисляются с помощью аффинного преобразования с использованием 4 точек.Вы можете увидеть логику в файле Affine.js .По крайней мере, 4 очка взяты из исходного изображения и карты.Затем, используя эти 4 точки, рассчитываются параметры преобразования.После этого я вычисляю размер изображения:

width = image.width in pixels
height = image.height in pixels
width *= Math.sqrt(Math.pow(parameters.A, 2) + Math.pow(parameters.D, 2));
height *= Math.sqrt(Math.pow(parameters.B, 2) + Math.pow(parameters.E, 2));

// then the extent in projection units is
extent = [parameters.C, parameters.F - height, parameters.C + width, parameters.F];

Параметры мирового файла рассчитываются так, как определено здесь .

Возможно, проблема в том, чтоизображение с вращением не поворачивается при загрузке в OpenLayers 5 как статическое изображение, но не может найти способ сделать это.

Я попытался загрузить оба изображения в QGIS и ArcMap с вычисленными параметрами иоба они загружены правильно.Вы можете увидеть результат для второго изображения:

enter image description here

Здесь вы можете увидеть параметры для каждого изображения:

Image: test.png
Calculated extent: [436296.79726721847, 4666723.973240128, 439864.3389057907, 4669253.416495154]
Calculated parameters (for world file):
3.8359372067274027
-0.03146800786355865
-0.03350636818089405
-3.820764346376064
436296.79726721847
4669253.416495154

Image: test_rotation.png
Calculated extent: [437178.8291026594, 4667129.767589236, 440486.91675884253, 4669768.939256327]
Calculated parameters (for world file):
3.506332904308879
-1.2831186688536016
-1.3644002712982917
-3.7014921022625864
437178.8291026594
4669768.939256327

1 Ответ

0 голосов
/ 24 октября 2018

Я понял, что мой подход был неверным.Нет необходимости вычислять экстент изображения в проекции карты и устанавливать его в слое.Я могу просто добавить функцию преобразования, отвечающую за преобразование координат между проекцией изображения и проекцией карты.Таким образом, слой изображения всегда имеет свою проекцию, установленную на проекцию изображения, и экстент, установленный на размер изображения в пикселях.

Функция преобразования добавляется следующим образом:

import { addCoordinateTransforms } from 'ol/proj.js';

addCoordinateTransforms(
  mapProjection,
  imageProjection,
  coords => {
    // forward
    return Affine.transform(coords);
  },
  coords => {
    // inverse
  }
)

Аффинные параметрыснова рассчитываются как минимум из 3 пунктов:

// mapPoints - coordinates in map projection
// imagePoints - coordinates in image projection
Affine.calculate(mapPoints, imagePoints);

Вы можете увидеть полный пример здесь - https://kw9l85y5po.codesandbox.io/

...