国产麻豆一级在线观看_国产午夜亚洲精品国产成人小说_国产午夜成人福利在线观看蜜芽_国产天堂亚洲国产碰碰_国产麻豆剧看黄在线观看_国产噜噜在线视频观看_国产精品亚洲二区在线播放

首頁 新聞中心 技術文檔 OpenLayers中文教程文檔

OpenLayers的投影方式

發布時間:2021-12-12 22:57:52   瀏覽量:3806   作者:openlayers.org

OpenLayers 能夠在不同于服務器提供的坐標系中顯示來自 WMS、WMTS、靜態圖像和許多其他來源的柵格數據。圖像的地圖投影的轉換直接在 Web 瀏覽器中進行。任何 Proj4js 支持的坐標參考系統中的視圖都是可能的,以前不兼容的層現在可以組合和覆蓋。

用法

API 的使用非常簡單。只需指定正確的投影(例如使用EPSG代碼)ol/View

import {Map, View} from'ol';import TileLayer from'ol/layer/Tile';import TileWMS from'ol/source/TileWMS';varmap =newMap({target:'map',view:newView({projection:'EPSG:3857',//HERE IS THE VIEW PROJECTIONcenter: [0,0],zoom:2}),layers: [newTileLayer({source:newTileWMS({projection:'EPSG:4326',//HERE IS THE DATA SOURCE PROJECTIONurl:'https://ahocevar.com/geoserver/wms',params: {'LAYERS':'ne:NE1_HR_LC_SR_W_DR'}})})]});

如果源(基于ol/source/TileImageol/source/Image)的投影與當前 的投影不同,ol/View則重新投影會在幕后自動發生。

自定義投影

使用自定義投影的最簡單方法是將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);varproj27700 = getProjection('EPSG:27700');proj27700.setExtent([0,0,700000,1300000]);

視圖投影的變化

要切換用于顯示地圖的投影,您必須在 上設置一個ol/View具有選定投影的新投影ol/Map

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

TileGrid 和范圍

當需要重新投影時,新的圖塊(在目標投影中)位于從原始源圖塊創建的引擎蓋下。默認情況下,重新投影圖塊的 TileGrid 是使用ol/tilegrid~getForProjection(projection). 投影應該有范圍定義(見上文)才能正常工作。

或者,可以手動構建自定義目標 TileGrid 并使用ol/source/TileImage~setTileGridForProjection(projection, tilegrid). 當重新投影到指定的投影而不是創建默認投影時,將使用此 TileGrid。在某些情況下,這可用于優化性能(通過調整圖塊大小)或視覺質量(通過指定分辨率)。

怎么運行的

重投影過程基于三角形——目標柵格被分成有限數量的三角形,頂點使用ol/proj功能轉換(proj4js通常用于定義自定義轉換)。三角形內像素的重投影近似于仿射變換(渲染硬件由畫布 2d 上下文加速):

通過這種方式,我們可以在幾乎任何硬件(支持 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 和 EPSG:4326 中的極地地區)和對整個縮放級別強制使用單一分辨率會導致某些圖塊按比例放大/縮小,可能需要加載大量源圖塊。因此,分辨率映射是針對每個重新投影的瓦片(在瓦片范圍的中間)單獨計算的。


主站蜘蛛池模板: 苏尼特左旗| 永仁县| 河南省| 德江县| 鄢陵县| 河津市| 灵川县| 简阳市| 炎陵县| 瑞金市| 布尔津县| 镇赉县| 和平县| 勃利县| 洪江市| 华蓥市| 通道| 赣榆县| 安岳县| 昭通市| 开远市| 中牟县| 福建省| 高台县| 东城区| 开化县| 梓潼县| 赤水市| 泊头市| 时尚| 浪卡子县| 长海县| 湾仔区| 祁东县| 清新县| 滦平县| 庆阳市| 原阳县| 壶关县| 崇左市| 铁力市|