openlayers 好玩的效果之流动线

老规矩先看效果图

 使用的是vue + openlayers 

思路:加载一个线的geojson 数据,实例化geojsonLayer 加载到地图上,拿到图层的features ,将feature 的style stroke 中的 lineDashoffset 定时改变即可

部分核心代码:(不好意思哈各位,只能上部分核心代码了,完整的vue 页面和示例数据,我放到资源中心去下载,最近囊中羞涩,积分严重不足,赚点积分)

geojsonLayer.getSource().on('featuresloadend',evt=>{
        geojsonLayer.getSource().getFeatures().forEach(item=>{
          setInterval(()=>{
            let style  =  item.getStyle();
            if(style == undefined){
              item.setStyle(
                [new Style({
                  stroke: new Stroke({
                    color: "rgba(30,144,255, 0.7)",
                    width: 2,
                  })
                }),
                  new Style({
                    stroke:new Stroke({
                      color: [255, 250, 250, 1],
                      width: 2,
                      lineDash: [20, 27], 
                      lineDashOffset:0
                    })
                  })]
              )
            }else {
              let lineDashOffset = item.getStyle()[1].getStroke().getLineDashOffset();
              item.setStyle(
                [new Style({
                  stroke: new Stroke({
                    color: "rgba(30,144,255, 0.7)",
                    width: 2,
                  })
                }),
                  new Style({
                    stroke:new Stroke({
                      color: [255, 250, 250, 1],
                      width: 2,
                      lineDash: [2, 7],
                      lineDashOffset:lineDashOffset==8 ?0:lineDashOffset+1
                    })
                  })]
              )
            }
          },100)
        })
      })

其中拿取到的feature 是没有style 的,然后给他设置的style ,所以多判断了一个,如果你刚开始创建的feature 加载到图层就可以省略这个判断。

资源下载地址vueopenlayers流动线效果-Javascript文档类资源-CSDN下载

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现OpenLayers中的直线流动效果,您可以使用OpenLayers的`animate`函数和`LineString`对象。以下是一个简单的示例代码,其中将在地图上绘制一条线,并将其沿着线路进行流动: ```javascript // 创建地图 var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat([37.41, 8.82]), zoom: 4 }) }); // 创建线对象 var line = new ol.geom.LineString([ ol.proj.fromLonLat([37.41, 8.82]), ol.proj.fromLonLat([38.41, 9.82]), ol.proj.fromLonLat([39.41, 10.82]) ]); // 创建线要素 var feature = new ol.Feature({ geometry: line, name: 'line' }); // 创建线要素图层 var vectorLayer = new ol.layer.Vector({ source: new ol.source.Vector({ features: [feature] }) }); map.addLayer(vectorLayer); // 设置动画 var speed = 0.1; // 每秒移动的距离 var startTime = new Date().getTime(); function animateLine() { var time = new Date().getTime() - startTime; var distance = speed * time / 1000; // 计算移动距离 var coords = line.getCoordinates(); var newCoords = []; for (var i = 0; i < coords.length - 1; i++) { var segmentLength = ol.sphere.getDistance(coords[i], coords[i+1]); var segmentFraction = distance / segmentLength; if (segmentFraction >= 1) { newCoords.push(coords[i+1]); } else { var segment = new ol.geom.LineString([coords[i], coords[i+1]]); var segmentCoords = segment.getCoordinates(); var newSegmentCoords = []; for (var j = 0; j < segmentCoords.length - 1; j++) { var dx = segmentCoords[j+1][0] - segmentCoords[j][0]; var dy = segmentCoords[j+1][1] - segmentCoords[j][1]; var segmentLength = Math.sqrt(dx*dx + dy*dy); var segmentFraction = distance / segmentLength; var x = (1 - segmentFraction) * segmentCoords[j][0] + segmentFraction * segmentCoords[j+1][0]; var y = (1 - segmentFraction) * segmentCoords[j][1] + segmentFraction * segmentCoords[j+1][1]; newSegmentCoords.push([x, y]); } newCoords.push.apply(newCoords, newSegmentCoords); } } var newLine = new ol.geom.LineString(newCoords); feature.setGeometry(newLine); if (newCoords.length > 1) { requestAnimationFrame(animateLine); } } animateLine(); ``` 在这个示例中,我们首先创建了一个包含三个坐标点的`LineString`对象,并将其作为一个要素添加到地图上。然后,我们使用`animateLine`函数来实现直线流动效果,该函数使用`requestAnimationFrame`函数来实现平滑动画。在每个动画帧中,我们计算出线要素的新位置,并将其设置为要素的几何形状。最后,我们使用递归调用`animateLine`函数来实现连续的动画效果

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Giser_往事随风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值