openlayers百万级和千万级数据量的矢量切片在渲染过程中的技术难点解析

news2024/11/27 22:41:27

目录

  • 1 前言
  • 2 数据介绍
  • 3 切片方案及技术难点
    • 3.1 大数据量图层矢量切片无法正确返回结果
    • 3.2 矢量切片标注过程中标注拥挤
    • 3.3 矢量切片每一块切片都进行了标注,形成了冗余
    • 3.4 矢量切片标注的随机性会造成时而在中央,时而在边界上
    • 3.5 特殊样式的制作
    • 3.6 图层组之间的冲突
      • 3.6.1 数据量过大
      • 3.6.2 显示前后矛盾
      • 3.6.3 先加进去的后显示
      • 3.6.4 图层组和图层组之间不能通过设置zIndex调整顺序
  • 4 openlayers样式常用参数说明
  • 5 openlayers点线面参数举例
  • 6 效果图
  • 7 总结

1 前言

  本文于产生于一个特殊的需求,即能否在前端控制底图里各种图层的显隐?比如天地图中的道路、河流?答案显示是不行。为什么?因为天地图是后端渲染,前端拿到的只是一张图片而已,是没法控制图片里的图层的。那有没有办法来解决这一需求呢?答案是当然有。在前端渲染矢量切片,当需要隐藏的时候,将某一属性的图层直接设置样式为空就可以了倍。
  另外作者注意到,百度地图和高德地图现在都已经将渲染方式改为了在前端渲染矢量切片的方式了。但是二者在标注时使用的技术上稍微有点不同,高德是把标注数据和切片数据放在一起了,而百度使用的是精灵图方式。感兴趣的朋友可以自行查看。

2 数据介绍

  本文渲染的数据为全球的shp数据,共53个图层,1670万条数据,为了增加数据的读取效率,数据存储在 PostGIS 中,使用 GeoServer 发布矢量切片。

3 切片方案及技术难点

  首先可以肯定的是不能像后端渲染那样,把所有图层都放在一个图层组里,然后做矢量切片,因为这样做,会导致切片非常大,一个切片几十兆。所以,我们现在就要考虑几个难点了。

3.1 大数据量图层矢量切片无法正确返回结果

  解决办法:分组进行切片,如0-5级,5-10级,10-15,15-20级进行展示的数据分批进行切片。在第0级就显示居民点明显是不合适的,矢量切片的过程并不会考虑这种情况,只会把所有数据都拿来切,切完了能不能正常返回,也不关心。因此就需要人为进行干预。

3.2 矢量切片标注过程中标注拥挤

  解决办法:设置layerdeclutter属性,declutter意为整理,当范围太小,放不下标注时,会自动隐藏该标注。这种情况尤其适合当地图缩放到低层级时的出现的拥挤情况。

3.3 矢量切片每一块切片都进行了标注,形成了冗余

  解决办法:记录当前层级下,当前图层,当前名称,是否标注了,如已标注,不在重复标注,当层级缩放时,清空记录,重新渲染。

3.4 矢量切片标注的随机性会造成时而在中央,时而在边界上

  解决办法:单独形成需要标注的图层,以点的形式进行存储,这种情况适用于面图层和线图层,比如陕西省和黄河两个图层,都会被切为多个瓦片,每个瓦片都会进行标注,由于瓦片被请求到的顺序依赖于网络环境,因此有可能边界的瓦片先被请求到,中央的瓦片后被请求到。因为当前标注策略是,第一次请求才会进行标注,因此很有可能标注在边界上。所以应提取中央的点,作为独立的标注图层。

3.5 特殊样式的制作

  关于特殊样式的制作,可以参考作者的另外两篇博文
如何在openlayers中使用iconfont或font Awesome字体图标
openlayers铁路公路桥梁隧道及导航样式参考

3.6 图层组之间的冲突

  这个问题我们来详细解释一下,什么叫做图层组和图层组之间会存在冲突?要理解这个问题,我们首先要讲下分组方案。最初我们是把所有的面图层放在一个图层组,所有的线放在一个图层组,所有的点放在一个图层组,共3个图层组。然后在前端去渲染。

3.6.1 数据量过大

  显然这样是有问题的,为什么?因为有些面是要在十几级才显示的,比如湖泊,县、乡、村;而有些面是要在前几级就进行显示,比如国家、省、市。那么按照我们目前的分组方案,会造成单个切片的数巨量大的问题。这一点我们在3.1节讲过了。

3.6.2 显示前后矛盾

  按照目前的分组方案,世界的首都,这个点图层,是很早就要显示的,但是这个图层是在后面才加进来的。那么会造成什么问题?那就是要显示的时候,发现没数据。因为后面加进来的图层我们的设置是,从第10级开始切,但是现在要第3级就要显示,明显是冲突的。

3.6.3 先加进去的后显示

  还有一些图层,比如医院、大学、火车站的面数据,这是数据是在十几级才去显示,按理说应该很晚加进去,但是很晚加进去以后,又会发现会覆盖前面加进去的线和点。所以必须把这些图层单独提出来形成一个图层组。最后,那就是要很早进去的,很晚才显示的,又形成一组。

3.6.4 图层组和图层组之间不能通过设置zIndex调整顺序

  一个图层组中的图层,可以通过调整 zIndex 在这个组内调整层级,但是不能调整和另一个图层组里的图层的顺序。这句话读起来有点绕,我们来解释一下。
1.一个图层组,里面包含了很多图层,每个图层我们都可以通过 zIndex 调整层级。
  这句话应该好理解,就是在组内调整顺序嘛
2.不能通过调整 zIndex 来调整A图层组里的A.2和B图层组里的B.3
  这是因为 zIndex 参数只在所属的图层组里起作用map 也是一个图层组。要想调整A图层组里的A.2和B图层组里的B.3,只能通过调整A图层组和B图层组的顺序来实现。

4 openlayers样式常用参数说明

在这里插入图片描述

5 openlayers点线面参数举例

在这里插入图片描述

6 效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7 总结

  本文通过渲染1600万数据量的矢量切片,系统的剖析了矢量切片渲染过程中的技术难点,并将 openlayres 中常用的样式参数进行了举例说明,最后形成了一套全球矢量切片的渲染图。结合作者实际经历,在渲染过程中需逐个图层进行比对,实时的调整前端样式,和后端分组方案,更需耐心和细心,希望读者共勉。好了,本文就分享到这里,下期见~

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

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

相关文章

Jmeter(九):jmeter_逻辑控制器_事务控制器HTTP Cookie管理器

Jmeter(19):jmeter_逻辑控制器_事务控制器 事务: 性能测试中,事务指的是从端到端,一个完整的操作过程,比如一次登录、一次 筛选条件查询,一次支付等;技术上讲:事务就是由1个或多个…

C# Spire.Xls将DataTable导出到Excel并加密

背景需求: 页面展示信息列表,需要将数据导出到Excel并加密sheet文件和工作簿结构。 代码思路:1.将数据转换为dataTable,2.将dataTable导出到Excel,3.处理加密。 文章目录引入必要的dll文件1.将数据转换为DataTable2.将…

Python英文词频统计(哈姆雷特)程序示例

今天继续给大家介绍Python相关知识,本文主要内容是Python英文词频统计程序示例,主要是对英文文本——《哈姆雷特》进行分词。 一、英文文本词频统计思路 想要对《哈姆雷特》进行英文单词词频统计,那么我们首先需要拿到《哈姆雷特》的原文&a…

“笨鸟”逆风飞:一场荣耀的高端越峰征程

2020年的11月17日,荣耀被迫“成年”。 “那一天都是在忙碌过程中度过的,有很多人要去沟通,有很多资产的分割……”,在12月12日央视网财经的访谈节目《云顶对话》中,荣耀CEO赵明首次向外袒露心迹,转身成为对…

C++11标准模板(STL)- 算法(std::max)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 返回各给定值中的较大者 …

构建供销一体化电商交易体系,数商云S2B2B系统实现锂电池企业全面转型升级

近年来&#xff0c;得益于新能源汽车和储能产业的快速发展&#xff0c;相关支撑技术和产业也得到空前关注&#xff0c;锂电池就是其中一员。我国动力电池装机量达到92GWH&#xff0c;同比增长169%&#xff0c;超过全球平均增速&#xff0c;占据着全球近一半的电池装机量。 新能…

Qt 蓝牙库基础

1.目的 使用QT自带的蓝牙功能库进行学习开发&#xff0c;了解蓝牙设备的工作原理和使用流程&#xff0c;目的搭建可以自由控制的蓝牙app&#xff0c;为以后的学习生活做基础。 2.本地设备 采用自己vivo Y53的手机作为实验对象。 使用到的QT蓝牙库的类名&#xff1a; QBlue…

PIC 16F18系列单片机开发 IO口配置与stm32的区别

目录 前言 PIC单片机配置字 电路需要IO口来发挥作用 寄存器和特殊功能寄存器 I/O口 I/O口和单片机内部寄存器之间的对应关系 前言 由于在之前学习嵌入式IDE时候都是直接接触到的是STM32 ARM内核的32位看偏激&#xff0c;现在开发使用的是美国微芯公司推出的PIC系列的单片…

【云原生】kubeadm部署k8s集群

内容预知 架构说明 1.环境准备 2.所有节点安装docker 3. 所有节点安装kubeadm&#xff0c;kubelet和kubectl 4. 部署 Dashboard 5. 安装 部署与k8s集群对接的Harbor仓库 内核参数优化方案 架构说明 前面的文章中&#xff0c;我们采用了二进制包搭建出的k8s集群&#xff…

[附源码]计算机毕业设计动漫电影网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

电子采购软件如何提高企业效率?

企业采购致力于提高生产力和效率&#xff0c;并实现更高的职能和跨职能支出的可见性。电子采购软件解决方案帮助企业实现其目标并做得更多&#xff0c;因此成为了具有前瞻性的采购领导人的明智选择。 以下是使用电子采购软件的四个主要优势&#xff1a;1、降低成本 降低成本是电…

python包管理pip常见操作

一、pip安装 暂略 二、pip常用命令 1、显示版本和路径 pip --version 2、获取帮助 pip --help 3.升级 pip pip install -U pip 4.安装资源包 pip install SomePackage # 最新版本 pip install SomePackage1.0.4 # 指定版本 pip install SomePackage&g…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.8 案例实现TCC 模式【实现】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.8 案例实现TCC 模式【实现】38.8.1 声明TCC 接口38 动手实践 38.8 案例实现TCC 模…

第34篇 网络(四)FTP(二)

导语 前面讲述了一个最简单的FTP客户端程序的编写&#xff0c;这一节我们将这个程序进行扩展&#xff0c;使其可以浏览并能下载服务器上的所有文件。 环境&#xff1a;Windows Xp Qt 4.8.5QtCreator 2.8.0 目录 一、修改界面二、功能实现 正文 一、修改界面 我们删除了T…

当vivo领先后,该学着“快”起来了

文|智能相对论 作者|佘凯文 随着一个个大热球队的爆冷&#xff0c;今年世界杯赛事正在渐入高潮。就目前的形势来看&#xff0c;世界杯最大的悬念在于究竟是“老王”圆梦&#xff0c;还是“新王”登基&#xff0c;又或者是摩洛哥这只黑马一黑到底。 新老球星的更迭&#xff0…

Selenium浏览器自动化测试框架

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google C…

设计模式概述(一)

很多小伙伴&#xff0c;不知道设计模式是什么&#xff1f; 通常我们所说的设计模式是一种设计方案&#xff0c;是前人留下的经验及最佳实践。 想要学习设计模式&#xff0c;至少要把面向对象的基本结构全部了解。 设计模式&#xff0c;是建立在一定基础上的思维训练。 学习设…

macos12.6安装配置opencv4.6.0+opencv contrib4.6.0

1.系统准备好&#xff0c;安装依赖python版本高一点的&#xff0c;并且安装上numpy。 brew install cmake gui及cmake&#xff0c;可能装cmake gui的时候有点问题&#xff0c;先装gui再装cmake。 2.提前下载源码&#xff0c;Releases - OpenCV要求opencv与opencv contrib版本一…

Metal每日分享,UV去雾滤镜效果

本案例的目的是理解如何用Metal实现去雾效果滤镜&#xff0c;类似于UV过滤器&#xff1b; Demo HarbethDemo地址 实操代码 // 去雾效果滤镜 let filter C7Haze.init(distance: 0.5, slope: 0.5)// 方案1: ImageView.image try? BoxxIO(element: originImage, filters: [f…

MyBatis ---- MyBatis的逆向工程

MyBatis ---- MyBatis的逆向工程1. 创建逆向工程的步骤a>添加依赖和插件b>创建MyBatis的核心配置文件c>创建逆向工程的配置文件d>执行MBG插件的generate目标2. QBC查询正向工程&#xff1a;先创建 Java 实体类&#xff0c;由框架负责根据实体类生成数据库表。Hiber…