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.mzph.cn/pingmian/50167.shtml

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

相关文章

EasyExcel 初使用—— Java 实现多种写入 Excel 功能

前言 大家好&#xff0c;我是雪荷。之前有一篇博客&#xff08;EasyExcel 初使用—— Java 实现读取 Excel 功能_java easyexcel.read-CSDN博客&#xff09;介绍了 Java 如何读取 Excel 表格&#xff0c;那么此篇博客就和大家介绍下 Java 如何利用 EasyExcel 写入 Excel。 Ea…

使用阿里云云主机通过nginx搭建文件服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备基础环境二、安装配置nginx三、阿里云安全组配置安全组配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4ee96f38312e4771938e40f463987…

React Router-v6.25.1

以下例子是根据vitereactts构建的&#xff0c;使用路由前先安装好这些环境&#xff01;&#xff01;&#xff01;&#xff01; 1、路由的简单使用 首先要创建一个浏览器路由器并配置我们的第一个路由。这将为我们的 Web 应用启用客户端路由。 该main.jsx文件是入口点。打开它…

数字看板:跨行业需求下的创新与升级

在当今这个数据驱动的时代&#xff0c;数字看板作为信息展示与决策支持的重要工具&#xff0c;正逐步渗透到各行各业之中。从智慧城市到智能制造&#xff0c;从金融分析到医疗健康&#xff0c;数字看板以其直观、动态、高效的特点&#xff0c;成为了连接数据与决策者的桥梁。本…

Linux系列--shell编程一

一、Linux系统结构 一、内核层 内核是Linux系统的核心部分&#xff0c;它负责管理系统各种硬件设备、文件系统、内存管理和进程管理等核心任务。Linux内核设计了良好的模块化结构&#xff0c;可以动态地加载和卸载内核模块&#xff0c;这使得内核可以兼容各种不同的硬件设备和…

基于联咏 NT98692芯片赋能边缘计算IP摄像机与XVR监控系统解决方案

联咏 NT98692 是一款新世代整合度极高的 SoC&#xff0c;具有高影像品质、低位元率、低功耗&#xff0c;针对 8Kp30 边缘运算 IP 摄影机与后端监控系统 XVR 应用。此 SoC 整合了 ARM Quad Cortex A73 CPU 核心、新一代 ISP 和 AI ISP、H.265/H.264 视讯压缩编解码器、DSP、高效…

C++ primer plus 第16章string 类和标准模板库, 函数符概念

C primer plus 第16章string 类和标准模板库, 函数符概念 C primer plus 第16章string 类和标准模板库, 函数符概念 文章目录 C primer plus 第16章string 类和标准模板库, 函数符概念16.5.1 函数符概念程序清单16.15 functor.cpp 16.5.1 函数符概念 正如 STL定义了容器和迭代…

数据结构和算法入门

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着科技的不断进步&#xff0c;智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化&#xff0c;安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态&#xff0c;从而提高应急响…

XSS攻击与CSRF攻击

XSS攻击 XSS&#xff08;Cross Site Scripting&#xff0c;跨站脚本攻击&#xff09;&#xff0c;是指攻击者利用站点的漏洞&#xff0c;在表单提交时&#xff0c;在表单内容中加入一些恶意脚本&#xff0c;当其他正常用户浏览页面&#xff0c;而页面中刚好出现攻击者的恶意脚…

ffmpeg更改视频的帧率

note 视频帧率调整 帧率(fps-frame per second) 例如&#xff1a;原来帧率为30&#xff0c;调整后为1 现象&#xff1a;原来是每秒有30张图像&#xff0c;调整后每秒1张图像&#xff0c;看着图像很慢 实现&#xff1a;在每秒的时间区间里&#xff0c;取一张图像…

【数据结构】手把手教你单链表(c语言)(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 1.单链表的概念与结构 2.单链表的结构定义 3.单链表的实现 3.1 单链表的方法声明 3.2 单链表方法实现 3.2.1 打印链表 3.2.2 创建新…

四、GD32 MCU 常见外设介绍(8)SPI 模块介绍

串行外设接口&#xff08;Serial Peripheral Interface&#xff0c;缩写为 SPI&#xff09; 提供了基于SPI 协议的数据发送和接收功能&#xff0c; 可以工作于主机或从机模式。 SPI 接口支持具有硬件 CRC 计算和校验的全双工和单工模式。 8.1.SPI 基础知识 SPI 物理层 SPI接…

基于dcm4chee搭建的PACS系统讲解(三)服务端使用Rest API获取study等数据

文章目录 DICOMWeb Support模块主要数据结构ER查询信息基本信息metadata信息统计信息 实践查询API及参数解析API返回的json数组定义VRObjectNodeObjectMapper解析显示指定tag并解析 后记 前期预研的PACS系统&#xff0c;近期要在项目中上线了。因为PACS系统采用无权限认证&…

qt--电子相册

一、项目要求 设计一个电子相册&#xff0c;点击上一张&#xff0c;切换到上一张图片&#xff0c;点击下一张&#xff0c;切换到下一张图片。 要求&#xff1a;图片的展示可以循环&#xff08;QList<QString>&#xff09; 要求&#xff1a;界面美观 二、项目代码 本质是通…

概率论--矩估计

目录 简介 矩估计法的基本步骤 延伸 矩估计法在大样本情况下的准确性和有效性如何评估&#xff1f; 在实际应用中&#xff0c;矩估计法的局限性有哪些具体例子&#xff1f; 如何处理矩估计法在某些情况下可能出现的不合理解或无法唯一确定参数的问题&#xff1f; …

vue3前端开发-小兔鲜项目-form表单的统一校验

vue3前端开发-小兔鲜项目-form表单的统一校验&#xff01;实际上&#xff0c;为了安全起见&#xff0c;用户输入的表单信息&#xff0c;要满足我们的业务需求&#xff0c;参数类型等种种标准之后&#xff0c;才会允许用户向服务器发送登录请求。为此&#xff0c;有必要进行一次…

gstreamer使用cairo实现视频OSD叠加

前言 gstreamer中视频叠加OSD有很多种方式&#xff0c;比如textoverlay添加文字&#xff0c;gdkpixbufoverlay添加图片&#xff0c;clockoverlay或timeoverlay插件显示时间&#xff0c;pango插件进行复杂文本渲染&#xff0c;使用cairo插件绘制图形或者文字。 今天使用最后一…

【React】详解样式控制:从基础到进阶应用的全面指南

文章目录 一、内联样式1. 什么是内联样式&#xff1f;2. 内联样式的定义3. 基本示例4. 动态内联样式 二、CSS模块1. 什么是CSS模块&#xff1f;2. CSS模块的定义3. 基本示例4. 动态应用样式 三、CSS-in-JS1. 什么是CSS-in-JS&#xff1f;2. styled-components的定义3. 基本示例…

ADS 使用教程(二十八)Working with FEM Mesh Field Data in ADS

ADS 使用教程&#xff08;二十七&#xff09;Getting Started with Full 3D FEM Simulation in ADS 在这一节中&#xff0c;我们来谈论一下在ADS中处理有限元法&#xff08;FEM&#xff09;网格和场数据的步骤。 在上一节中&#xff0c;我们进行了FEM仿真&#xff0c;并保存了…