柵格重投影(投影變換)

2021-10-14 02:53:49 字數 3016 閱讀 4451

openlayers能夠在不同的座標系統中顯示來自wms、wmts、靜態影象和許多其他源的柵格資料。影象的地圖重投影直接發生在web瀏覽器中。在任何proj4js支援的座標參考系統中都是可視的,並且以前不相容的圖層現在可以組合和疊加。

api的使用非常簡單。只需在ol/view中指定正確的投影(例如使用epsg**):

import  from 'ol';

import tilelayer from 'ol/layer/tile';

import tilewms from 'ol/source/tilewms';

var map = new map(),

layers: [

new tilelayer(

})})

]});

如果乙個源(基於ol/source/tileimage或ol/source/image)有乙個投影不同於當前ol/view的投影,那麼重投影會在底層自動發生。

使用自定義投影的最簡單方法是將proj4js庫新增到專案中,然後使用proj4定義字串定義投影。可用以下命令安裝:

npm install proj4
以下示例顯示了英國國家電網的定義:

import proj4 from 'proj4';

import 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());
當需要重投影時,新瓦片(在目標投影中)將在從原始源瓦片(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的極地區域),不同的投影會有明顯不同的解析度,在整個縮放級別執行單一的解析度會導致一些貼圖被放大/縮小,可能需要載入大量的源瓦片。因此,對每個重投影的貼圖(在瓦片範圍的中間)分別計算解析度對映。

投影變換 透視投影和正交投影

2.3 投影變換 3.2.3.1 基本概念 在計算機圖形軟體中所採用笛卡爾 cartesian 直角三維座標系統,按照 z軸方向的不同有兩種形式 1 右手系統 當用右手握住 z軸時,大姆指指向 z軸的正方向 圖 3.20 a 其餘四個手指從x軸到 y軸形成乙個弧。2 左手系統 當用左手握住 z軸時,...

python opencv投影變換增強

邊緣填充 image cv2.copymakeborder image,add width,add width,add width,add width,cv2.border replicate,0 乙個是投影變換增強,乙個是旋轉增強 coding utf 8 import cv2 import nu...

正交投影變換與透視投影

相機投影模型 三維計算機圖形學的基本問題之一就是三維觀察問題 即如何把三維場景投影到要顯示的二維影象。大多數經典的解決投影變換方法有兩種 正交投影變換和透視投影變化。正交投影變換用乙個長方體來取景,並把場景投影到這個長方體的前面。這個投影不會有透視收縮效果 遠些的物體在影象平面上要小一些 因為它保證...