使用OpenLayers 5显示地理参考图像

时间:2018-10-20 10:18:43

标签: openlayers-5

我正在尝试开发一个用户可以对扫描的地图进行地理配准的应用程序。您可以在此处查看示例:https://codesandbox.io/s/2o99jvrnyy 有两张图片:

第一个图像已正确加载到地图上,但旋转的图像未正确加载。

我找不到有关OpenLayers 5是否可以处理具有存储在世界文件中的转换参数的图像的信息。可能我缺少了一些东西,但无法弄清楚是什么。

这是我的逻辑工作方式:

通过仿射变换使用4个点计算变换参数。您可以在 Affine.js 文件中查看逻辑。从源图像和地图中至少拾取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];

世界文件参数按here的定义进行计算。

可能的问题是旋转的图像在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 :(得分:0)

我意识到我的方法是错误的。无需计算地图投影中图像的范围并将其设置在图层中。我可以简单地添加一个转换函数来负责在图像投影和地图投影之间转换坐标。这样,图像层始终将投影设置为图像投影,而范围设置为以像素为单位的图像大小。

像这样添加转换功能:

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/