OpenLayers線性漸變和中心漸變(徑向漸變)

目錄

  • 1.前言
  • 2.添加一個面要素
  • 3.線性漸變
    • 3.1 第一個注意點
    • 3.2 第二個注意點
  • 4.中心漸變(徑向漸變)
  • 5.總結

1.前言

??OpenLayers官網有整個圖層的漸變示例,但是沒有單個要素的漸變示例,我們這里來補充一下。OpenLayers中的漸變是通過fill選項中實現的。fill選項可以傳一個ColorLike,本質是通過Canvas實現的,此時ColorLike對應的是CanvasPatternCanvasGradient

2.添加一個面要素

const source = new VectorSource();let polygon = new Feature({geometry:new Polygon([[[106.542384,30.485627],[106.542384,40.485627],[117.542384,40.485627],[117.542384,30.485627],[106.542384,30.485627],]])});source.addFeature(polygon)const vectorLayer = new VectorLayer({source: source,});const map = new Map({layers: [vectorLayer],target: 'map',view: new View({center: [126.980366, 37.52654],zoom: 1,projection:'EPSG:4326'}),});

在這里插入圖片描述

3.線性漸變

//import {DEVICE_PIXEL_RATIO} from 'ol/has'
getLineGradientStyle(){const canvas = document.createElement('canvas');const context = canvas.getContext('2d');const pixelRatio = DEVICE_PIXEL_RATIO;let gradient = context.createLinearGradient(0,0,1024*pixelRatio,0);let mainColor = '#56e90e';let secondColor = '#0e57e9';gradient.addColorStop(0,mainColor);gradient.addColorStop(1,secondColor);return gradient;
}
let style = new Style({fill:new Fill({color:this.getLineGradientStyle()})
})
polygon.setStyle(style)

在這里插入圖片描述

3.1 第一個注意點

??現在我們的要素在地圖的正中間,能看到兩個顏色之間的過渡。我們把地圖左鍵進行移動一下,使得要素分別在最后邊和最后邊,然后再來看看效果。
在這里插入圖片描述
在這里插入圖片描述
??發現了什么?效果是變化的!所以我們的漸變策略是不太對的,漸變填充應該根據面的范圍以及當前所處的位置來進行動態計算。具體來說就是要在createLinearGradient的時候去動態計算.現在我把漸變改成從【512,0】到【1024,0】的漸變,然后我們把地圖往左移動,再看看效果

let gradient = context.createLinearGradient(512*pixelRatio,0,1024*pixelRatio,0);

在這里插入圖片描述
??這次發現了什么?貌似始終是在【512,0】到【1024,0】漸變。但如果你真的這樣以為了,那你就錯了。現在把地圖往右移動,看看會發生什么事?
在這里插入圖片描述
??好像漸變的位置發生了偏移,不是我們最初設定的【512,0】到【1024,0】了。為什么揮發生這種現象。我們來看OpenLayers官網是是怎么解釋的。在OpenLayers官網關于漸變有這樣一段描述:
在這里插入圖片描述
翻譯過來就是

CanvasRenderingContext2D.fillStyle或CanvasRendering Context2D.strokeStyle接受的類型。表示顏色、圖案或漸變。圖案和漸變作為填充樣式的原點是從地圖坐標[0,0]增加512個css像素。對于無縫重復圖案,圖案圖像的寬度和高度必須是兩倍(2,4,8,…,512)。

??重點是這一句:圖案和漸變作為填充樣式的原點是從地圖坐標[0,0]增加512個css像素
??也就是說這個[0,0]是屏幕坐標,不是我們以為的經緯度坐標。而且漸變的位置也不是我們想要的,我們想要的是從某個經緯度到某個經緯度的漸變。

3.2 第二個注意點

??512個css像素是什么意思?
??:屏幕在出廠時就從硬件上面決定了,用幾個物理像素來代表一個css像素。因此才有設備像素比這個參數,也就是我們上文導入的DEVICE_PIXEL_RATIO

4.中心漸變(徑向漸變)

getCenterGradientStyle(polygon){let canvas = document.createElement('canvas');const context = canvas.getContext('2d');let extent = polygon.getExtent()let minLon = extent[0]let maxLon = extent[2]let minLat = extent[1]let maxLat = extent[3]let resolution = this.map.getView().getResolution()const pixelRatio = DEVICE_PIXEL_RATIO;let height = (maxLat - minLat)/resolution*pixelRatiolet width = (maxLon-minLon)/resolution*pixelRatiocanvas.width = widthcanvas.height = heightlet radius = Math.max(height,width)let center = map.getPixelFromCoordinate([(minLon+maxLon)/2,(maxLat+minLat)/2])let gradient = context.createRadialGradient(center[0],center[1],radius/6,center[0],center[1],radius/2)let mainColor = '#56e90e';let secondColor = '#0e57e9';gradient.addColorStop(0,mainColor);gradient.addColorStop(1,secondColor);return gradient;
}
let style = new Style({fill:new Fill({color:this.getCenterGradientStyle()})
})
polygon.setStyle(style)

在這里插入圖片描述

在change:resolution事件中去調用,保證算出來的寬高的正確性

5.總結

??OpenLayers中的漸變效果實在很難令人滿意,又或者是我們理解的有問題,因為其是動態變化的,我們很難得到想要的結果。目前,我們要時刻注意監聽視圖的變化來修改漸變的效果。本文算是拋磚引玉吧,如果某位有志之士能誰能解決掉這個問題,希望能告訴我一下,回見~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713693.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python defaultdict

python中的dict是一個重要的數據類型,知道如何使用這個數據類型很簡單,但是這個類型使用過程中容易進入一些誤區,這篇文章主要對defaultdict方法的講解,深入的了解dict數據類型。 字典(dictionary)數據類型…

編譯鏈接實戰(22)C/C++代碼覆蓋率統計報告生成

文章目錄 GCOV 工具簡介gcov 使用lcov相關編譯選項 GCOV 工具簡介 gcov是一個測試代碼覆蓋率的工具,它是 gcc 自帶的查看代碼覆蓋率的工具。 與GCC結合使用,可以分析您的程序以幫助創建更高效、運行更快的代碼,并發現程序中未經測試的部分。…

PCIE 4.0 L0s/L1/L2

L0是PCIE設備正常工作的狀態,當設備鏈路處于非工作狀態可以跳轉大相應的低功耗狀態,L0s是一種可以快速恢復到L0的低功耗狀態;L1必須經過Reovery狀態才可以恢復到L0狀態;L2需要從Detect開始逐步進入到L0狀態。它們的恢復時間依次延…

麒麟銀河操作系統V10部署ffmpeg(也能用于Linux系統)

麒麟銀河操作系統V10部署ffmpeg(也能用于Linux系統) 部署ffmpeg用來處理視頻的各種操作 想使用ffmpeg,要先安裝nasm,yasm,x264之后,否則會報錯 nkvers 查看麒麟操作系統版本 cat /proc/version #查看linux版本信息 uname -a …

Android修行手冊-Chaquopy中opencv、numpy的初步應用

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC 👉關于作者 專注于Android/Unity和各種游戲開發技巧,以及各種資源分…

SpringBoot源碼解讀與原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自動裝配

文章目錄 前言第13章 SpringBoot整合WebFlux13.1 響應式編程與Reactor13.1.1 命令式與響應式13.1.2 異步非阻塞13.1.3 觀察者模式13.1.4 響應性13.1.5 響應式流13.1.6 背壓13.1.7 Reactor13.1.7.1 Publisher13.1.7.2 Subscriber13.1.7.3 Subscription13.1.7.4 Processor13.1.7.…

BF算法實現(Python,C++)

BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是將目標串S的第一個字符與模式串T的第一個字符進行匹配,若相等,則繼續比較S的第二個字符和 T的第二個字符;若不相等,則比…

Leetcoder Day32| 貪心算法part05

763.劃分字母區間 字符串 S 由小寫字母組成。我們要把這個字符串劃分為盡可能多的片段,同一字母最多出現在一個片段中。返回一個表示每個字符串片段的長度的列表。 示例: 輸入:S "ababcbacadefegdehijhklij"輸出:[9,7…

今日早報 每日精選15條新聞簡報 每天一分鐘 知曉天下事 3月2日,星期六

每天一分鐘,知曉天下事! 2024年3月2日 星期六 農歷正月廿二 1、 氣象局:3月份仍有5次冷空氣影響我國;全國多地或提前入春。 2、 央行:將外籍來華人員移動支付單筆交易限額由1000美元提高到5000美元。 3、 神舟十七號航…

全量知識系統問題及SmartChat給出的答復 之8 三套工具之3語法解析器 之1

Q19. 問題 : 解釋單詞解釋單詞occupied 的字典條目 (word-def occupiedinterest 5type EBsubclass SEBtemplate (script $Demonstrateactor nilobject nildemands nilmethod (scene $Occupyactor nillocation nil))fill (((actor) (top-of *actor-s…

【源碼】imx6ull實現觸摸屏單點實驗

一、本實驗實驗的器材: 1.正點原子imx6ull的阿爾法開發板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、實驗已經移植好的文件: 倉庫代碼:https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件說明 23_multitouch :驅動代…

aws平臺的ec2實例 GNU/Linux系統安裝docker流程

在AWS EC2實例上安裝Docker的流程與其他GNU/Linux系統基本相同。以下是在AWS EC2實例上安裝Docker的一般步驟: 登錄到AWS EC2實例: 使用SSH或者其他遠程登錄方式登錄到你的GNU/Linux實例。 更新系統包管理器: 對于基于Amazon Linux的系統&am…

常見Prometheus exporter部署

常見Prometheus exporter部署 Prometheus部署Node exporterProcess exporterRedis exporterMySQL exporterOracleDB exporter Prometheus部署 本地部署: wget https://github.com/prometheus/prometheus/releases/download/v*/prometheus-*.*-amd64.tar.gz tar xv…

java的jar打包docker鏡像,啟動加載

測試環境,打包鏡像 1,把jar包復制/data/liu/mssda.jar, cd到這個目錄下 2,創建Dockerfile文件,jdk17版本,內容如下 jdk8版本 FROM openjdk:8-jre-alpine WORKDIR /app COPY . /app CMD ["java", "-jar",…

最大奇約數(c++題解)

內存限制: 128 MiB時間限制: 100 ms標準輸入輸出題目類型: 傳統評測方式: 文本比較 題目描述 定義函數f(x)表示x的最大奇約數,這里x表示正整數。例如,f(20) 5,因為20的約數從小到大分別有&am…

奧地利羅馬尼亞媒體宣發稿對跨境出海推廣新聞營銷的意義

【本篇由言同數字科技有限公司原創】在當今全球化的時代,品牌跨境海外推廣已成為企業拓展國際市場的必要途徑。而奧地利和羅馬尼亞是歐洲重要的市場之一,通過在當地媒體上發表文章,可以幫助品牌成功打入這兩個市場,獲得更多的機會…

【YOLO v5 v7 v8 小目標改進】ODConv:在卷積核所有維度(數量、空間、輸入、輸出)上應用注意力機制來優化傳統動態卷積

ODConv:在卷積核所有維度(數量、空間、輸入、輸出)上應用注意力機制來優化傳統的動態卷積 提出背景傳統動態卷積全維動態卷積效果 小目標漲點YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 論文:https://openreview.net/pdf?idDmpCfq6Mg…

leedcode刷題--day7(字符串)

23 文章講解 力扣地址 C class Solution { public:void reverseString(vector<char>& s) {int left 0;int right s.size() - 1; // right 應該初始化為 s.size() - 1while (left < right) {swap(s[left], s[right]); // 直接交換 s[left] 和 s[right] 的值lef…

(學習日記)2024.02.29:UCOSIII第二節

寫在前面&#xff1a; 由于時間的不足與學習的碎片化&#xff0c;寫博客變得有些奢侈。 但是對于記錄學習&#xff08;忘了以后能快速復習&#xff09;的渴望一天天變得強烈。 既然如此 不如以天為單位&#xff0c;以時間為順序&#xff0c;僅僅將博客當做一個知識學習的目錄&a…

WSL2外部網絡設置

1 關閉所有WSL系統 wsl --shutdown 2 打開Hyper-V管理器 3 將“虛擬交換機管理器”-> ”WSL連接類型“設置為“外部網絡” 4 啟動WSL系統&#xff0c;手動修改WSL網絡 將WSL網絡IP修改為192.168.1.9 sudo ip addr del $(ip addr show eth0 | grep inet\b | awk {print $2} |…