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

在这里插入图片描述

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

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: OpenLayers 是一个用于展示地理信息的开源 JavaScript 库。它提供了丰富的地图控件和操作功能,可以轻松实现地图渐变效果。 在 OpenLayers 中实现渐变效果的方法有很多种,下面我来介绍一种常用的方法。 首先,我们需要添加一个渐变效果的图层。可以使用 OpenLayers 的 Layer 类中的 Image 类来创建一个图层,并指定渐变色作为图层的源。例如,可以使用 CanvasGradient 对象创建一个渐变色,并将其作为图层的源。 然后,我们需要设置渐变图层的样式。可以使用 OpenLayers 的 Style 类来定义图层的样式,包括渐变色的起始点、终止点、颜色和透明度等属性。例如,可以使用 Style 类的 Gradient 类型来指定渐变色的起始点和终止点,并使用 RGBA 格式的颜色值设置渐变色的颜色和透明度。 最后,我们将渐变图层添加到地图中。可以使用 OpenLayers 的 Map 类的 addLayer 方法来将我们创建的渐变图层添加到地图中,并通过设置图层的透明度来控制渐变效果的显示。 通过以上的步骤,我们就可以在 OpenLayers 中实现渐变效果了。当地图视图进行交互时,渐变效果也会相应地更新和变化。这样就可以实现各种各样的渐变效果,例如地图边缘的阴影渐变、区域的颜色渐变等等。 总之,OpenLayers 是一个功能强大的地图展示库,它提供了多种实现渐变效果的方法。通过合理的配置和使用,我们可以轻松地在 OpenLayers 中实现各种炫酷的渐变效果。 ### 回答2: OpenLayers渐变OpenLayers库中的一个功能,它用于在地图上创建和使用过渡效果。一个渐变就是从一个值到另一个值的平滑过渡。在Web开发中,渐变通常用于创建平滑的颜色过渡效果。 在OpenLayers中,可以通过定义一个渐变属性来应用渐变效果。这个渐变属性可以是一个颜色字符串,也可以是一个数组,其中包含了多个颜色值用于产生渐变效果。 使用OpenLayers渐变可以实现一些有趣的效果。例如,在地图上可以根据某个属性值的不同来显示不同的颜色,通过应用渐变可以使得颜色的过渡更平滑。此外,渐变也可以用来表示某个属性的强度或者密度,如通过在地图上绘制一个渐变覆盖层来显示某个属性在空间上的变化。 要使用OpenLayers渐变功能,首先需要在项目中引入OpenLayers的库文件。然后,通过设置渐变属性,将其应用到地图的相应图层或要素上。具体的使用方法可以查阅OpenLayers的官方文档或者参考相关的示例代码。 总之,OpenLayers渐变是一个在地图上创建和使用过渡效果的功能,可以通过设置渐变属性来实现平滑的颜色过渡效果,为Web开发提供了更多互动和可视化的可能性。 ### 回答3: OpenLayers是一种用于构建互动地图应用程序的开源JavaScript库。它提供了各种功能,包括地图显示、图层管理和用户交互。渐变OpenLayers的一个功能,可以应用于地图图层或要素。 在OpenLayers中,可以通过设置渐变来改变地图图层或要素的外观。渐变可以用来实现平滑过渡的颜色效果,使地图或要素看起来更加生动和精美。 要在OpenLayers中应用渐变,可以使用样式对象的fill属性。fill属性控制地图图层或要素的填充样式,包括颜色、不透明度和渐变等。通过设置fill属性的gradient属性为true,可以启用渐变效果。然后,可以使用colors属性指定渐变颜色列表,使用渐变效果将这些颜色进行平滑过渡。 例如,以下代码片段演示了如何在OpenLayers中应用渐变效果: ``` var style = new ol.style.Style({ fill: new ol.style.Fill({ gradient: true, colors: ['#FF0000', '#00FF00', '#0000FF'] }) }); ``` 在这个例子中,新建了一个样式对象,并设置了填充样式的渐变为true。然后,通过colors属性指定了一个颜色列表,包括红色、绿色和蓝色。当渲染地图图层或要素时,OpenLayers将使用渐变效果将这些颜色之间进行平滑过渡。 通过使用OpenLayers渐变功能,可以为地图或要素添加更加富有视觉吸引力的颜色效果,增强用户的交互体验。通过灵活应用不同的颜色渐变方式,可以实现各种定制化的地图显示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIGIS.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值