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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933656.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 ASP.NET Core HttpLoggingMiddleware 记录 http 请求/响应

我们发布了一个应用程序&#xff0c;该应用程序运行在一个相当隐蔽的 WAF 后面。他们向我们保证&#xff0c;他们的产品不会以任何方式干扰我们的应用程序。这是错误的。他们删除了我们几乎所有的“自定义”标头。为了“证明”这一点&#xff0c;我构建了一个中间件&#xff0c…

后端工程搭建

后端工程通过maven聚合工程的形式来搭建 1.1创建spzx-parent工程(父工程) 存放公共依赖 锁定公共依赖版本 1.2创建spzx-common工程(公共模块) 存放一些工具类/公共服务 1.3创建spzx-model工程(数据模型) 存放实体类 1.4创建spzx-menager工程(后台管理系统) 后台管理系统服务模…

Flink Python作业快速入门

Flink Python快速入门_实时计算 Flink版(Flink)-阿里云帮助中心 import argparse # 用于处理命令行参数和选项&#xff0c;使程序能够接收用户通过命令行传递的参数 import logging import sysfrom pyflink.common import WatermarkStrategy, Encoder, Types from pyflink.data…

数字图像处理(15):图像平移

&#xff08;1&#xff09;图像平移的基本原理&#xff1a;计算每个像素点的移动向量&#xff0c;并将这些像素按照指定的方向和距离进行移动。 &#xff08;2&#xff09;平移向量包括水平和垂直分量&#xff0c;可以表示为&#xff08;dx&#xff0c;dy&#xff09;&#xff…

JAVA秋招面试题精选-第一天总结

目录 分栏简介&#xff1a; 问题一&#xff1a;订单表每天新增500W条数据&#xff0c;分库分表应该怎么设计&#xff1f; 问题难度以及频率&#xff1a; 问题导向&#xff1a; 满分答案&#xff1a; 举一反三&#xff1a; 问题总结&#xff1a; 问题二&#xff1a;解释…

Rnnoise和SpeexDsp两种降噪方式有什么区别?

在蒙以CourseMaker 7.0软件中&#xff0c;增加了两种降噪模式&#xff0c;一种是Rnnoise&#xff0c;一种是SpeexDsp&#xff0c;这两种降噪模式有什么区别呢&#xff1f; Rnnoise 基于神经网络。当噪声与 rnnoise 的模型训练的噪声匹配时&#xff0c;它的效果非常好。比如说&…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…

福昕PDF低代码平台

福昕PDF低代码平台简介 福昕PDF 低代码平台是一款创新的工具&#xff0c;旨在简化PDF处理和管理的流程。通过这个平台&#xff0c;用户可以通过简单的拖拽界面上的按钮&#xff0c;轻松完成对Cloud API的调用工作流&#xff0c;而无需编写复杂的代码。这使得即使没有编程经验的…

Linux —— 管理文件

一、Linux的目录结构及用途 /bin&#xff1a;存放最常用的命令&#xff0c;如ls、cat等&#xff0c;所有用户都可以执行的命令。/boot&#xff1a;包含启动Linux系统所需的核心文件&#xff0c;如内核文件和引导加载程序。/dev&#xff1a;设备文件目录&#xff0c;包含系统中的…

NanoLog起步笔记-7-log解压过程初探

nonolog起步笔记-6-log解压过程初探 再看解压过程建立调试工程修改makefile添加新的launch项 注&#xff1a;重新学习nanolog的README.mdPost-Execution Log Decompressor 下面我们尝试了解&#xff0c;解压的过程&#xff0c;是如何得到文件头部的meta信息的。 再看解压过程 …

处理配置System Viewer缺少SFR文件

按照网上的教程&#xff0c;其他的都配好 这里给几个参考 嵌入式开发--Keil MDK仿真时System Viewer不显示寄存器选项_keil system viewer不显示外设寄存器-CSDN博客 keil无法查看外设寄存器&#xff08;生成SFR文件&#xff09;_keil sfr文件-CSDN博客 keil5软件仿真 Logic…

网络安全中大数据和人工智能应用实践

传统的网络安全防护手段主要是通过单点的网络安全设备&#xff0c;随着网络攻击的方式和手段不断的变化&#xff0c;大数据和人工智能技术也在最近十年飞速地发展&#xff0c;网络安全防护也逐渐开始拥抱大数据和人工智能。传统的安全设备和防护手段容易形成数据孤岛&#xff0…

create-react-app react19 搭建项目报错

报错截图 此时运行会报错&#xff1a; 解决方法&#xff1a; 1.根据提示安装依赖法 执行npm i web-vitals然后重新允许 2.删除文件法 在index.js中删除对报错文件的引入&#xff0c;删除报错文件

excel如何让单元格选中时显示提示信息?

现象&#xff1a; 当鼠标放在单元格上&#xff0c;会出现提示信息&#xff1a; 先选中单元格选择上方的【数据】-【数据验证】图标选择【输入信息】勾上【选定单元格时显示输入信息】输入【标题】&#xff0c;如&#xff1a;最上方图中的&#xff1a;姓名&#xff1a;输入【输…

PyCharm+Selenium+Pytest配置小记

1、下载ChromeDriver&#xff1a; Chrome130以后的Driver下载&#xff1a; Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ &#xff08;1&#xff09;查看自己Crome浏览器的版本&#xff1a;设置-->关于 Chrome&#xff1b; &…

用最小的代价解决mybatis-plus关于批量保存的性能问题

1.问题说明 问题背景说明&#xff0c;在使用达梦数据库时&#xff0c;mybatis-plus的serviceImpl.saveBatch()方法或者updateBatchById()方法的时候&#xff0c;随着数据量、属性字段的增加&#xff0c;效率越发明显的慢。 serviceImpl.saveBatch(); serviceImpl.updateBatch…

电子商务人工智能指南 4/6 - 内容理解

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

Helm安装Mysql8主从复制集群

目录 一、Helm安装 二、安装mysql 1、拉取镜像 2、修改配置文件 3、创建mysql-secret 4、安装 一、Helm安装 这里不再赘叙&#xff0c;具体安装请参考官网 Helm | 快速入门指南 二、安装mysql 1、拉取镜像 #添加仓库 helm repo add bitnami https://charts.bitnami.c…

Java并发编程学习之从资本家的角度看多线程和并发性(一)

目录 前言前置知识一、单线程时代二、为什么要有多线程&#xff0c;多线程的优点&#xff1f;三、使用多线程会遇到什么问题&#xff1f;四、多线程和并发编程的关系总结 前言 这篇文章是打开Java多线程和并发编程的大门的开始&#xff0c;如标题《从老板的角度看多线程和并发…

【爬虫】selenium打开浏览器以及页面

本篇探讨如何使用 selenium 打开浏览器 selenium 基础与网页打开 selenium 是一个广泛应用于自动化测试和网页抓取的工具&#xff0c;它能够模拟用户在浏览器中的各种操作。首先&#xff0c;我们需要根据指定的浏览器类型&#xff08;这里以 Chrome 为例&#xff09;打开网页…