七章-80-动态点的效果

2020-03-27  本文已影响0人  彩云飘过

本文基于腾讯课堂老胡的课《跟我学Openlayers--基础实例详解》做的学习笔记,使用的openlayers 5.3.x api。

源码 见 1080.html ,对应的 官网示例 https://openlayers.org/en/latest/examples/dynamic-data.html

image.png

核心技术点:
map.on('postcompose', function(event) {})
map在渲染之后会触发一个postcompose消息,在这个监听函数中,使用cavas绘制好此次渲染的每个点的位置以及样式,最后再调用一次render(),继续触发postcompose,如此形成不间断的cavas的重绘。

image.png
<!DOCTYPE html>
<html>
 <head>
   <title>动态点的效果</title>
   <link rel="stylesheet" href="../include/ol.css" type="text/css" />
   <script src="../include/ol.js"></script>
 </head>
 <style></style>

 <body>

   <div id="map" class="map"></div>
   <div id="info">&nbsp;</div>
   <script>
    var map = new ol.Map({
       layers: [
         new ol.layer.Tile({
           source: new ol.source.OSM()
         })
       ],
       target: 'map',
       view: new ol.View({
         center: [0, 0],
         zoom: 2
       })
     });

     //用于动态的样式
     var imageStyle = new ol.style.Style({
       image: new ol.style.Circle({
         radius: 5,
         fill: new ol.style.Fill({color: 'yellow'}),
         stroke: new ol.style.Stroke({color: 'red', width: 1})
       })
     });

     var headInnerImageStyle = new ol.style.Style({
       image: new ol.style.Circle({
         radius: 2,
         fill: new ol.style.Fill({color: 'blue'})
       })
     });

     var headOuterImageStyle = new ol.style.Style({
       image: new ol.style.Circle({
         radius: 5,
         fill: new ol.style.Fill({color: 'black'})
       })
     });

     var n = 200;
     var omegaTheta = 30000; 
     var R = 7e6;
     var r = 2e6;
     var p = 2e6;
     
     //关键点:postcompose 渲染完成之后 ; precompose 渲染完成之前
     map.on('postcompose', function(event) {
       var vectorContext = event.vectorContext;
       var frameState = event.frameState;
       var theta = 2 * Math.PI * frameState.time / omegaTheta;
       var coordinates = [];
       var i;
       for (i = 0; i < n; ++i) {
         var t = theta + 2 * Math.PI * i / n;
         var x = (R + r) * Math.cos(t) + p * Math.cos((R + r) * t / r);
         var y = (R + r) * Math.sin(t) + p * Math.sin((R + r) * t / r);
         coordinates.push([x, y]);
       }
       vectorContext.setStyle(imageStyle);
       vectorContext.drawGeometry(new ol.geom.MultiPoint(coordinates));
       
       //头部的效果,获取头部的坐标,设置内部样式/外部样式
       var headPoint = new ol.geom.Point(coordinates[coordinates.length - 1]);

       vectorContext.setStyle(headOuterImageStyle);
       vectorContext.drawGeometry(headPoint);

       vectorContext.setStyle(headInnerImageStyle);
       vectorContext.drawGeometry(headPoint);

       map.render(); //render调用时会再次触发postcompose
     });
     map.render();
   </script>
 </body>
</html>

上一篇 下一篇

猜你喜欢

热点阅读