Openlayers基础知识回顾(五)

news2025/1/11 12:59:07

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VTK知识学习(21)- 数据的读写

1、前言 对于应用程序而言&#xff0c;都需要处理特定的数据&#xff0c;VTK应用程序也不例外。 VTK应用程序所需的数据可以通过两种途径获取: 第一种是生成模型&#xff0c;然后处理这些模型数据(如由类 vtkCylinderSource 生成的多边形数据); 第二种是从外部存储介质里导…

javaWeb之过滤器(Filter)

目录 前言 过滤器概述 什么是过滤器 过滤器详细 过滤器的生命周期 过滤器的应用 创建一个简单的Filter类步骤 注意&#xff1a;指定拦截路径&#xff0c;我们有两种方式 实例 前言 本篇博客的核心 知道过滤器的整个拦截过程知道如何指定拦截路径知道过滤器的生命周期…

如何增强通信监控系统

随着员工工作方式的改变&#xff0c;创建安全的远程通信通道至关重要。这对于数据安全也很重要。通信监控系统是确保数据和网络安全的当务之急。 如今&#xff0c;员工越来越多地使用电子通信。在理想世界中&#xff0c;这些渠道的范围是明确界定的。在现实世界中&#xff0c;…

「Mac玩转仓颉内测版47」小学奥数篇10 - 数列求和

本篇将通过 Python 和 Cangjie 双语实现数列求和的计算。通过这个题目&#xff0c;学生将学会如何通过公式法和循环法求解等差数列与等比数列的和。 关键词 小学奥数Python Cangjie数列求和 一、题目描述 编写一个程序&#xff0c;计算等差数列和等比数列的和。用户输入首项…

Robot Framework的 跳出 for循环

一. 简介 前面简单学习了一下&#xff0c;robotframework中的 for循环语句&#xff0c;文章如下&#xff1a; Robot Framework的 for循环语句-CSDN博客 本文继续学习 有关 for循环的其他操作&#xff0c;例如跳出 for循环&#xff0c;或者退出某一次循环等操作。 二. Robo…

nonolog起步笔记-4-Server端的两个线程

nonolog起步笔记-4-Server端的两个线程 Server端的两个线程两个线程的角色与各自的职责RuntimeLogger::compressionThreadMain线程 详细学习一下相关的代码第三个线程第一次出现原位置swip buffer Server端的两个线程 如前所述&#xff0c;nanolog的server端&#xff0c;相对而…

️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南20241206

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南 &#x1f4dd; 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能的飞速发展&#xff0c;越来越多的开发者尝试在本地环境中部署大模型进行实验。然而&#xff0c;由于资源需求高、网络限制多…

js:事件监听

事件监听 事件监听&#xff1a;让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就调用一个函数做出响应&#xff0c;也称为绑定事件或注册事件 事件&#xff1a;编程系统内发生的动作或发生的事情 比如用户单击一个按钮下拉菜单 添加事件监听 事件监听三要…

C# (WinForms) 使用 iTextSharp 库将图片转换为 PDF

iTextSharp简介 iTextSharp 是一个开源的 .NET 库&#xff0c;主要用于创建和操作 PDF 文档。它是 iText 的 .NET 版本&#xff0c;iText 是一个广泛使用的 Java 库。iTextSharp 继承了 iText 的核心功能并进行了适应 .NET 平台的调整。 iTextSharp 的主要功能包括&#xff1a…

使用 WebRtcStreamer 实现实时视频流播放

WebRtcStreamer 是一个基于 WebRTC 协议的轻量级开源工具&#xff0c;可以在浏览器中直接播放 RTSP 视频流。它利用 WebRTC 的强大功能&#xff0c;提供低延迟的视频流播放体验&#xff0c;非常适合实时监控和其他视频流应用场景。 本文将介绍如何在Vue.js项目中使用 WebRtcSt…

mysql5.7和mysql8.0安装教程(超详细)

目录 一、简介 1.1 什么是数据库 1.2 什么是数据库管理系统&#xff08;DBMS&#xff09; 1.3 数据库的作用 二、安装MySQL 1.1 国内yum源安装MySQL5.7&#xff08;centos7&#xff09; &#xff08;1&#xff09;安装4个软件包 &#xff08;2&#xff09;找到4个软件包…

ALSA笔记

alsa笔记 ALSA(Advanced Linux Sound Architecture)简介 以上是android和linux系统的音频整体架构图,他们不同的区别主要是在用户空间,Linux通过ALSA-Lib来和ALSA交互,而android则是tingyAlsa,其位于aosp源码根目录的/external/tinyalsa下; 在Kernel层,Alsa向上封装的D…

哈希表实现

哈希概念 哈希&#xff08;hash&#xff09;又称散列&#xff0c;是一种组织数据的方式。从译名来看&#xff0c;有散乱排列的意思。本质就是通过哈希函数把关键字 Key 跟存储位置建立一个映射关系&#xff0c;查找时通过这个哈希函数计算出 Key 存储的位置&#xff0c;进行快…

web复习(四)

JavaScript编程 1.计算圆的面积。 &#xff08;1&#xff09;表单中设置2个文本框、1个按钮、1个重置按钮&#xff0c;其中圆的面积文本框设置为只读&#xff1b; &#xff08;2&#xff09;编写两个自定义函数&#xff0c;分别是计算圆的面积函数area&#xff08;radius&…

第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展

第六届知交会暨地博会&#xff1a;世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日&#xff0c;第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…

【期末复习】编译原理

1. 语法描述 1.1. 上下文无关文法 1.2. 句子 & 句型 & 语言 推导出来的都是句型但是如果句型中只含有终结符&#xff0c;那就是句子所有的句子合起来&#xff0c;才是语言 1.3. 文法 文法就是推导的式子。 1.4. 文法二义性 1.5. 文法二义性证明——根据最左 \ 最右推…

AI绘画设计实战-Day2

Stable Diffusion 提示词前缀 FF,(masterpiece:1.2),best quality,highres,extremely detailed CG,perfect lighting,8k wallpaper,anime,comic,game CG, FF&#xff0c;&#xff08;杰作&#xff1a;1.2&#xff09;&#xff0c;最高质量&#xff0c;高分辨率&#xff0c;极其…

python数据分析之爬虫基础:requests详解

1、requests基本使用 1.1、requests介绍 requests是python中一个常用于发送HTTP请求的第三方库&#xff0c;它极大地简化了web服务交互的过程。它是唯一的一个非转基因的python HTTP库&#xff0c;人类可以安全享用。 1.2、requests库的安装 pip install -i https://pypi.tu…

鸿雁电器发力,能否抢占康养卫浴新蓝海?

经济下行&#xff0c;叠加房地产行业的调整以及数智化浪潮的强劲推动&#xff0c;建材行业正面临着前所未有的变革与机遇。为了更好地把握行业趋势&#xff0c;求新求变&#xff0c;12月9日&#xff0c;鸿雁电器在青山湖园区鸿雁物联网大厦17楼鸿鹄厅成功举办了第四届“智创变革…

Scratch教学作品 | 3D飞行模拟器——体验飞行的无限乐趣! ✈️

今天为大家推荐一款令人惊叹的Scratch作品——《3D飞行模拟器》&#xff01;由BamBozzle制作&#xff0c;这款游戏完全用Scratch构建&#xff0c;带你体验开放世界飞行的自由与乐趣。从起飞到降落&#xff0c;每一步都需要你的精准操作&#xff01;更棒的是&#xff0c;这款游戏…