目录
栅格瓦片按照金字塔结构组织,每张瓦片都可通过级别、行列号唯一标记。在平移、缩放地图时,根据金字塔规则,计算出所需的瓦片,直接读取并拼接,从而大幅度提升数据渲染性能。
选项 | 原始型 | 紧凑型 | Mongo型 |
原理 | 切片文件以单独的图片文件格式存放在磁盘上,不对数据进行压缩,能够直接读取。 | 对原始的切片文件采用一定的压缩和加密机制,在结构上采用一组文件替代原始的图片格式的瓦片机制。 | 生成的瓦片切片文件,以分布式格式存储在服务器的数据库中。 |
存储介质 | 本地图片文件 | 本地压缩文件 | Mongo数据库 |
切片结果 | 索引文件(*.sci) 图片文件 纯色瓦片文件(*.solid) | 索引文件(*.sci) 瓦片数据(*.cf文件) 图片格式对应的纯色瓦片(比如:*.png,具体格式跟生成瓦片时设置的图片类型参数保持一致) | 本地瓦片索引文件(*.sci) MongoDB瓦片文档 |
优点 | 可直接读取,直观。 | (1)文件数量少,有利于瓦片数据的传输与拷贝。 (2)缩短瓦片创建的时间耗费。 (3)数据支持加密。 | (1)切片存储于服务器中,地图切片的读取速度相较本地文件更快。 (2)以分布式格式进行存储,便于数据分享与发布。 |
缺点 | (1)磁盘空间大,不太易于管理,拷贝和迁移不太方便。 (2)不支持对数据进行加密。 | 非原始图片,无法直接打开图片查看 | 非原始图片,无法直接打开图片查看 |
适用情况 | 缓存生成后不需变动,仅在本机浏览,数据量较小的情况下,建议选择原始型瓦片,读取方便且直观。 | 有数据加密需求,且数据量较大时,建议选择紧凑型瓦片,可减少文件数量,有利于瓦片数据的传输与拷贝,且能够缩短创建瓦片的时间。 | 大体量数据、且需要拷贝分发数据需求时,建议选择 MongoDB 型。 |
原始型:
紧凑型:
MongoDB型:
2. 矢量瓦片
将矢量地图生成遵循 MapBox MVT规范的矢量瓦片,瓦片数据包含要素的几何形状与属性信息,而要素的风格样式由 MapBox 标准样式文件(style.json)描述。矢量瓦片相比栅格瓦片具有无级缩放,风格修改,数据量相对较小的优势,能更好满足灵活多样的 Web 地图应用。
3. 栅格瓦片和矢量瓦片对比
对比项 | 矢量瓦片 | 栅格瓦片 |
瓦片体量 | 小 | 大 |
生成瓦片效率 | 高 | 低 |
更新瓦片 | 样式和瓦片分离,支持分开更新瓦片 | 更新切图 |
样式修改 | 支持 | 不支持 |
前端技术要求 | 高 | 低 |
显示差异 | 有差异 | 无差异 |
成熟度 | 一般 | 高 |
应用场景 | 特殊(前端,风格修改) | 广泛 |
4. 多种生成瓦片缓存方式介绍
对比项 | 单任务 | 单机多任务 | 多机多任务 |
原理 | 一台计算机中启动单个进程执行切片任务 | 在一台计算机开启多个进程执行切图任务。 | 多台计算器同时开启多个进程实现多台机器并行高效切图。 |
适用场景 | 数据量小、比例尺级别少、结果缓存图片数量没有特别大 | 数据量比较大、比例尺级别多、结果缓存图片数量大,且客户只有一台机器可用于生成缓存 | 适用于数据特别大,比例尺级别高,结果缓存图片数量巨大,同时客户有多台机器可用于生成缓存 |
适用场景举例 | 一个地市矢量地图且最大比例尺为1:2000左右 | 全省范围最大比例尺为1:2000左右 | 全国或全省范围且最大比例尺超过1:2000 |
关键操作步骤 | 无 | 切图任务数默认为计算机 CPU 核数*1.5倍,切图时CPU 利用率为100%。可根据数据量大小和内存大小增加或减少任务数,但一般建议不超过CPU 核数*2倍。 | 多机多任务操作参考:https://blog.csdn.net/supermapsupport/article/details/124798855。 |
海量影像推荐方案:“基于金字塔算法生成地图瓦片”
针对海量数据影像地图的瓦片生产提出方案,实现以更便捷的手段和更高效的方式实施地图瓦片的生产业务。目前,针对海量影像数据管理的最佳方式就是镶嵌数据集,因此,影像地图也是基于镶嵌数据集制作,再基于该影像地图生成栅格瓦片。具体方案内容考察下面链接:https://blog.csdn.net/supermapsupport/article/details/126930617。
基于金字塔算法生成地图瓦片FAQ:
基于上述方案,在实际应用中,可能遇到的一些问题以及解决办法,可以参考下面博客:https://blog.csdn.net/supermapping/article/details/110930048。
生成矢量瓦片,首先要准备一幅有效的矢量地图,SuperMap地图中的点、线、面、文本图层都支持生成矢量瓦片,并且SuperMap地图要素的符号化、图层设置等绝大多数都能被MapBox样式支持;但是,由于MapBox风格显示表达与SuperMap不同,所以矢量地图的制作存在一些局限性和注意事项,具体内容见下面链接:https://help.supermap.com/iDesktop/zh/tutorial/MapTiles/VectorTilesNotice。
客户项目为信创项目,使用机器均为涉密环境下的国产机,项目需要对全国三调数据在一张图系统中接入地图服务,实现数据的快速浏览和查询。
本项目对三调数据需求主要有2点:
原始数据是分县的GDB格式文件,但已无法获取。
客户拿到的数据,是已经入库到PostGIS的矢量面状数据,数据存在大量的拓扑错误,比如自相交、重复线、冗余点、假结点等。
客户拿到的全国三调数据中,有2个图层【地类图斑】、【坡度图】数据量巨大,是重点处理、优化的图层,以下为这2个图层数据的说明:
数据类型 | 数据记录数 | 数据大小 | 坐标系 |
地类图斑 | 3.1亿条 | 486GB | CGCS2000 |
坡度图 | 4.99亿条 | 1657GB | CGCS2000 |
难点分析:数据存储为SAN存储,数据表已创建索引,但因单表过大,数据库后台查询时,使用语句select count(xx) from xx查询耗时约21分钟。
数据库服务器配置如下:
海光Hygon C86
双CPU:128核
内存:500G
磁盘大小:16T,fcsan
操作系统:中科方德
针对项目中不同比例尺地图需求不同,制定了栅格瓦片与矢量瓦片相结合的方案,具体情况如下:
1-13级:使用栅格瓦片,重点满足快速浏览需求,原因在于此比例尺集中查询需求频次低;
14-18级:使用矢量瓦片,重点满足快速查询需求,原因在于此比例尺集,查询操作相对频繁;
1.5.1 环境准备
本项目切图使用的是iObjects Java命令行切图方式,需提前部署iObjects Java的Bin包,并配置环境变量;
1.5.2 小范围测试
因数据体量非常大,在对数据量进行切图前,先进行小数据量的测试(预计1小时内可切完的范围),确保切图过程及结果无误后,再对完整数据进行切图
使用SuperMap iDesktopX选择小区域数据范围,试制作本地缓存,会在目标目录生成一个sci文件。最终可修改切图层级来控制当前切图的层级范围。比如dltb\dltb\dltb.sci
1.5.3 数据预处理流程
在小范围测试无误的情况下,综合考虑数据情况、项目组需求、技术难度,需评估的要素如下:
结合上述因素,制定了数据预处理流程,如下图所示:
同时,考虑第四点,对不同比例尺下同一图层制定了不同优化处理策略,如下图所示:
以下为多次测试所得的:数据分级和处理粒度对应表
序号 | 操作 | 操作字段 | 容限值 (单位:米) | 地图级别 | 瓦片类型 |
1 | 融合 | 行政区划(省)+地类类别 | 0.001或0.005 | 1~7级 | 栅格瓦片 |
2 | 融合 | 行政区划(县)+地类类别 | 0.001或0.002 | 8~10级 | 栅格瓦片 |
3 | 重采样 | 空间字段 | 300 | 11~13级 | 栅格瓦片 |
4 | 重采样 | 空间字段 | 300 | 13~15级 | 矢量瓦片 |
5 | 重采样 | 空间字段 | 50 | 16级 | 矢量瓦片 |
6 | 重采样 | 空间字段 | 15 | 17级 | 矢量瓦片 |
7 | 重采样 | 空间字段 | 5 | 18级 | 矢量瓦片 |
1.5.4 步骤说明
(1)数据分块
全国范围记录数3亿多行,不利于直接处理, 在处理过程中出现问题也不好排查。先将数据分省提取到31个单独的数据集中。 再单独对31个数据集进行处理和排查问题,也容易看进度,分省处理好后再合并成一个新数据集。分省提取到31个数据集,可以用表中的行政区划字段来提取。
create table vt_dltb_11 as SELECT xxx FROM dltb where zldwdm>110000000000 and zldwdm< 119999999999 ;
(2)空间索引
为了快速执行命令,在每个新表使用前都要创建索引。创建空间索引语句:
create index gidx_vt_dltb_11 on vt_dltb_11 using gist(shape);
(3)数据融合
使用PostGIS函数套娃式处理。其中st_union函数需要跟分组语句。
用到的处理函数有st_multi、st_buffer、st_makevalid、st_union、st_snaptogrid此处应该还有更好的优化方式。有了解的可以分享。
- ## 计时
- select clock_timestamp();
- ## 根据地类编码和县级行政区划进行融合,关键函数
- create table vt_dltb_22_unioncnty as
- select obj_name,dlbm,cnty_code,
- st_multi(st_buffer(st_makevalid(st_union(st_makevalid(st_snaptogrid(shape,0.001)))),0.0)) as shape from vt_dltb_22_xf where st_isempty(st_makevalid(st_snaptogrid(shape,0.001))) = false
- group by obj_name,dlbm,cnty_code;
- ## 计时,计算最后耗时
- select clock_timestamp();
(4)坐标转换(目标为EPSG:3857)
因PostGIS函数中,数据重采样(多种阈值)使用ST_SimplifyVW函数重采样,原始数据坐标系为EPSG:4490,数据的单位为度,若用此坐标系的数据进行采样,设置容限值的单位也为度,这对于用户不易理解,同时也不易控制图斑节点保留情况,故而将数据临时转换为EPSG:3857坐标系,这样数据集的坐标系单位为米,重采样的容限值可以更好理解,更容易控制节点的保留情况,尽可能保持图斑拓扑结构和图斑不变形。
坐标系EPSG:4490转换EPSG:3857,使用st_transform+st_setsrid函数,数据转换为数据重采样服务。
- ## 查看当前坐标系,
- SELECT ST_SRID(smgeometry) FROM vt_dltb_11 LIMIT 1;
- ## 如果当坐标系值为0的, 根据已知的坐标系进行设置。
- update vt_dltb_11 set smgeometry = st_geomfromtext(ST_AsText(smgeometry),4490);
- ## 或用另一个函数直接修改--参数=表名,字段名,坐标系srid
- select UpdateGeometrySRID('GISER_dzj', 'geom', 4547);
- ## 投影转换,不修改原始表数据,采用生成新表方式
- create table vt_dltb3857_11 as select obj_code,obj_name,center_x,center_y,elementtype,zldwmc,zldwdm,dlbm,st_transform(st_setsrid(shape,4490),3857) as shape from vt_dltb_11 ;
(5)数据重采样
数据重采样(多种阈值)使用ST_SimplifyVW函数重采样函数。
- ## 分析坐标点数量,获取重采样经验值,可通过变换数据简化阈值参数10米. 值越大重采样粒度越大,面与面之间的缝隙也越大。
- select sum(st_npoints(ST_SimplifyVW(shape,10))) from vt_dltb3857_11;
- ## 开始重采样,将数据写入新表, 只要有用的字段
- create table vt_dltb3857_300_11 AS select obj_code,obj_name,center_x,center_y,elementtype,zldwmc,zldwdm,dlbm,dlmc,ST_SimplifyVW(shape,300) from vt_dltb3857_11;
(6)坐标转换(目标为EPSG:4490)
完成重采样处理后,数据转回原坐标系EPSG:4490。
- ## 转回4490坐标系
- create table vt_dltb4490_300_11 as select obj_code,obj_name,center_x,center_y,elementtype,zldwmc,zldwdm,dlbm,dlmc,ST_Transform(ST_SetSRID(shape,3857), 4490) as shape from vt_dltb3857_300_11 ;
(7) 数据合并
分省数据合并。将重采样后的数据合并成全国一张表。先根据1个省表create mvt_dltb300创建成新表,在将其他30个省数据insert进来。
至此,数据又回到之前一张表的状态了
(8)切图
数据预处理完成后,开始准备切图,以下内容, 如果是非安全机可以存成一个.sh文件通过./xxx.sh执行. 也可以逐行复制到命令行窗口执行。
- #!/bin/bash
- # 该命令行程序可以执行多进程切图
- # 启动前,请修改以下,变量的值
- export iObjectsjavaBin=/opt/iserver8090/support/objectsjava/bin
- export sciFile=/data/dom/cache/2018/gf20182m.sci
- export tasksFolder=/data/dom/cache/2018
- export workspace=/data/dom/UDB/20182m/20182m.smwu
- export map=gf20182m
- # 如果是多机切图,需要修改该list文件,每台机器指定不同的list文件,多机时如果允许,可以每台机器拷贝一份数据,这样能够提升速度,减少网络负担
- export list=$tasksFolder/task/allTask.list
- # 需要几台机器切图,就把该值设置为几
- export listCount=1
- #同时进行的切图进程数,建议设置成电脑核数80%。
- export processCount=28
- #直接设置成0就行
- export mergeCount=100
- export cacheFolder=cache
- export LD_LIBRARY_PATH=$iObjectsjavaBin:$LD_LIBRARY_PATH
- # 设置字体目录的父母为SUPERMAP_ROOT变量
- export CURRENT_PATH=$(cd "$(dirname "$0")"; pwd)
- echo $CURRENT_PATH
- export SUPERMAP_ROOT=$CURRENT_PATH
- # 该命令用于拆分任务,如果是之前断点,需要续切,可以注释掉该行,再次执行即可
- java -cp $iObjectsjavaBin/com.supermap.data.jar:$iObjectsjavaBin/com.supermap.mapping.jar:$iObjectsjavaBin/com.supermap.tilestorage.jar:$iObjectsjavaBin/com.supermap.data.processing.jar com.supermap.data.processing.cache.TaskBuilder $sciFile $tasksFolder $listCount
- #执行切图任务$sciFile参数是10.2版本以后增加减少拷贝的过程.
- java -cp $iObjectsjavaBin/com.supermap.data.jar:$iObjectsjavaBin/com.supermap.mapping.jar:$iObjectsjavaBin/com.supermap.tilestorage.jar:$iObjectsjavaBin/com.supermap.data.processing.jar com.supermap.data.processing.cache.CacheBuilder $workspace $map $list $cacheFolder $processCount $mergeCount $sciFile
- # 检查瓦片丢失
- export targetFolder=$cacheFolder/$map
- export buildFolder=$tasksFolder/task
- echo $targetFolder
- echo $buildFolder
- # java -cp .:$iObjectsjavaBin/com.supermap.data.jar:$iObjectsjavaBin/com.supermap.mapping.jar:$iObjectsjavaBin/com.supermap.tilestorage.jar:$iObjectsjavaBin/com.supermap.data.processing.jar com.supermap.data.processing.cache.CacheCheck $targetFolder $buildFolder $processCount $mergeCount true true
- # 后面为可选参数
- # <参数6(可选):是否检查纯色瓦片。默认值为false。> <参数7(可选):是否检查白线。默认值为false。> <参数8(可选):范围检查文件路径(GeoJSON文件)>
后台执行:执行切图任务时时间会很长(大于1天),可能导致ssh到服务器的终端被断开,可采用后台的方式运行,关闭ssh窗口不影响任务执行。
- nohup xxx 2>&1 &
- nohup java -cp $iObjectsjavaBin/com.supermap.data.jar:$iObjectsjavaBin/com.supermap.mapping.jar:$iObjectsjavaBin/com.supermap.tilestorage.jar:$iObjectsjavaBin/com.supermap.data.processing.jar com.supermap.data.processing.cache.CacheBuilder $workspace $map $list $cacheFolder $processCount $mergeCount $sciFile >log.txt 2>&1 &
查看进度:当控制台执行后,没有输出,无法直接通过窗口查看进度,可通过查看切图指定文件目录查看文件数来确认运行状态。或查看java进程。
ls *.sci|wc -l
对全国三调数据切图以及合并,总耗时:一周左右。
某国土项目需要用到全市地类图斑数据做一些专题图(如土地利用现状图、三调地图、城市规划的总规、控规图)。业务系统需要对这类地图根据属性快速过滤显示,图斑要素动态符号化,以及数据动态更新。故需用到矢量瓦片以实现该业务场景。
全地类图斑数据集的范围广,一般为全市或全省全域覆盖图斑数据集。记录多,节点密,字段多,图斑要素比较碎且图斑要素大小分布不均,部分图斑要素拓扑关系复杂。
以全地类图斑数据集 dltb_h_2018 为例,约 200w 记录,用 dlmc 字段制作土地利用分类专题图(单值专题图)。在目前版本的桌面里生成矢量瓦片,存在下面两类问题:
问题难点 | 问题现象 |
风格错误 |
|
| |
性能差 |
|
关于上文所提到的具体问题现象以及对应的详细优化方案见如下链接:https://blog.csdn.net/supermapsupport/article/details/121910919
在实际项目中,总是能够遇到各种各样切图的问题,下面收集整理了一些遇到过的问题以及解决方法,给大家遇到问题时提供参考思路。
问题一:边界处标签文本或点图标符号被截断【矢量地图】
问题原因:因为地图范围计算的是所有数据集空间范围的并集,对于图标和文字,存在超出空间范围的可能。
解决方法:
问题二:流动显示无法切图【矢量地图】
问题现象:切图的时候iDesktop弹框提示“地图开启了流动显示,请先关闭流动显示,再生成瓦片!”。
解决方法:根据提示在专题图属性中关闭标签专题图层的”流动显示“再生成瓦片"。
问题三:地图切地图缓存慢【矢量地图】
解决办法:
(1)、对大数据量的数据,创建空间索引。
(2)、提前对地图进行地图优化,提高地图的显示性能——此步骤可通过【性能诊断】来判断地图优化是否达到了标准,一般情况下地图刷新在1秒内(更高要求可参考300毫秒),可认为达到标准。
(3)、提高硬件性能(硬盘读写、cpu等)。
(4)、考虑使用单机多任务切图甚至多机多任务切图功能分布式切图。
问题四:提示无法生成瓦片【栅格/影像地图】
问题现象:影像创建镶嵌数据集后,添加到地图,地图中能够正常显示。但是切图时提示“无法生成地图瓦片”。
解决办法:查看数据范围是否存在异常,如果数据坐标系为地理坐标系,数据范围超图+-180,+-90,则无法生成瓦片。
问题五:影像坐标系转换【栅格/影像地图】
问题现象:原始影像坐标系为3857,地图瓦片要求坐标系为4326。
解决办法:在创建镶嵌数据集的时候就将坐标系设置为4326,创建镶嵌数据集的时候会根据原始坐标系进行自动的投影转换到目标坐标系。然后再按照步骤去创建金字塔构以及建概视图。最后进行切缓存即可。
问题六:影像存在白线、黑线等显示异常【栅格/影像地图】
问题现象:大批量影像创建镶嵌数据集后,生成瓦片,发现某些接边处有白线、黑色或者其他拉伸异常现象。
解决办法:产品历史版本缓存结果中出现过白线、黑线等现象,建议此现象您可以优先升级版本至11i,若仍未解决,您可参考如下情况来解决:
问题七:小比例尺瓦片空白【栅格/影像地图】
问题现象:镶嵌数据集切瓦片后,发现小比例尺下地图空白显示,需要放大才能正常显示
排查办法:
(1)、打开原始地图,查看对应空白地图同级比例尺下实现是否正常;
(2)、如果异常,查看镶嵌数据集概视图是否异常;
问题八:切片后某些范围空白【栅格/影像地图】
问题现象:镶嵌数据集切瓦片后,发现所有比例尺中,某个范围均显示为空白。
排查办法:
(1)、检查原始地图,该范围是否本身有空缺;
(2)、如果有空缺,检查这块儿空缺是否有影像数据没有加载成功;
注意:同一个镶嵌数据集只支持相同波段数和位深的.tif、.tiff、.img影像文件,不同类型需要新建多个镶嵌数据集进行管理。
问题九:拆分任务过多【栅格/影像地图】
问题现象:全国范围的地图,一共切图15个比例尺,最大比例尺为1:1000,但是实际精细地图只有某城市,其他地区只是在小比例尺的时候需要做为背景地图。但切图时无法单独为某个城市细分,导致拆分任务达到60多万。
客户需求:全国范围的地图,客户需从全国视角缩放至某地市,对于1:10000及更大比例尺,只需考虑某地市的地图内容,其他城市不需查看
解决办法:分2次切图,分别如下:
问题十:切图慢【栅格/影像地图】
问题现象:对影像数据切图,发现切图性能很慢,查看瓦片写入速度只有2张/s。
解决办法:
问题十一:断电、程序意外退出等导致切图中断【通用】
解决办法:使用【续传/恢复瓦片】选择之前已经生成的*.sci 文件,继续剩余切图任务。
问题十二:地图风格变化或图层要素增加、修改、删除【矢量地图】
解决办法:使用【更新/追加瓦片】,选择地图瓦片配置*.sci 文件,重新指定待更新的瓦片范围、比例尺,对已有瓦片进行更新。
问题一:地图中的个别图层,在切出的矢量瓦片中不显示了
解决办法:矢量瓦片采用的是MapBox矢量瓦片标准,标准中支持的风格相对较少,若发现风格丢失,可检查是否采用了标准中不支持的风格(查找链接如下),如有不支持风格,建议使用标准内风格替代或简化风格。
链接:https://help.supermap.com/iDesktop/zh/tutorial/MapTiles/VectorTilesNotice。
问题二:切矢量瓦片慢,需要提高切图效率
解决办法:切图之前先检查地图性能——此步骤可通过【性能诊断】来判断地图优化是否达到了标准,一般情况下地图刷新在1秒内(更高要求可参考300毫秒),可认为达到标准。对于没有达到标准的地图建议先进行地图优化,可以提高切图效率。
可对下面常见的问题重点关注:
除了以上常见的问题,更加详细的地图优化操作见链接:
https://blog.csdn.net/supermapsupport/article/details/96312170