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*pixelRatio
  let width = (maxLon-minLon)/resolution*pixelRatio
  canvas.width = width
  canvas.height = height
  let 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中的渐变效果实在很难令人满意,又或者是我们理解的有问题,因为其是动态变化的,我们很难得到想要的结果。目前,我们要时刻注意监听视图的变化来修改渐变的效果。本文算是抛砖引玉吧,如果某位有志之士能谁能解决掉这个问题,希望能告诉我一下,回见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/419731.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创意电子名片二维码生成的优势:引领商务交流的全新潮流

在数字化时代,传统的纸质名片已逐渐被创新的电子名片二维码所取代。电子名片生成二维码作为一种便捷、高效的信息交换方式,具有诸多优势。而通过融入二维彩虹技术,电子名片二维码不仅实现了信息的即时传递,更在视觉上为商务交流增…

MySQL的索引和B+tree结构

目录 0.关于索引的常见面试题 1.什么是索引? 索引的优缺点 2.索引的数据结构,为什么InnoDb引擎使用Btree作为索引的数据结构? 分析怎样的索引才是好的 二插搜索树 红黑树 B-Tree BTree 哈希 为什么 InnoDB 存储引擎选择使用 Btree 索…

vue3创建h5 项目使用rem做响应式的配置

第一步 安装依赖: npm install amfe-flexible -S npm install postcss-px2rem -S第二步 main.ts文件中导入 import "amfe-flexible/index.js";第三步 进行配置: vue3 项目中创建 postcss.cinfig.js文件,这里是基于设计稿是750px…

好用的免费的文章一键生成神器

在当今信息爆炸的时代,创作内容是数字营销、网站运营等领域的核心。为了满足日益增长的内容需求,许多GPT生成的软件应运而生,它们能够帮助用户快速生成各种类型的文章,为创作提供了便利和效率。本文将介绍8款不同的免费文章一键生…

springboot3.x 以上,官方不建议使用spring.factories

springboot2.7.x 以上,官方不建议使用spring.factories 最近公司项目升级.需要将springcloud/springboot版本升级到2.7.x以上,再升级的过程中遇到了太多的问题.总结在了如下文章中: springboot艰难版本升级之路!! springboot 2.3.x版本升级到2.7.x版本 这篇文章就重点是梳理一…

力扣180 连续出现的数字

如何有效地识别在数据库中至少连续出现三次的数字? 目录 题目描述 解题思路 完整代码 进一步探索 题目描述 表:Logs ---------------------- | Column Name | Type | ---------------------- | id | int | | num | varch…

安科瑞智慧消防产品在酒店行业的应用

摘要:进入 21 世纪以来,随着网络技术的发展,世界经济呈现全球化趋势,作为消费者衣食住行的重要组成部分,酒店行业也是生活服务市场重要的组成部分。在经济发展的环境下,在旅游业兴起的趋势下,酒…

vue系列——vscode,node.js vue开发环境搭建

第一步安装node.js 推荐使用nvm进行node.js 的安装 nvm(Node.js version manager) 是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 可以去网上查找相关版本 我这里使用 nvm-setu… 链接:https://pan.baidu.com/s/1UEUtmzw5x…

私域运营的7个关键策略

1.通过私域工具实现标签,话术,聚合聊天等 2、公域获客,私域精准化运营,变现解决方案 3、标签化运营,筛选不同层级客户,根据对方需求提供解决方案 4、做私域需要坚持,不断累计信任 5、高复购…

matplotlib——折线图(python)

前言 在学习数据分析前,一定要有python基础,不一定要非常熟练的掌握这门语言,但一定要对python有个大概的了解(就像我一样,大一学过python,但是现在忘的差不多了,但是没关系,有个大…

MYSQL 解释器小记

解释器的结果通常通过上述表格展示: 1. select_type 表示查询的类型 simple: 表示简单的选择查询,没有子查询或连接操作 primary:表示主查询,通常是最外层的查询 subquery :表示子查询,在主查询中嵌套的查询 derived: 表示派…

vue2 开发记录

el-select 如何修改选择项的样式/el-select-dropdown__item 文字上下显示 测试代码 <div stylemargin-left: 100px><!-- 测试代码--><el-select filterablesizemini><div classxxx-el-select><el-optionv-foritem in [{key:1,des:2,…

构建产业图谱,实现产业链精准招商!

​产业链招商是一种以产业链为基础的招商引资方式&#xff0c;它不仅仅关注单个企业的引入&#xff0c;而是侧重于整个产业链的布局和发展&#xff0c;通过吸引产业链上下游相关企业共同入驻&#xff0c;形成产业集群&#xff0c;从而提升地区或园区的产业竞争力和经济效益&…

数据之光:探索数据库技术的演进之路

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

Linux - 基本指令

1、ls 指令 语法&#xff1a;ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件-l …

重塑计算:ICP 打造无限智能合约云解决方案

作者&#xff1a;Lynn Cadet 编译&#xff1a;TinTinLand 原文&#xff1a;https://www.hostingadvice.com/blog/internet-computer-offers-a-limitless-smart-contract-cloud-solution/ 摘要&#xff1a;与其前身互联网一样&#xff0c;区块链行业寻求引领一个新时代及其经济…

力扣-跳跃游戏

问题 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解答 class Solu…

linux系统Jenkins工具添加自由项目和maven项目

Jenkins添加自由项目 添加自由项目操作流程代码远程代码邮件标题邮件正文 添加maven项目准备环境操作流程 添加自由项目 gitlab配置基本代码页面等&#xff0c;拉取代码&#xff0c;打包&#xff0c;发布操作流程 代码 远程代码 echo ssh root192.168.188.177 "tar cz…

C++的常用排序(未完待续)

注&#xff1a;本文以升序为例 一、冒泡排序 1.1 操作方法 步骤1比较相邻元素&#xff0c;如果前者比后者大&#xff0c;则交换它们。步骤2对头到尾&#xff0c;对所有元素按序执行一轮这样的操作(这样可以找到第一最大值)步骤3再从第一个元素开始&#xff0c;重复上述比较操…

数据可视化基础与应用-02-基于powerbi实现连锁糕点店数据集的仪表盘制作

总结 本系列是数据可视化基础与应用的第02篇&#xff0c;主要介绍基于powerbi实现一个连锁糕点店数据集的仪表盘制作。 数据集描述 有一个数据集&#xff0c;包含四张工作簿&#xff0c;每个工作簿是一张表&#xff0c;其中可以销售表可以划分为事实表&#xff0c;产品表&am…