自学内容网 自学内容网

Openlayers基础知识回顾(五)

1、GeoJSON数据的加载

GeoJSON是一种基于JSON的地理空间数据交换格式,它定义了几种类型JSON对象以及它们组合在一起的方法,以表示有关地理要素、属性和它们的空间范围的数据

2、GeoJSON转化为ol要素

new ol.format.GeoJSON().readFeatures()

一、canvas

1、关于canvas

1、概念

HTML5新增的一个标签,区别css地方,它是使用JavaScript来实现图形的绘制,结合webgl实现复杂的图形绘制。

2、绘制矩形
<canvas id="canvas" width="200" height="200"></canvas>
<script>
        /* 获取画布canvas */
        var canvas = document.getElementById("canvas");
        /* 获取canvas上下文
         getContext('2d')可以返回一个对象,该对象提供了绘图的方法和属性
         */
        const ctx = canvas.getContext("2d");
        /* fillStyle属性设置图形的填充色 和css的background-color类似 */
        ctx.fillStyle= "#6528e0";
        /* fillRect(x,y,width,height)设置矩形 */
        ctx.fillRect(10,10,100,100)
        
      
</script>
3、canvas中的坐标

canvas 是一个二维网格。

canvas 的左上角坐标为 (0,0)

上面的 fillRect 方法拥有参数 (10,10,100,100)。

意思是:在左上角开始 (10,10)的位置,绘制100*100的图形

4、路径-线

所谓路径:就是连续的坐标点的集合

在Canvas上画线,我们将使用以下两种方法:

  • moveTo(x,y) 定义线条开始坐标
  • lineTo(x,y) 定义线条结束坐标
<canvas id="canvas" width="200" height="200"></canvas>
<script>
        /* 获取画布canvas */
        var canvas = document.getElementById("canvas");
        /* 获取canvas上下文
        getContext('2d')方法返回一个对象,这个对象可以绘制多种图形
         */
        const ctx = canvas.getContext("2d");
       /* 路径 */
       ctx.lineWidth = 5;
       ctx.moveTo(0,0);
       ctx.lineTo(100,100);
       ctx.strokeStyle = "#ff2d51";
       ctx.stroke();
</script>

2、圆

1、绘制弧线

arc(x, y, radius, startAngle, endAngle, anticlockwise): 以(x, y) 为圆心,以radius 为半径,从 startAngle 弧度开始到endAngle弧度结束。anticlosewise 是布尔值,true 表示逆时针,false 表示顺时针(默认是顺时针)。

注意:

  1. 这里的度数都是弧度。
  2. 0 弧度是指的 x 轴正方向。radians=(Math.PI/180)*degrees //角度转换成弧度
2、空心圆
 <canvas id="canvas" width="200" height="200"></canvas>
    <script>
        /* 1、获取画布 */
        let canvas = document.getElementById("canvas");
        /* 2、获取绘制上下文 */
        let ctx = canvas.getContext("2d");
        /* 设置路径 */
        ctx.beginPath();
        /* 第一,第二参数 中心 */
        /* 第三个参数 半径 */
        /* 第四个参数 开始的弧度 */
        /* 第五个参数  结束的弧度 */
        /* ctx.arc(x,y,radius,startAngle,endAngle) */
        ctx.arc(100, 100, 50, 0, Math.PI*2)
        ctx.closePath();
        ctx.stroke();
    </script>
3、实心圆

4、圆环

<body>
    <canvas id="canvas" width="200" height="200"></canvas>
    <script>
        /* 1、画布 */
        var canvas = document.getElementById("canvas");
        /* 2、context */
        var ctx = canvas.getContext("2d");
        /* 3、绘制 */
        /* 第一个圆 */
        ctx.beginPath();
        ctx.arc(100, 100, 50, 0, Math.PI * 2);
        ctx.closePath();
        ctx.fillStyle = "#ff2d51"
        ctx.fill();
        /* 第二个圆 */
        ctx.beginPath();
        ctx.arc(100, 100, 30, 0, Math.PI * 2);
        ctx.closePath();
        ctx.fillStyle = "#1248F8";
        ctx.fill();
    </script>
</body>
5、动画圆

<body>
    <canvas id="canvas" width="200" height="200"></canvas>
    <script>
        /* 1、画布 */
        var canvas = document.getElementById("canvas");
        /* 2、context */
        var ctx = canvas.getContext("2d");
        let increase = true;
        let radius = 50;
        /*
        50~80
        <50   true  radius ++
        >80   false radius --
         */
        function draw() {
            /* 清空画布 */
            ctx.clearRect(0, 0, canvas.width, canvas.height)
            /* 圆 */
            ctx.beginPath()
            ctx.arc(100, 100, radius, 0, Math.PI * 2)
            ctx.closePath();
            ctx.fillStyle = "#652e80"
            ctx.fill();
            if (radius > 80) {
                increase = false;
            } else if (radius < 50) {
                increase = true;
            }
            if (increase) {
                radius++;
            } else {
                radius--;
            }
        }
        setInterval(() => {
            draw()
        }, 20)
    </script>
</body>
6、多圈动画圆

<body>
    <canvas id="canvas" width="200" height="200"></canvas>
    <script>
        /* 1、画布 */
        var canvas = document.getElementById("canvas");
        /* 2、context */
        var ctx = canvas.getContext("2d");
        let increase = true;
        let radius = 50;
        /*
        50~80
        <50   true  radius ++
        >80   false radius --
         */
        function draw() {
            /* 清空画布 */
            ctx.clearRect(0, 0, canvas.width, canvas.height)
            /* 第一个圆 */
            ctx.beginPath()
            ctx.arc(100, 100, radius, 0, Math.PI * 2)
            ctx.closePath();
            ctx.fillStyle = "#ff2d51"
            ctx.fill();
            /* 第二个圆  写死 */
            ctx.beginPath()
            ctx.arc(100, 100, 40, 0, Math.PI * 2)
            ctx.closePath();
            ctx.fillStyle = "#1248F8"
            ctx.fill();
            if (radius > 70) {
                increase = false;
            } else if (radius < 50) {
                increase = true;
            }
            if (increase) {
                radius++;
            } else {
                radius--;
            }
            setTimeout(draw, 50)
        }
        draw();
    </script>
</body>

3、openlayers结合canvas

1、canvas-style
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./OL_SDK/include-openlayers-local.js"></script>
    <script src="./libs/gaode.js"></script>
</head>

<body>
    <div id="map">
    </div>
    <script>
        var map = new ol.Map({
            target: "map",
            layers: [gaode],
            view: new ol.View({
                projection: 'EPSG:4326',
                center: [114.30, 30.50],
                zoom: 4
            })
        })
        /* canvas-style */

        /* 设置空的source图层 */
        let source = new ol.source.Vector({})
        let layer = new ol.layer.Vector({
            source
        })
        map.addLayer(layer)
        /* canvas-style */
        let size = 100;
        let canvas = document.createElement("canvas");
        canvas.width = size;
        canvas.height = size;
        /* 设置半径 */
        let radius = size / 4;
        /* 绘制 */
        let ctx = canvas.getContext("2d");
        ctx.beginPath();
        ctx.arc(50, 50, radius, 0, Math.PI * 2);
        ctx.closePath();
        ctx.fillStyle = "#ff2d51";
        ctx.fill();
        /* 设置canvas元素为openlayers的样式 */
        let style = new ol.style.Style({
            image: new ol.style.Icon({
                img: canvas,
                imgSize: [canvas.width, canvas.height]
            })
        })
        var point = new ol.Feature({
            geometry: new ol.geom.Point([114.30, 30.50])
        })
        point.setStyle(style);
        source.addFeature(point);
    </script>
</body>

</html>
2、初步封装setCanvasStyle
function setCanvasStyle(size) {
  let canvas = document.createElement("canvas");
  let ctx = canvas.getContext("2d");
  canvas.width = size;
  canvas.height = size;
  /* 设置半径 */
  let radius = size / 4;
  /* 绘制 */
  ctx.beginPath();
  ctx.arc(size / 2, size / 2, radius, 0, Math.PI * 2);
  ctx.closePath();
  ctx.fillStyle = "#ff2d51";
  ctx.fill()
  /* 设置canvas元素为openlayers的样式 */
  let style = new ol.style.Style({
    image: new ol.style.Icon({
      img: canvas,
      imgSize: [canvas.width, canvas.height]
    })
  })
  return style;
}
3、动画圆-setCanvasStyle
function setCanvasStyle(map, size) {
    /* canvas-style */
    let canvas = document.createElement("canvas");
    let ctx = canvas.getContext("2d");
    canvas.width = size;
    canvas.height = size;
    /* 设置半径 */
    /* 如果 size = 40 编辑 radius 10 */
    let radius = size / 4;
    let increase = true;
    /* 10~16 */
    function draw() {
        /* 清空画布 */
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.beginPath();
        ctx.arc(size / 2, size / 2, radius, 0, Math.PI * 2);
        ctx.closePath();
        ctx.fillStyle = "#652e80";
        ctx.fill();
        if (radius > (size / 4 + 6)) {
            increase = false
        } else if (radius < size / 4) {
            increase = true;
        }
        if (increase) {
            radius++;
        } else {
            radius--;
        }
        setTimeout(draw, 50);
        /* render */
        map.render();
    }
    /* 触发动画 */
    draw();
    /* 将canvas元素转化openlayers的样式 */
    let style = new ol.style.Style({
        image: new ol.style.Icon({
            img: canvas,
            imgSize: [canvas.width, canvas.height]
        })
    })
    return style;
}


原文地址:https://blog.csdn.net/qq_45751819/article/details/144352623

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!