OpenLayers线性渐变和中心渐变(径向渐变)

这篇具有很好参考价值的文章主要介绍了OpenLayers线性渐变和中心渐变(径向渐变)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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'
   }),
 });

OpenLayers线性渐变和中心渐变(径向渐变),OpenLayers,openlayers,线性渐变,中心渐变,渐变,径向渐变

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)

OpenLayers线性渐变和中心渐变(径向渐变),OpenLayers,openlayers,线性渐变,中心渐变,渐变,径向渐变

3.1 第一个注意点

  现在我们的要素在地图的正中间,能看到两个颜色之间的过渡。我们把地图左键进行移动一下,使得要素分别在最后边和最后边,然后再来看看效果。
OpenLayers线性渐变和中心渐变(径向渐变),OpenLayers,openlayers,线性渐变,中心渐变,渐变,径向渐变
OpenLayers线性渐变和中心渐变(径向渐变),OpenLayers,openlayers,线性渐变,中心渐变,渐变,径向渐变
  发现了什么?效果是变化的!所以我们的渐变策略是不太对的,渐变填充应该根据面的范围以及当前所处的位置来进行动态计算。具体来说就是要在createLinearGradient的时候去动态计算.现在我把渐变改成从【512,0】到【1024,0】的渐变,然后我们把地图往左移动,再看看效果

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

OpenLayers线性渐变和中心渐变(径向渐变),OpenLayers,openlayers,线性渐变,中心渐变,渐变,径向渐变
  这次发现了什么?貌似始终是在【512,0】到【1024,0】渐变。但如果你真的这样以为了,那你就错了。现在把地图往右移动,看看会发生什么事?
OpenLayers线性渐变和中心渐变(径向渐变),OpenLayers,openlayers,线性渐变,中心渐变,渐变,径向渐变
  好像渐变的位置发生了偏移,不是我们最初设定的【512,0】到【1024,0】了。为什么挥发生这种现象。我们来看OpenLayers官网是是怎么解释的。在OpenLayers官网关于渐变有这样一段描述:
OpenLayers线性渐变和中心渐变(径向渐变),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)

OpenLayers线性渐变和中心渐变(径向渐变),OpenLayers,openlayers,线性渐变,中心渐变,渐变,径向渐变

在change:resolution事件中去调用,保证算出来的宽高的正确性

5.总结

  OpenLayers中的渐变效果实在很难令人满意,又或者是我们理解的有问题,因为其是动态变化的,我们很难得到想要的结果。目前,我们要时刻注意监听视图的变化来修改渐变的效果。本文算是抛砖引玉吧,如果某位有志之士能谁能解决掉这个问题,希望能告诉我一下,回见~文章来源地址https://www.toymoban.com/news/detail-837442.html

到了这里,关于OpenLayers线性渐变和中心渐变(径向渐变)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue+OpenLayers6从入门到实战进阶案例汇总目录,Vue+OpenLayers6地图整合教程,OpenLayers6中文文档,OpenLayers6中文手册

    本篇作为《Vue+OpenLayers6入门教程》和《Vue+OpenLayers6实战进阶案例》所有文章的二合一汇总目录,方便查找。 本专栏源码是由OpenLayers6.15.1版本结合Vue2框架编写,同时支持Vue3,零星几篇文章用到了Element-UI库。 本专栏从Vue搭建脚手架到如何引入OpenLayers依赖的每一步详细新手教程

    2024年04月23日
    浏览(72)
  • 【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

    需要安装好nodejs,nodejs下载地址,下载对应的版本向导式安装即可。 安装完成后,控制台输入node -v,显示版本号即安装成功。 下载完成后,默认将缓存路径和下载路径设置的C盘,可以使用如下命令修改: 设置之后需要将上面两个地址添加到环境变量中。 安装完成之后控制

    2023年04月09日
    浏览(38)
  • OpenLayers9.1.0版本正式发布,OpenLayers9.1.0值得升级吗?9.1.0版相比9.0.0版本又更新了哪些内容?OpenLayers9相较于OpenLayers8更新了哪些内容?

    Vue+OpenLayers中文教程推荐,不同于OpenLayers官方文档使用html+js原生原生教程,博主专栏包含大量vue整合案例和实际开发案例,非常适合地图开发小白快速入门。 OpenLayers6教程 vue整合OpenLayers6入门教程: 《Vue+OpenLayers6入门教程》 vue整合OpenLayers6实战中文教程,包含大量OpenLayers官

    2024年04月23日
    浏览(37)
  • vue+openlayers,初始化openlayers地图,实现鼠标移入、点击、右键等事件

    主要功能:初始化openlayers地图,实现鼠标移入、点击、右键等事件,以及获取当前图标的feature,将当前图标信息以弹框方式进行展示;地图上展示拾取到的经纬度 前端使用的是vue技术栈 步骤一:将地图的公用配置项单独提出成一个js文件,方便打包后进行修改,代码如下

    2024年02月11日
    浏览(38)
  • OpenLayers实战,OpenLayers结合下拉菜单实现城市切换,动态切换城市边界到地图视图视角范围内

    专栏目录: OpenLayers实战进阶专栏目录 本章是OpenLayers综合实战案例,使用OpenLayers结合下拉菜单实现城市切换,动态切换城市边界到地图视图视角范围内。 本章需要使用到ElementUI的下拉框组件和OpenLayers的TopoJson格式解析地市边界数据并负责渲染,通过动态创建style样式来切换

    2024年02月06日
    浏览(51)
  • Openlayers 常见API (1)

    1、地图 Map 创建地图底图:需要用 new ol.Map({}) 地图 map 是由图层 layers 、一个可视化视图 view 、用于修改地图内容的交互 interaction 以及使用UI组件的控件 control 组成的。 (1)、创建基本地图 (2)、属性选项 (3)、地图事件 地图事件 含义 click 无拖动单击 dblclick 无拖动双击

    2024年02月04日
    浏览(40)
  • openLayers基础地图操作

    和高德地图,百度地图,腾讯地图,Arcgis一样,OpenLayers是一个用于开发WebGIS客户端的JavaScript包。 它有自带的api在线说明官方文档: https://openlayers.org/ 。也有中文api网站: http://linwei.xyz/ol3-primer/ch01/index.html 。 openLayers依赖包npm安装: npm install ol --save openLayers依赖包yarn安装:

    2024年02月05日
    浏览(53)
  • openlayers 地图组件封装

    2024年02月07日
    浏览(43)
  • Openlayers实战:加载GPX文件

    在OPenlayers的交互中,经常性的我们要加载一些数据,在这个实战中,演示的是加载GPX文件。 GPX(GPS eXchange Format,GPS交换格式)是一个XML格式,为应用软件设计的通用GPS数据格式。它可以用来描述路点、轨迹、路程。这个格式是免费的,可以在不需要付任何许可费用的前提下

    2024年02月16日
    浏览(41)
  • openlayers controls基础知识

    控件是一个可见的小部件,其 DOM 元素位于屏幕上的固定位置。 它们可以涉及用户输入(按钮),或者仅提供信息; 位置是使用 CSS 确定的。 默认情况下,它们放置在 CSS 类名为 ol-overlaycontainer-stopevent 的容器中,但可以使用任何外部 DOM 元素。 .在Openlayers中多数Controls直接可

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包