『项目总结』基于线程池的矢量瓦片切割技术

从零构建:OSM矢量瓦片引擎的DIY指南 本文详细介绍了如何从零开始构建基于OSM的矢量瓦片引擎,涵盖矢量瓦片技术原理、OSM数据解析、瓦片切割算法及WebGL渲染优化等核心内容。通过实战案例和性能优化技巧,帮助开发者掌握高效地图可视化技术,特别适合需要定制化地图解决方案的前端工程师和GIS开发者。 阅读详情

最近把项目中负责矢量瓦片切割的功能模块做成了并行计算模式,写一篇博客来总结一下。

 

1. 技术简介

1.1 矢量瓦片

传统的栅格地图切片,是服务器端预先绘制的PNG或JPG切片集合。而矢量地图切片将矢量数据通过不同的描述文件来组织和定义,通常通过自定义文件或json文件进行传输,在前端按需请求不同的矢量瓦片数据文件,并利用CANVAS等技术进行绘制。使用这种技术有不少好处,例如不再需要为不同的样式而反复进行制图、渲染、切片、更新service等过程,并且在当前各种高分屏、视网膜屏大肆发展的阶段,避开按照特定DPI和分辨率渲染的栅格图片在不同的显示设备上无法以统一清晰的效果呈现,等等。

1.2 线程池

线程池类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体的工作时,就会唤醒线程池中的某一个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠状态,而不是将线程销毁。

1.3 任务队列

任务队列是一种能够把封装了数据和操作的任务在多线程之间传递的线程安全的FIFO(First In First Out)队列。其概念类似于生产者-消费者模型中的缓冲区。生产者生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

2. 实验设计

2.1 瓦片切割流程

  1. 读取shp文件的范围,计算出x与y方向的差值;
  2. 设定单张瓦片的尺寸为256×256像素,通过比例尺放缩计算出瓦片在当前比例尺下,对应的x与y方向上的数量;
  3. 每张瓦片由(level, row, col)三元组唯一标识,并且由一个数据结构Tile来存储相关信息;
  4. 遍历瓦片集合,将每张瓦片与shp文件中的所有feature进行相交判断。若相交,则将feature的空间坐标记录在Tile中;
  5. 将Tile序列化为json文件存储在文件系统中。

2.2 数据处理模式

       本程序包含两个角色,分别是:Master线程(唯一)与Worker线程(多个),其中Master负责①生产任务,并将任务添加至任务队列、②调度Worker线程完成任务。而Worker负责执行矢量瓦片切割的逻辑。如下所示:

图 1 瓦片切割流程图

2.3 任务队列的具体定义

       在本次实验中,一个任务对应一个瓦片的处理逻辑,即取得任务的线程需要完成任务指定瓦片的生产。由于瓦片可由(level, row, col)三元组唯一标识。因此任务也同样可以通过(level, row, col)三元组唯一标识。因此构建一个数据结构TileTask,其包含了level, row, col等属性。线程取得任务后,可通过这些属性明确自己需要处理哪张瓦片。

存储多个TileTask的集合称为任务队列。由于采用先进先出的任务处理方式,故采用Queue作为TileTask的容器,即Queue<TileTask> taskQueue = new Queue<TileTask>();

3. 实验数据与环境

3.1 矢量数据

使用中国行政区划图作为实验数据。以1: 69,885,283作为0级比例尺进行切割(参考Google地图)。该图层的最大经度为东经135.085831度,最大纬度为北纬53.557926度,最小经度为东经73.446960度,最小纬度为北纬18.160896度。如下图所示:

图 2 中国行政区划图

3.2 实验环境

表 1 硬件信息

处理器

型号

主频

核数

配置参数

Intel(R) Core(TM)i7-8700K

3.70Ghz

6

表 2 软件信息

操作系统

Windows

开发环境

.NET Framework (C#)

线程库

System.Threading.Tasks

计时库

System.Diagnostics

4. 实验结果

本实验对1-5层级的矢量瓦片分别用串行与并行模式(每个CPU对应一个线程)进行计算,并记录下了计算使用的时间。对于实验结果计算了并行效率和加速比,公式如下:

对于加速比计算公式:其中Sr为加速比,Ts为整个任务在串行机上执行所需的时间,Tp为整个任务在并行机上执行所需的时间。对于并行效率计算公式:其中E为效率,N为核心数。实验结果如下:

表 3 实验结果统计

瓦片层级

瓦片总数

串行/s

2/s

3/s

4/s

5/s

6/s

1

13

1.52

0.96

0.75

0.69

0.55

0.60

2

43

5.47

3.06

2.42

2.22

1.99

1.98

3

151

19.84

11.23

9.45

8.25

7.39

7.43

4

559

76.44

46.34

37.60

31.51

29.09

27.90

5

2157

312.37

189.32

147.59

126.66

120.28

109.46

图 3 核数-时间关系图

观察以上统计数据可以发现,随着瓦片的数量以近似4倍的速率增多,计算耗时也以近似4倍的速率扩大。

以下数据计算了采用不同数量的CPU所得到的加速比一级并行效率。

表 4 双核计算结果

瓦片层级

瓦片总数

串行/s

2/s

加速比

并行效率

1

13

1.52

0.96

1.58

0.79

2

43

5.47

3.06

1.79

0.89

3

151

19.84

11.23

1.77

0.88

4

559

76.44

46.34

1.65

0.82

5

2157

312.37

189.32

1.65

0.82

 

表 5 三核计算结果

瓦片层级

瓦片总数

串行/s

3/s

加速比

并行效率

1

13

1.52

0.75

2.03

0.68

2

43

5.47

2.42

2.26

0.75

3

151

19.84

9.45

2.10

0.70

4

559

76.44

37.60

2.03

0.68

5

2157

312.37

147.59

2.12

0.71

 

表 6 四核计算结果

瓦片层级

瓦片总数

串行/s

4/s

加速比

并行效率

1

13

1.52

0.69

2.20

0.55

2

43

5.47

2.22

2.46

0.62

3

151

19.84

8.25

2.40

0.60

4

559

76.44

31.51

2.43

0.61

5

2157

312.37

126.66

2.47

0.62

 

表 7 五核计算结果

瓦片层级

瓦片总数

串行/s

5/s

加速比

并行效率

1

13

1.52

0.55

2.76

0.55

2

43

5.47

1.99

2.75

0.55

3

151

19.84

7.39

2.68

0.54

4

559

76.44

29.09

2.63

0.53

5

2157

312.37

120.28

2.60

0.52

 

表 8 六核计算结果

瓦片层级

瓦片总数

串行/s

6/s

加速比

并行效率

1

13

1.52

0.60

2.53

0.42

2

43

5.47

1.98

2.76

0.46

3

151

19.84

7.43

2.67

0.45

4

559

76.44

27.90

2.74

0.46

5

2157

312.37

109.46

2.85

0.48

      

对表4至表8进行综合统计分析,得到加速比与并行效率随着核心数的变化数据,如下表所示:

表 9 核数对加速比以及并行效率的影响

核心数

平均加速比

平均并行效率

2

1.69

0.84

3

2.11

0.7

4

2.39

0.6

5

2.68

0.54

6

2.71

0.45

根据表9中的数据,分别绘制图4与图5以直观地表达核心数对加速比与并行效率的影响。

图 4 核数-加速比关系图

 

 

图 5 核数-并行效率关系图

 

       综上,并行计算能明显提高瓦片切割的效率,提高的效率与参与计算的CPU核心数呈正相关。随着核心数增加,加速比不断增加,但是增加的幅度逐渐减小。而并行效率随着核心数的增加而线性减小。

基于C++与GDAL的高性能地图瓦片切割工具开发实战 地图瓦片技术是WebGIS和在线地图服务的核心基础,它将大规模地理空间数据切割成标准规格的小图片,以实现高效的地图加载与可视化。其原理在于构建金字塔模型,通过层级缩放和网格划分,将地理坐标映射到瓦片索引。这项技术的核心价值在于解决了海量空间数据在网络传输与实时渲染中的性能瓶颈,广泛应用于互联网地图、智慧城市、遥感监测等场景。本文聚焦于利用C++的高性能计算能力和GDAL库的强大地理数据处理功能,深入探讨如何构建一个可深度定制、支持多线程并发的瓦片切割工具。文中将详细解析GDAL的数据读取、坐标转换、重采样等 阅读详情

相关推荐

别再为天地图API调用次数发愁了!用这个开源工具批量下载瓦片,轻松搭建离线地图服务

本文详细介绍如何利用开源工具突破天地图API调用限制,实现瓦片批量下载和离线地图服务搭建。通过多线程下载技术、坐标转换算法及性能优化策略,帮助开发者高效构建内网地图服务,解决网络延迟和调用次数限制问题。

weixin_29043895的博客 229

vtzero-master_地图_地图矢量瓦片切图_vtzero_

地图矢量瓦片数据生成库,支持mapbox 标准

告别BIGMAP水印!免费搭建GeoServer离线地图服务:从TIF/SHP数据到OpenLayers展示的保姆级教程

本文提供了一套完整的开源解决方案,教你如何免费搭建GeoServer离线地图服务,从TIF/SHP数据处理到OpenLayers展示的详细步骤。通过GeoServer的部署与优化,实现图层发布和多精度瓦片动态加载,帮助开发者摆脱商业软件依赖,构建高效、专业的离线地图应用。

weixin_42520374的博客 178

mapnik&python生成离线地图瓦片

写于20150414 一次只能上传一份那我就少点多几份吧: 介绍(免积分) http://download.csdn.net/detail/a137015127302/8594877 如果懒得自己慢慢找,我想你不介意花点积分的吧。

GeoServer入门(二):WMTS图层瓦片切割与调用

本章主要讲述如何GeoServer进行图层瓦片切割与缓冲,发布标准的WMTS服务,并介绍了REST格式的调用参数。

程序员猴小萌的博客 9115

矢量切片_数据粒度均衡的二维矢量瓦片构建方法

作 者 信 息 应 申1,2,王子豪1,杜志强3,丁火平4, 李翔翔4(1. 武汉大学 资源与环境科学学院,湖北 武汉 430079;2. 自然资源部城市国土资源监测与仿真重点实验室,广东 深圳 518034;3. 武汉大学 测绘遥感信息工程国家重点实验室,湖北 武汉 430079;4. 航天恒星科技有限公司,北京 100086)“ 【摘要】针对二维地图矢量瓦片数据量不均衡造成的Web可...

weixin_42333411的博客 994

地图瓦片矢量瓦片和栅格瓦片详解

地图瓦片矢量瓦片和栅格瓦片详解

m0_52009348的博客 9599

GeoTools实战指南: 切割矢量地图数据并导出为TMS标准的瓦片

在本教程中,我们将介绍如何使用Java和GeoTools库来切割矢量地图数据并导出为地图**TMS**标准的瓦片。这对于创建自定义地图服务以及生成本地地图缓存非常有用。你可以了解如何将矢量地图数据切割成适用于Web地图服务的瓦片

孙霸天的专栏 1788

地图矢量切片常用的几种开源方案

本文对比了四款主流矢量切片服务端(GeoServer、TileServer GL、FoxGIS Server Lite、Martin)的Docker部署方案。GeoServer作为全功能GIS服务器,支持OGC标准,适合一站式GIS服务场景;TileServer GL轻量化且兼容Mapbox样式,适合前端开发。文章详细提供了各服务的Docker部署步骤,包括目录配置、环境变量设置和启动命令,并指导如何启用矢量切片功能。通过对比分析,帮助开发者根据业务需求选择最适合的矢量切片解决方案。

胡萝卜先生的进阶之路 1341

从零构建工业级Qt/C++地图应用:架构、核心技术与性能优化

地图应用开发是现代软件工程中处理空间数据的核心技术,其原理基于地理信息系统(GIS)和计算机图形学。通过瓦片加载、坐标转换与图形渲染等机制,将地理坐标映射为屏幕像素,实现可视化交互。这项技术的价值在于为无人机监控、物流调度、智慧城市等工业场景提供高性能、可定制的空间信息展示与决策支持方案。本文聚焦于Qt/C++技术栈,深入探讨如何利用QWidget与QPainter进行底层自绘,构建一个不依赖浏览器、跨平台且深度集成的地图引擎框架,并针对瓦片缓存、图形覆盖物绘制及轨迹动画等热词进行工程实践解析。

weixin_34384557的博客 303

GeoServer WMS超大地图性能优化实战:从瓶颈分析到全链路加速

Web地图服务(WMS)作为地理信息系统的核心组件,其动态渲染机制在提供灵活性的同时,也常面临性能挑战。其工作原理是基于客户端请求实时生成地图图片,涉及数据读取、样式渲染、投影转换等复杂计算流程。这一技术价值在于支持动态数据和个性化展示,广泛应用于实时监控、专题制图等场景。然而,当处理覆盖范围广、数据量大的超大地图时,WMS服务容易遭遇响应缓慢的瓶颈。本文聚焦于**GeoServer**这一主流地图服务器的性能调优,深入剖析其**WMS服务**在渲染超大地图时的性能瓶颈链,涵盖数据I/O、服务器计算、网络传

weixin_30924087的博客 391

海量资源流式加载:分块分层、内外存调度、多平台实现、性能优化与避坑实战

本文系统性地阐述了海量资源流式加载的核心技术体系,重点解决TB级三维场景在终端设备的内存与性能瓶颈问题。文章首先定义了流式加载的分块、分层、异步、缓存四项基本原则,剖析了磁盘-内存-显存三级流水线架构和当前工程存在的五大痛点。核心技术部分详细讲解了空间分块策略、多级LOD方案、八叉树索引、外存调度机制和缓存淘汰算法四大基础组件,并拆解了从预处理到渲染融合的完整运行管线。通过Unity、Three.js、C++、Python等多平台代码示例,展示了不同场景下的实施方案。最后总结了工业级落地的全流程调优方法,针

分享知识,拥抱变化 942

java发布矢量瓦片(基于springboot)

本文采用CC BY-SA 4.0 协议,转载请注明原始链接: https://blog.wowtools.org/2022/04/28/2022-04-28-mapbox-gl-tutorial-8/ 引入springboot和giscat的maven依赖 <dependency> <artifactId>giscat-vector-mvt</artifactId> <groupId>org.wowtools</groupI..

imliuyu的博客 3204

QGIS地图瓦片生成工具使用介绍(目前仅支持QGIS2.X)

1 软件介绍 QGIS的制图相当漂亮,而且也开源。于是便基于QGIS进行切图工具的开发,该软件是本人的毕业设计,它借鉴了诸多博硕士论文成果,并研究了多款开源GIS软件源码,采用当下主流的瓦片切割算法开发而成。为了提高切割效率,对部分QGIS源码进行了重构。下面就其特点进行简单介绍。 特点 1.操作简单,只需简单输入,即可切片。 2.采用多线程缓存切片,超高的切片效率。 3.支持设置瓦片大小,满足不...

a374682949的博客 1万+

(JAVA)全球格网图幅编号计算&基于图幅进行GIS数据切瓦片的思路

本篇就是随便写的,想到哪写到哪,不谈什么算法和源码,就是看效果,先来张效果图吧: 首先我们要想要对江浙沪皖(江苏,浙江、安徽和上海四个行政区划)的矢量或影像进行瓦片切图操作,QGIS中的图层是矢量数据,影像同理;我们有两种切法,第一种就是按shp图层的外接矩形来算瓦片的xyz,因为通过地图缩放层级zoom和范围很容易的能算出有多少张瓦片是需要计算并存储的,比如,我代码中对shp数据的读取解析可以知道其范围如下: 知道范围后,我们就可以算出在16地图缩放层级下...

Appleyk的专栏 6万+

非常好用的开源矢量地图切片工具

一直在研究矢量瓦片相关内容,想找一款比较稳定的切片工具比较费劲,看了很多设计,建议用四叉树开发,或者是开源工具,在qgis里有个mbtiles切图的工具,用了一下也还可以。试了一下geowebcache直接把服务器磁盘切挂了,数据量并不大。就在网上四处寻摸,终于功夫不负有心人,mapbox api可以直接上传数据然后切图在线效率不高,而且数据保密嘛,先跳过,直接进入mapboxtippcanoe这个开源工具,c++写的软件包很小,切图性能很稳定,关键是快,飞一般的快。能想象我切北京全市的建筑物4-14级只用

shishi521的专栏 5728

点、线、面生成mvt(MapBox Vector Tile)格式的瓦片总结

矢量切片可以以三种形式呈现:GeoJSON、TopoJSON 和 MapBox Vector Tile(.mvt),矢量切片技术继承了矢量数据和切片地图的双重优势,有以下优点: 瓦片以mvt格式的存储,是以每一个瓦片号为基准进行存储的。大小都是256*256;粒度更小,信息接近无损;前端可根据数据定制渲染样式;数据更新快,更灵活; .mvt 压缩率更高,体积更小; 点: 每一级别:经纬度转像素坐标 像素坐标计算所在瓦片号 像素坐标转瓦片内像素坐标 根据瓦片内像素坐标:进行聚合————同一个像素点聚合后记录一

qq_40985985的博客 9835

【地图缓存】地图瓦片矢量瓦片

一般而言地图缓存包括地图瓦片矢量瓦片和属性瓦片,其中地图瓦片数据可来自于栅格数据与矢量数据,矢量瓦片的数据来自于矢量数据。

qq_37219845的博客 2934
上一篇: 『APUE自学笔记』高级IO
下一篇: epoll源码分析
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值