栅格重投影(投影变换)

2024-01-24 17:38
文章标签 栅格 投影 投影变换

本文主要是介绍栅格重投影(投影变换),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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://www.chinasem.cn/article/640445

相关文章

常见的投影类型及详细解释

常见的地图投影根据保留地球的不同几何特性(形状、面积、距离等)可以分为几大类。以下是常见的投影类型及详细解释: 一、正形投影(保持形状) 1. 墨卡托投影(Mercator Projection) 特点:保持形状,但严重扭曲面积,尤其在高纬度地区。应用:海洋导航、在线地图(如 Google Maps 在小比例尺下使用)。原理:投影将地球表面展开成矩形,经线垂直,纬线等距。优点:航线在图上为直

中国生态环境胁迫数据(栅格/县域尺度)-为研究生态环境压力提供数据支撑

中国生态环境胁迫矢量数据(2000-2010年) 数据介绍 2000-2010年中国生态环境胁迫数据为2000-2010年中国范围内人口、农业生产等生态环境胁迫因子的空间分布图,包括人口密度、农药使用强度、化肥施用强度。数据可用于分析全国生态环境胁迫因子及其对生态环境造成的压力的空间特征,主要通过社会经济统计资料获得,为县域尺度空间数据。 存储容量31.01 GB文件数量6数据类型栅

5-7千元性价比最高的家用4K投影:大眼橙X30Ultra和当贝X5SPro对比

临近开学又有不少投影品牌上了新品,大眼橙这家国产投影品牌也在9月初上新了两款不同价位的投影,一款是三千多的X7DUltra,一款是五千多的X30Ultra。正好有朋友最近向我咨询购买投影仪的事情,他预算六千左右,问有没有值得买的4K投影仪,挑了一款六千价位卖的最火爆的当贝X5SPro和这款新品大眼橙X30Ultra对比看看,哪款配置更高,谁更值得买。 选择当贝X5SPro这款产品

1.39TB高清卫星影像更新(WGS84坐标投影)

最近对WGS84版的高清卫星影像数据进行了一次更新,并基于更新区域生成了相应的接图表。 1.39TB高清卫星影像更新 本次数据更新了1576个离线包,共1.39TB大小,并全部生成了更新接图表。 更新接图表范围 更新接图表由每一个离线包文件的范围构成,放大地图可以查看接图表的编号。    接图表编号 我们打开瓦片编号并放到到第12级,可以发现接图表的编号与瓦片编号完全一

opencv的球面投影

cv::detail::SphericalProjector 在全景图像拼接任务中,可能需要对多个图像进行球面投影以实现无缝拼接。每个cv::detail::SphericalProjector可以负责一个图像的球面投影操作。通过将多个这样的投影器存储在std::vector中,可以对一组图像依次进行投影处理,为后续的图像融合和拼接做准备。 例如,当拼接一组由不同角度拍摄的照片以创建全景图时,这

GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

任务         1.实现单帧降噪         2.实现多帧投影         3.实现多帧累积         Bonus:使用À-Trous Wavelet 加速单帧降噪 实现         单帧降噪         这里实现比较简单,直接根据给出的联合双边滤波核的公式就能实现          Buffer2D<Float3> Denoiser::Fil

将octomap的离线与在线生成栅格地图功能结合到一个功能包里

在之前的教程中,我已经分别完成了离线和在线生成栅格地图,但是这样会有两个工作空间,不方便,所以把他们集中到一个功能包里去,方便使用,很简单,记录一下。 一、离线教程 pointcloud_publisher: 将点云文件内容数据发布到话题 /pointcloud/output、使用octomap_server_node接收数据并生成Octomap、使用rviz查看点云及对应的Octomap这个

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说,类似于 calcHist,在每个位置 (x, y),该函数收集输入图像中选定通道的值,并找到对应的直方图区间。但是,与其递增该区间值,该函数读

墨卡托、高斯克吕格、UTM投影

https://wenku.baidu.com/view/e53e7dd4f71fb7360b4c2e3f5727a5e9846a274b.html 1,            什么是UTM(Universal Transverse Mercator projection)投影? UTM投影全称为:通用横轴墨卡投影,是一种等角横轴割圆柱投影。椭圆柱割地球于南纬80度,北纬84度两条等高

【译】PCL官网教程翻译(21):旋转投影统计(RoPs)特征 - RoPs (Rotational Projection Statistics) feature

英文原网址查看 旋转投影统计(RoPs)特征 在本教程中,我们将学习如何使用pcl::ROPSEstimation类来提取点特性。在这门课中实现的特征提取方法是由Yulan Guo, Ferdous Sohel, Mohammed Bennamoun, Min Lu and Jianwei Wanalso在他们的文章《旋转投影统计用于三维局部表面描述和目标识别》中提出的。 理论基础 特征提