栅格重投影(投影变换)

article/2025/10/1 13:16:44

OpenLayers能够在不同的坐标系统中显示来自WMS、WMTS、静态图像和许多其他源的栅格数据。图像的地图重投影直接发生在web浏览器中。在任何Proj4js支持的坐标参考系统中都是可视的,并且以前不兼容的图层现在可以组合和叠加。

使用:

API的使用非常简单。只需在ol/View中指定正确的投影(例如使用EPSG代码):

import {Map, View} from 'ol';
import TileLayer from 'ol/layer/Tile';
import TileWMS from 'ol/source/TileWMS';var map = new Map({target: 'map',view: new View({projection: 'EPSG:3857', // 视图投影center: [0, 0],zoom: 2}),layers: [new TileLayer({source: new TileWMS({projection: 'EPSG:4326', // 数据源投影url: 'http://demo.boundlessgeo.com/geoserver/wms',params: {'LAYERS': 'ne:NE1_HR_LC_SR_W_DR'}})})]
});

如果一个源(基于ol/source/TileImage或ol/source/Image)有一个投影不同于当前ol/View的投影,那么重投影会在底层自动发生。

示例:

  • 栅格重投影示例
  • OpenStreetMap到WGS84重投影
  • 重投影与EPSG.io数据库搜索
  • 图像重投影

自定义投影:

使用自定义投影的最简单方法是将Proj4js库添加到项目中,然后使用proj4定义字符串定义投影。可用以下命令安装:

npm install proj4

以下示例显示了英国国家电网的定义:

import proj4 from 'proj4';
import {get as getProjection, register} from 'ol/proj';proj4.defs('EPSG:27700', '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 ' +'+x_0=400000 +y_0=-100000 +ellps=airy ' +'+towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 ' +'+units=m +no_defs');
register(proj4);
var proj27700 = getProjection('EPSG:27700');
proj27700.setExtent([0, 0, 700000, 1300000]);

改变视图投影:

要切换投影以显示地图,你必须在在ol/Map上设置一个新的ol/View并选择投影:

map.setView(new View({projection: 'EPSG:27700',center: [400000, 650000],zoom: 4
}));

TileGrid和Extents:

当需要重投影时,新瓦片(在目标投影中)将在从原始源瓦片(Source Tiles)的底层创建。重投影瓦片的TileGrid默认使用ol/ TileGrid ~getForProjection(projection)在内部构造。投影应该有定义的范围(见上面),这样才能正常工作。

另外,一个自定义的目标TileGrid可以手动构造,并使用ol/source/TileImage~setTileGridForProjection(projection, tileGrid)在源实例上设置。当重投影到指定的投影而不是创建默认投影时,将使用这个TileGrid。在某些情况下,这可以用来优化性能(通过调整瓦片大小)或视觉质量(通过指定分辨率)。

工作原理:

重投影过程是基于三角形的——目标栅格被分割成有限数量的三角形,这些三角形的顶点使用ol/proj功能进行转换(proj4js通常用于定义自定义转换)。三角形内像素的重投影用仿射变换近似(通过canvas 2d context使用硬件加速渲染):

通过这种方式,我们可以在几乎任何硬件上(使用canvas 2d支持)用相对较少的实际转换计算以支持来自proj4js(甚至自定义转换函数)的广泛投影。

重投影的精度受到三角形数量的限制。

重投影过程保留了源(png或gif)提供的栅格数据的透明度,重投影生成的间隙和无数据像素自动透明。

动态构网:

上面的图像显示了一个明显的错误(尤其是在边缘),当原始图像(左:EPSG:27700)仅用有限数量的三角形(右:EPSG:3857)进行转换。通过增加使用的三角形数量,可以使误差最小化。

由于一些转换需要更详细的三角网,动态构网过程自动测量重投影误差,并迭代细分,以满足特定的误差阈值:

为了调试,可以通过ol.source.TileImage#setRenderReprojectionEdges(true)启用重投影边缘的渲染。

高级设置:

构网精度阈值:

默认的构网误差阈值以像素为单位由ERROR_THRESHOLD(0.5像素)给出。如果需要为不同的源定义不同的阈值,则可以在构造瓦片图像源时传递reprojectionErrorThreshold选项。

按范围限制重投影地图的可见性:

重投影算法使用逆变换(从视图投影到数据投影)。对于某些坐标系统,这可能导致源数据在地图上“两次出现“。例如,当将瑞士地图从EPSG:21781重投影到EPSG:3857时,它会显示两次:一次是在欧洲的正确位置,但也会显示在靠近新西兰的太平洋上,在地球的另一边。

尽管这是逆变换在数学上正确的行为,但用户并不期望该图层在多个地方可见。一个可能的通用解决方案是计算每个顶点的前向变换,但这将显著降低性能(特别是对于计算上昂贵的转换)。

因此,一个推荐的解决方案是在视图投影中的ol.layer.Tile上定义一个适当的可见范围。在重投影演示示例中演示了如何设置这样的限制。

分辨率计算:

在确定要加载的源瓦片时,需要计算理想的源分辨率。ol/reproj~calculateSourceResolution(sourceProj, targetProj, targetCenter, targetResolution)函数计算理想值,以便在重投影过程中实现尽可能接近1:1的像素映射,然后使用其从源选择合适的缩放级别。

然而,对于整个目标缩放级别使用同一源缩放级别通常是不实际的——在世界的不同地方(例如EPSG:3857 vs EPSG:4326的极地区域),不同的投影会有明显不同的分辨率,在整个缩放级别执行单一的分辨率会导致一些贴图被放大/缩小,可能需要加载大量的源瓦片。因此,对每个重投影的贴图(在瓦片范围的中间)分别计算分辨率映射。


http://chatgpt.dhexx.cn/article/bnObhMFl.shtml

相关文章

坐标系与投影变换

所有空间数据必须纳入到相同空间参考基准下才可以进行空间分析,因此坐标系和投影变换十分重要,这也是地理信息系统的基础。坐标系是数据或地图的属性,而投影是坐标系的属性。 一、地球形状(三级逼近) 地球表面→ 大地水…

Opencv——几何空间变换(仿射变换和投影变换)

几何空间变换 【1】几何变换(空间变换)简述【2】变换矩阵知识简述齐次坐标的概念几何运算矩阵 【3】图像的仿射变换1、平移变换2、比例缩放3、旋转4、对称变换(不做展示)1、关于X轴变换2、关于Y轴变换3、关于直线YX变换4、关于直线…

仿射变换和投影变换

1. 仿射变换 1) 用途 旋转 (线性变换),平移 (向量加).缩放(线性变换),错切,反转 2) 方法 仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线&…

三维图形的投影变换

1.平行投影: 1.1 正轴投影: 我们通常说的三视图是指正视图、俯视图和侧视图, 投影平面分别与 x,y,z 轴垂直。 正视图:(yz) 俯视图:(xy) 侧视图:(xz) 1.2 正轴测投影: 如图: 咱们希望按照这个平面对物体进行平行投影: 首先,先把物体及投影面沿着y轴顺时针旋转,在绕x轴逆时针…

华科_图形学笔记_07_投影变换

计算机图形学_华中科技大学_中国大学MOOC(慕课) 7.1_有趣的投影 由于我们的观察设备是二维的,因此,最终都存在一个三维向二维的映射过程。这个映射过程,按照几何意义来说就是投影。 而在我们之前讲到的观察变换中,其实还有一个隐…

Opengl投影变换理解

坐标到达观察空间之后,我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上。 而[-1.0,1.0]构成的正方体又叫规则观察体(Canonical View Volume, CVV) 一、流程 计算机显示器是一个 2D 表面。OpenGL 渲染…

图形学-(视图变换,投影变换)

1.视图变换 在 3 维物体变到二维平面的过程中,我们需要规定好相机的位置。对于相机所做的变换就是视图变换 (Viewing/Camera transformation)。 我们需要对相机位置进行定义,对于一个相机我们要规定下面三个属性: 相…

4.3 投影变换

投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终图像只是视景体内的有关部分。 投影也是使用矩阵来实现的。计算一个用于实现透视投影或者平行投影的矩阵,并把它与当前的投影矩阵(一般是单位矩阵)相乘。 OpenGL支持两种类型的投影变换,即透视投影…

读书笔记-opencv-投影变换

读书笔记-opencv-投影变换 原理解析 ​ 透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x′,y′)空间的映射.相对于仿射变换,它提供了更大…

计算机图形学 | 投影变换

计算机图形学 | 投影变换 计算机图形学 | 投影变换7.1 有趣的投影投影的概念平行投影正投影斜投影 透视投影 7.2 规范化的投影变换观察的要素观察空间规范化的投影变换 华中科技大学《计算机图形学》课程 MOOC地址:计算机图形学(HUST) 计算…

使用 OpenCV 进行图像投影变换

投影变换(仿射变换) 在数学中,线性变换是将一个向量空间映射到另一个向量空间的函数,通常由矩阵实现。如果映射保留向量加法和标量乘法,则映射被认为是线性变换。 要将线性变换应用于向量(即,一…

Opencv之投影变换

学习资料参考: 张平.《OpenCV算法精解:基于Python与C》.[Z].北京.电子工业出版社.2017. 原理 平面的物体若在三维空间发生了旋转,那么这就是投影变换。平面的物体可以借助二维投影变换进行三维变换模型化得到修正。 处理函数 c中的getPersp…

ArcMap 投影变换

在投影变换之前,首先需要理清出我们拿到的工程数据到底是哪一个投影坐标系,只有清楚是哪一个坐标系才能给我们矢量化出来的数据进行定义投影(如果是当地的投影坐标系,可以查看自定义投影坐标系文章,新建出当地的投影坐…

OpenCV : 投影变换

投影变换 物体在三维空间发生了旋转,叫做投影变换.由于可能出现阴影或遮挡,所以变换后较难复原.如果物体时平面的,就可以通过投影变换物体三维变换进行模型化,这叫做专用的二维投影变换. 矩阵表示: [ x ~ y ~ z ~ ] [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] [ x …

Halcon 第七章『图像的几何变换』◆第2节:投影变换

一、介绍 投影变换也叫透射变换、投影映射。透射变换是将图像投影到一个新的视平面,是一种二维坐标到三维坐标的变换。 透射变换是仿射变换的延续,也可以说仿射变换是透射变换的一种特殊形式。其特殊性在于变换后图像的形状仍然维持原状。投影变换包括的…

投影变换原理和用法

一、定义:投影变换也叫透射变换、投影映射。透射变换是将图像投影到一个新的视平面,是一种二维坐标到三维坐标的变换。 透射变换是仿射变换的延续,也可以说仿射变换是透射变换的一种特殊形式。其特殊性在于变换后图像的形状仍然维持原状。投影…

基于libVLC的视频播放器之四:直接使用libVLC

一.效果 播放本地文件 播放网络url:rtsp://3.84.6.190/vod/mp4:BigBuckBunny_115k.mov 二.实现 既然有VLC-Qt,为什么还要直接调用libVLC呢,因为直接调用会加深对整个播放流程的理解,方便后面修改VLC-Qt源码。

MFC调用vlc动态库libvlc.dll实现简单播放器 中文路径处理

一、简单说明 本文讲解利用MFC调用vlc&#xff08;2.0.0&#xff09;的动态库实现简单的播放器&#xff0c;实现播放、暂停、停止、音量控制、进度控制&#xff0c;支持中文路径等。 VLC 中文路径转码问题<转> 最近用MFC编写调用libVLC的程序时碰到中文路径不能打开的问题…

VLC-Android编译

1.环境 硬核条件----------linux(这里用ubuntu代替)15.5.1 build-15018445 PS&#xff1a;这里安装好虚拟机以后&#xff0c;尽可能分配大内存(8GB起步)&#xff0c;如果电脑本地不允许开这么大的内存给虚拟机&#xff0c;则本博文后面的内容可能帮助不大。 安装好虚拟机后&am…

VLC介绍以及库的使用

VLC原指VideoLAN客户端(VideoLANClient)&#xff0c;是一款开源的、跨平台的、可扩展的、多媒体播放器、流媒体服务器及框架&#xff0c;可播放大多数多媒体文件&#xff0c;以及DVD、音频CD、VCD及各类流媒体协议&#xff0c;现更名为VLC media player&#xff0c;最新版本为2…