WebGIS的地图渲染|SVG|Canvas|Canvas

说到地图,平时我们使用过百度地图、高德地图、腾讯地图等,如果涉及地图开发需求,也有很多选择,如前面提到的几个地图都会提供一套JS API,此外也有一些开源地图框架可以使用,如OpenLayers、Leaflet、Mapbox、Google Map API、Datamaps、ArcGIS、Zeemaps、Bing Map API等。
问题:些地图是怎么渲染出来的呢?

基于SVG的地图渲染

1.SVG简介

可伸缩矢量图层(Scalable Vector Graphics, SVG)用来定义用于网络中基于矢量的图形。SVG使用XML格式定义图形,可以用来绘制矢量图层。SVG可以通过定义必要的线和形状来创建一个图形,也可以修改已有的位图,或者将这两种方式结合起来创建图形。图形及其组成部分可以形变、合成,或者通过滤镜完全改变外观。

2.SVG的优势

SVG的优势:

  • 基于XML,易于Web发布,跨平台。
  • 采用文本来描述对象。
  • 具有交互性和动态性。
  • 完全支持DOM。

与栅格图片相比,SVG的图形还具有以下优势:

  • 任意放缩
  • 文本独立
  • 较小文件
  • 超强显示效果
  • 超级颜色控制
  • 交互性和智能化

3.SVG的劣势

目前采用DOM渲染SVG的最大问题在于性能,DOM的渲染效率较低,如果在一个页面中,SVG元素太多(如几千甚至上万个),则渲染性能会大打折扣,用户体验不良。

4.基于SVG空间数据表达

SVG提供了丰富的图形对象,这些对象基本可以满足GIS的需要。GIS空间数据可以利用这些图形对象实现。
(1)点状要素。对于点的实现,在SVG中可采取多种办法:

  1. 通过元素 绘制填充颜色的小矩形;
  2. 通过元素 绘制填充颜色的小圆形;
  3. 通过元素 绘制填充颜色的小椭圆;
  4. 通过元素 元素或元素定义相应的点符号,之后通过元素 引用相应的符号来表示;
  5. 通过元素绘制小图标等。

(2)线状要素。

  • 直线可以用表示直线的元素 和用表示路径的元素 来实现;
  • 折线可以用表示折线的元素 来实现,也可以用表示路径的元素 来实现;
  • 曲线可以用表示的路径元素 来实现,可实现弧形曲线、三次贝塞尔曲线和二次贝塞尔曲线三种类型的曲线。

(3)面状要素。当路径是一条闭合的路径时就构成了多边形,通过元素 的fill属性可以用指定的颜色来填充多边形,从而形成GIS中的面。通过元素 可绘制封闭的多边形,通过fill属性对多边形进行填充,也可以形成GIS中的面。
(5)栅格图像。SVG可用元素 直接引用栅格图像。
(6)图层管理。SVG提供了一种非常好的管理图层的方法,即通过元素 <g>管理图层。在SVG中,元素 代表组(Group),每个组都有一个唯一标志ID属性,用来将一批特征相似的元素定义成一个集合,该集合可以包含任何可视化元素。元素 还可以嵌套,对于空间数据的图层分层,这是一种非常简单、有效的方法。例如,所有线数据放在一个元素 <g id="lines">中,对不同类型的线(如道路、河流等),再根据线的类型建立下一级元素 ,最后把各种分类的线数据用SVG的元素添加到最后一层的元素 中,即可实现图层分层。
DOM中的SVG图形对象支持DOM事件编程,可以很方便地对鼠标单击、鼠标滑过等事件进行消息捕获,也可以很容易地用编程方式控制图层的显示和隐藏。

更多svg相关文档:
SVG:可缩放矢量图形 | MDN

Canvas地图渲染

1.Canvas简介

Canvas是HTML5的一个新特性,Canvas又称为画布。顾名思义,我们可以在Canvas上绘制所需的图形。因为HTML中不存在一套二维的绘图API,Canvas本身是一个HTML元素,所以需要HTML元素配合高度和宽度属性来定义一块可绘制区域(上下文),定义区域之后使用JavaScript的脚本绘制图形的HTML元素。
Canvas可以绘制基本的图形,并渲染地图、制作照片、绘制动画,还可以处理和渲染视频等。

2.Canvas绘图的基本过程

(1)创建一个Canvas。Canvas在网页中是一个矩形框,通过元素可创建一个Canvas。

<canvas id="canvas"></canvas>

(2)使用JavaScript绘制图形。元素本身没有绘图能力,所有的绘制工作必须通过JavaScript来完成。

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");ctx.fillStyle = "green";
ctx.fillRect(10, 10, 150, 100);

结果:
image.png

更多资料:
Canvas API - Web API | MDN
- HTML(超文本标记语言) | MDN

3.Canvas与SVG的对比

Canvas与SVG都可以用于地图渲染,但是它们之间还是有较大的不同,适用于不同的场景。下面对Canvas与SVG进行简单的对比。

SVGCanvas
基本原理在SVG中,每个被绘制的图形均被视为对象。如果SVG中的对象属性发生变化,浏览器就能够自动重现图形。Canvas是基于JavaScript来绘制图形的,是逐像素进行地图渲染的。Canvas的位置发生变化时,需要重新绘制图形。
可扩展性SVG是基于矢量的点、线、形状和数学公式来构建图形的,该图形不是基于像素的,放大缩小不会产生失真。
SVG可以在任何分辨率下实现高质量的打印。Canvas是由一个个像素点构成图形的,放大会使图形变得颗粒状和像素化(模糊)。
SVG可以在任何分辨率下实现高质量的打印
渲染能力当SVG很复杂时,地图渲染就会变得很慢,这是因为DOM元素较多时,地图渲染会变得很慢。
当图形中有大量元素时,SVG文件的大小会增加很多。Canvas提供了高性能的地图渲染和更快的图形处理能力,适合复杂的地图渲染。
当图形中有大量元素时,Canvas的大小并不会增加太多。
渲染能力SVG可以通过JavaScript和CSS进行修改,用SVG来创建动画和制作特效都非常方便。Canvas只能通过JavaScript进行修改,创建动画时需要一帧一帧地重绘。
渲染能力SVG非常适合显示矢量徽标(Logo)、图标(Icon)和其他几何设计,现在很多系统都采用了SVG图标、字体等。Canvas主要用于游戏开发、绘制图形、复杂照片的合成,以及对图像进行像素级别的操作,如取色器、复古照片。

WebGL三维渲染

1.WebGL简介

WebGL 使得网页在支持 HTML <canvas> 标签的浏览器中,不需要使用任何插件,便可以使用基于 OpenGL ES 2.0 的 API 在 canvas 中进行 3D 渲染。WebGL 程序由 javascript 的控制代码,和在计算机的图形处理单元(GPU, Graphics Processing Unit)中执行的特效代码 (shader code,渲染代码) 组成。WebGL 元素可以和其他 HTML 元素混合,并且会和页面的其他部分或页面背景相合成。
与传统的前端页面结构相比,WebGL网页多了由三维渲染引擎和OpenGL ES着色器组成的WebGL协议。
image.png
image.png

2.WebGL的处理流程

WebGL的处理流程主要是通过创建的WebGL上下文划分渲染程序部分与数据缓冲区,之后根据数据缓冲区存储的像素数量循环调用着色程序,具体步骤如下:
(1)创建WebGL上下文,使用gl.viewport()函数设置视口(Viewport),把顶点着色器提供的裁剪坐标渲染成画布坐标。
(2)调用着色器程序,初始化顶点着色器和片元着色器。顶点着色器负责把传入的顶点转化成裁剪后的坐标值并发送到GPU的光栅化模块中,模块则把顶点着色器传进来的三个顶点组成的三角形用像素画出来,根据像素的数量决定着色器程序的运行次数。根据WebGL渲染原理,顶点着色器会在片元着色器之前被着色程序执行。
(3)从数据缓冲区中提取数据给着色器程序,激活顶点数据的索引位置,通过索引信息绑定到对应的数据缓冲区。
(4)完成对象创建后对场景的基本组成元素进行设置,对整个三维场景进行渲染。
image.png

更多资料:
WebGL 教程 - Web API | MDN

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建&#xff0c;即 vue create projectName 但是官方更推荐 vite 创建&#xff0c;即 npm create vuelatest&#xff0c;然后从项目名开始配置 总结&#xff1a;入口在 index.html&#xff0c;它会引入 main.ts&#xff0c;…

开源XDR-SIEM一体化平台 Wazuh (1)基础架构

简介 Wazuh平台提供了XDR和SIEM功能&#xff0c;保护云、容器和服务器工作负载。这些功能包括日志数据分析、入侵和恶意软件检测、文件完整性监控、配置评估、漏洞检测以及对法规遵从性的支持。详细信息可以参考Wazuh - Open Source XDR. Open Source SIEM.官方网站 Wazuh解决…

基于x86+FPGA+AI无风扇准系统,AFC自动售检票系统控制器

冰翅无风扇准系统&#xff0c;AFC自动售检票系统建设的理想选择 在交通强国、智慧交通建设的大背景下&#xff0c;人工智能、大数据、计算机及网络技术等正加快融合应用到交通领域&#xff0c;助力提升出行服务的智能化、自动化水平。&#xff08;AFC&#xff09;自动售检票系…

基于 HTML+ECharts 实现的大数据可视化平台模板(含源码)

构建大数据可视化平台模板&#xff1a;基于 HTML 和 ECharts 的实现 大数据的可视化对于企业决策、市场分析和业务洞察至关重要。通过直观的数据展示&#xff0c;团队可以快速理解复杂的数据模式&#xff0c;发现潜在的业务机会。本文将详细介绍如何利用 HTML 和 ECharts 实现一…

qt--做一个拷贝文件器

一、项目要求 使用线程完善文件拷贝器的操作 主窗口不能假死主窗口进度条必须能动改写文件大小的单位&#xff08;自适应&#xff09; 1TB1024GB 1GB1024MB 1MB1024KB 1KB1024字节 二、所需技术 1.QFileDialog 文件对话框 QFileDialog也继承了QDialog类&#xff0c;直接使用静态…

UE4如何直接调试Game

某些功能在编辑器里不好调试&#xff0c;例如Pak&#xff0c;就需要直接调试 Game&#xff0c;做法是选择 Game&#xff0c;不要选择Client&#xff0c;加断点&#xff0c;然后点击 Debug 就好了。 断点调试成功&#xff1a; 同时看到界面&#xff1a;

【无人机】低空经济中5G RedCap芯片的技术分析报告

1. 引言 图一. 新基建&#xff1a;低空经济 低空经济作为一种新兴的经济形态&#xff0c;涵盖了无人机、电动垂直起降飞行器&#xff08;eVTOL&#xff09;、低空物流、空中交通管理等多个领域。随着5G网络的普及和演进&#xff0c;5G RedCap&#xff08;Reduced Capability&a…

pip install albumentations安装下载超级细水管

albumentations 是一个用于图像增强的 Python 库&#xff0c;它提供了丰富的图像变换功能&#xff0c;可以用于数据增强&#xff0c;从而提高深度学习模型的泛化能力。 直接安装命令&#xff1a; pip install albumentations但是如果半夜遇到这种19kB/s的下载速度 为头发着想&…

LeetCode24 两两交换链表中的节点

前言 题目&#xff1a; 24. 两两交换链表中的节点 文档&#xff1a; 代码随想录——两两交换链表中的节点 编程语言&#xff1a; C 解题状态&#xff1a; 没画图&#xff0c;被绕进去了… 思路 思路还是挺清晰的&#xff0c;就是简单的模拟&#xff0c;但是一定要搞清楚交换的…

STM32的外部中断详解

一、什么是中断&#xff1f; 想象一下你正在家里做饭&#xff0c;突然门铃响了&#xff0c;你听到门铃声后&#xff0c;会暂时放下手中的事情&#xff08;比如炒菜&#xff09;&#xff0c;去开门看看是谁。在这个例子中&#xff0c;门铃声就是一个“中断”&#xff0c;它打断…

使用puma部署ruby on rails的记录

之前写过一篇《记录一下我的Ruby On Rails的systemd服务脚本》的记录&#xff0c;现在补上一个比较政治正确的Ruby On Rails的生产环境部署记录。使用Puma部署项目。 创建文件 /usr/lib/systemd/system/puma.service [Unit] DescriptionPuma HTTP Server DocumentationRuby O…

快速入门了解Ajax

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Ajax的初识 意义&#xff1a;AJAX&#xff08;Asynchronous JavaScript and…

rce漏洞-ctfshow(50-70)

Web51 if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\|\%|\x09|\x26/i", $c)){ system($c." >/dev/null 2>&1"); } Nl&#xff0c;绕过tac&#xff0c;cat&#xff0c;绕…

Rce漏洞复习(ctfshow29-50)

Rce漏洞简介思维导图 Web29 代码审计&#xff1a; if(!preg_match("/flag/i", $c)){ eval($c); 传参没有flag&#xff08;大小写都没有出现&#xff09; Payload&#xff1a; ?csystem("ls"); ?csystem("tac *lag.php"); Web30 代码…

【网络流】——初识(最大流)

网络流-最大流 基础信息引入一些概念基本性质 最大流定义 Ford–Fulkerson 增广Edmons−Karp算法Dinic 算法参考文献 基础信息 引入 假定现在有一个无限放水的自来水厂和一个无限收水的小区&#xff0c;他们之间有多条水管和一些节点构成。 每一条水管有三个属性&#xff1a…

rust 初探 -- use

rust 初探 – use Package, Crate, 定义 Module use 关键字 作用&#xff1a;将路径引入到作用域内&#xff0c;其依旧遵循私有性规则&#xff0c;也即只用 pub 的部分引入进来才能使用 use crate::front_of_house::hosting; // 绝对路径 // use front_of_house::hosting; …

【微信小程序实战教程】之微信小程序 WXML 语法详解

WXML语法基础 从本章开始&#xff0c;我们就正式进入到了小程序项目开发学习的初级阶段&#xff0c;本章将介绍小程序的界面构成。有过网页开发学习经历的同学都知道&#xff0c;网页开发所使用的技术是HTML、CSS和JS&#xff0c;其中HTML用于描述整个网页的结构&#xff0c;也…

php反序列化--前置知识

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

Golang | Leetcode Golang题解之第274题H指数

题目&#xff1a; 题解&#xff1a; func hIndex(citations []int) int {// 答案最多只能到数组长度left,right:0,len(citations)var mid intfor left<right{// 1 防止死循环mid(leftright1)>>1cnt:0for _,v:range citations{if v>mid{cnt}}if cnt>mid{// 要找…

【人工智能】Transformers之Pipeline(四):零样本音频分类(zero-shot-audio-classification)

​​​​​​​ 目录 一、引言 二、零样本音频分类&#xff08;zero-shot-audio-classification&#xff09; 2.1 概述 2.2 意义 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数​​​​​​​ 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模…