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的极地区域),不同的投影会有明显不同的分辨率,在整个缩放级别执行单一的分辨率会导致一些贴图被放大/缩小,可能需要加载大量的源瓦片。因此,对每个重投影的贴图(在瓦片范围的中间)分别计算分辨率映射。

栅格重投影(投影变换)相关推荐

  1. OpenLayers中文文档2栅格重投影

    目录 栅格重投影 使用方法 Usage 实例 Examples 自定义 Custom projection 视图投影的改变 瓦片网格和 外延 它是如何工作的 动态三角测量 高级Advanced 三角测 ...

  2. 地理坐标系、大地坐标系与地图投影与重投影详解

    地理坐标系.大地坐标系与地图投影与重投影详解 基本概念 首先简单介绍一下地理坐标系.大地坐标系以及地图投影的概念: 地理坐标系:为球面坐标. 参考平面地是椭球面,坐标单位:经纬度: 投影坐标系:为平面 ...

  3. 地理坐标系、大地坐标系、地图投影与重投影

    转自:https://www.cnblogs.com/lishanyang/p/6008256.html 基本概念 首先简单介绍一下地理坐标系.大地坐标系以及地图投影的概念: 地理坐标系:为球面坐标. ...

  4. Python地学分析 — GDAL对遥感影像重投影

    欢迎关注博主的微信公众号:"智能遥感". 该公众号将为您奉上Python地学分析.爬虫.数据分析.Web开发.机器学习.深度学习等热门源代码. 本人的GitHub代码资料主页(持续 ...

  5. 佛山2000坐标-国家2000坐标双向重投影工具

    做项目时接触到佛山2000坐标,典型特征是X坐标以7开头,经查询得知佛山2000坐标以全国统一的坐标系统为基础,进行中央子午线投影变换以及平移而建立的平面坐标系统. 具体参数为:佛山市 2000 系法 ...

  6. Google Earth Engine谷歌地球引擎GEE地理坐标系与投影坐标系变换与重投影

      本文主要对GEE中地理坐标系与投影坐标系转换.重投影等操作加以介绍.本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第十三篇,更多GEE文章请参考专栏:GEE学习 ...

  7. OpenCV 相机校正过程中,calibrateCamera函数projectPoints函数的重投影误差的分析

    OpenCV 校正过程中,calibrateCamera函数的ret和重投影误差的分析 OpenCV对相机进行校正的过程中,校正返回值retval和重投影误差的计算公式表示和分析. OpenCV 校正 ...

  8. python 正方形去畸变_opencv 角点检测+相机标定+去畸变+重投影误差计算

    https://blog.csdn.net/u010128736/article/details/52875137 https://blog.csdn.net/h532600610/article/d ...

  9. Kalibr源码学习(一): 重投影误差

    Kalibr源码学习(一): 重投影误差 给自己挖一个大坑, 从标定结果来学习Kalibr的标定源码, 这里基本以KB模型为例, 也就是标定时, kalibr的模型设定为 --model pinhol ...

最新文章

  1. 区块链技术的本质是分布式数据库
  2. 从WEB SERVICE 上返回大数据量的DATASET
  3. 区分什么是Apache、Tomcat,之间有什么关系?
  4. html图片旋转代码_HTML设计一个小程序
  5. HDU 1069 Monkey and Banana 最长上升子序列进阶(动态规划)
  6. SDUTOJ3469_深度优先搜索练习之神奇的矩环(DFS)
  7. 【BZOJ3049】Island Travels,SPFA预处理+状态压缩DP
  8. Codeforces 963B Destruction of a Tree 【贪心】
  9. 简述linux中的passwd结构,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  10. 【损失函数】一文弄懂各种loss function
  11. Pr 入门教程,如何确保剪辑保持同步?
  12. Ubuntu 搜狗输入法 关闭简繁切换快捷键
  13. linux内存高但是top进程不高,在Linux中通过Top运行进程查找最高内存和CPU使用率...
  14. 销售额总和的分类汇总计算机操作,excel分类汇总-EXCEL函数公式大全之利用MONTH函数和分类汇总汇总每个月的销售额...
  15. bartender打印错误
  16. 【C语言】计算一元二次方程的解
  17. 定义一个矩形类Rectangle:(知识点:对象的创建和使用)
  18. 每天一篇论文 323/365 Designing Energy-Efficient Convolutional Neural Networks using Energy-Aware Pruning
  19. const与指针用法
  20. JS使用userAgent判断操作系统和浏览器类型

热门文章

  1. Cucumber框架入门篇
  2. access Dlookup的值写入表
  3. Altium Designer导入auto cad尺寸文件
  4. 工业绝缘监测及故障定位产品在某电站的应用-安科瑞黄安南
  5. 百度云下载神器 速盘SpeedPan v1.9.7
  6. ElasticSearch看完狂神说视频课的总结
  7. 使用HBase Coprocessor
  8. 一分钟读懂一个数学时代,看完不跪算我输!
  9. 机器学习:初学者的十大基本算法
  10. windows,linux 蚁剑下载与安装 与 手动安装插件disable_functions