首页> 中国专利> 一种类瓦片技术的海量线划地形图本原存储与调度方法

一种类瓦片技术的海量线划地形图本原存储与调度方法

摘要

本发明公开了一种类瓦片技术的海量线划地形图本原存储与调度方法,其中本原存储包括如下步骤:对地形图内要素进行分级并对层级命名;对每一层级进行矩形分块,并进行编号;求出每一层级的关键比例尺并计算出该层级的显示尺度,然后存储;确定瓦片并编号;包括瓦片编号、大小、位置以及图形数据的每个瓦片数据作为一个整体进行存储;其中调度包括如下步骤:加载;视图变动判断;计算;比较,更新。本发明的在电子地形图制作软件中打开以及平移和缩放的时候可以明显的提高其反应速度。

著录项

  • 公开/公告号CN108664619A

    专利类型发明专利

  • 公开/公告日2018-10-16

    原文格式PDF

  • 申请/专利权人 江西理工大学;

    申请/专利号CN201810454275.0

  • 发明设计人 刘德儿;陶小明;

    申请日2018-05-14

  • 分类号

  • 代理机构四川君士达律师事务所;

  • 代理人芶忠义

  • 地址 341000 江西省赣州市章贡区红旗大道86号

  • 入库时间 2023-06-19 06:47:52

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-06-19

    授权

    授权

  • 2018-11-09

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20180514

    实质审查的生效

  • 2018-10-16

    公开

    公开

说明书

技术领域

本发明涉及图形处理领域,尤其涉及一种类瓦片技术的海量线划地形图本原存储与调度方法。

背景技术

矢量图,也称为面向对象的图像或绘图图像,在数学上定义为一系列由线连接的点。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。矢量图是根据几何特性来绘制图形,矢量可以是一个点或一条线,矢量图只能靠软件生成,文件占用内在空间较小,因为这种类型的图像文件包含独立的分离图像,可以自由无限制的重新组合。它的特点是放大后图像不会失真,和分辨率无关,适用于图形设计、文字设计和一些标志设计、版式设计等。

电子地图现制作基本采用的是矢量图方式,但随着电子地图地物地貌要素表达的更细,内容的不断丰富,加上成图范围不断扩大,在制图软件中打开全幅地图的话相当占内存,因此为了解决该问题,出现了技术:

(1)地形图的分级分块

研究者们提出,将电子地图进行分级分块显示。李鲁群等构建了一个用于PDAmobile终端的矢量图形分块模型:将一副地图逐步分级,根据屏幕显示范围,将第一级横纵向划分成nr,nc份,第二级将第一级的每块再划分nr,nc份,按照矩形分块的方式,可以把一幅图形分成若干对象子集,然后很多的对象子集再从子集下划分出来。

传统上是以国家系列比例尺为基础进行分级的,每层金字塔与一层级相对应,然后以12行8列图幅分块方式对每一层进行分块,针对该传统方法的索引速度慢、可拓展性差等不足,基于多分辨率LOD模型,杜莹等[计了一种金字塔模型,即根据全球经纬度范围规定该金字塔每层的分块数横向是纵向的两倍,第0层以 2×1分块,第K层分块总数为2k+1×2k,该模型是面向于全球。秦宽等考虑到用户一般关注具有实际需求的要素类,提出:将地图中的内容划分成几大类(比如地物、地貌、地名等),按要素的重要程度,再对这几大类分级。王枫则利用抽希算法分别对点、线、面要素进行抽稀,再根据其权重进行分级。

在嵌入式平台上,由于资源受限,提高显示速度成为一个难题。胡泽明等针对数据定位、读取、数据显示这三方面的耗时,提出了对应的解决办法,其中为加快数据读取速度,遵循尽可能只读取屏幕显示范围内所需地图数据原则,采用等分原则将图幅按2n×2n分块,将图块按照实体的重要等级进行多级划分,极大减少数据加载所花费的时间,并且减少多余数据显示的情况。接着胡泽明又在传统分级方法上,将实体数据集分为:基本显示数据集与附加显示数据集(一般不重要的数据如属性等),在图幅分块上提出了超块单元,将减少冗余数据,同时定位次数比起图幅定位略有增加:将多个图块联合成一个超块单元,为保证一个超块单元内的图块数据其等级的一致性,对图块数据重新进行处理。张成花建立了基于要素分级的多层网格索引模型,显示图形时,直接根据显示比例尺通过索引调度所需的图形数据。

(2)多尺度表达方法

多尺度理论最早用于计算机技术上的,后来才在地图的制图综合领域被应用起。针对数据量大的问题,马伯宁[利用基于小波的分析理论建立了空间数据多尺度模型。由于用户相比制图者而言专业知识相对不足,因此对于地图的容量理解不同,制图者的制图综合就不能很好地满足用户的感受,即他们的需求,甚至有可能会出现违背用户的真实需求情况。与制图综合不同,一批学者提出利用视觉感受或感受综合等理论来对电子地图进行显示,使得地图多尺度显示研究方向发生了重大改变,使决定所展示的地图信息内容从只能是制图者转变到用户也能参与到其中,越来越考虑到用户的需求。利用眼洞试验,根据人体视觉感受,来计算地图载负量在地图缩放时的大小,进而确定地图的多尺度显示模型。江南等将地图载负量的变化用曲线形象地表现出来,通过观察该曲线的转折点来确定关键比例尺,进而建立多尺度显示模型用于进行多尺度显示,也有一些学者通过研究自适应分级显示来消除多尺度显示常出现的跳跃感问题。

(3)本原显示调度技术。

郭建忠等利用离中心点最远原则调度数据的方法,通过开辟多个内存空间来存储每图块的空间索引数据,离视图中心点最远,将其清除,装入新的图块索引数据。如果碰到内存不够情况,又要提高效率,则需要利用并行调度算法进行数据调度:根据地图缩放或平移操作利用后台线程根据移动方向进行模糊预判,生成一块预备位图,将其动态调度切换至屏幕替换原来的位图。马亚明结合 VxWorks系统利用双缓存机制在后台完成数据加载,从而实现两个位图之间的切换。刘小生等则是根据客户端请求求出显示区域当前范围,然后计算当前视角内瓦片,服务器端接收请求以及相关消息,通过解析来最终确定瓦片所存储的位置并调度该瓦片至客户端。对三维地形场景渲染构建,刘浩等通过判断视点位置变化来调度瓦片的算法:计算可见区、瓦片四叉树划分、规则化处理、合并瓦片等步骤搜索所需瓦片加载GPU来更新场景;刘振东则通过对地形进行视景体裁剪得出所需渲染的瓦片编号,进而从内存或硬盘中加载瓦片。

但是,矢量图形数据的放大缩小不同于位图以及影像数据,位图以及影像数据放大缩小采用重采样方法,从高分辨率影像重采样生成低分辨率影像数据,即在金字塔里从层级高的瓦片数据经过重采样生成更低一层级的瓦片。而矢量图每级都是不同的图形数据,每层之间的图形数据没有重叠。影像数据分块形状可以是三角形,正方形或者是六边形等,较普遍用的是正方形,因为正方形结构简单,可以对影像图划分成有规则的正方形,用这种模型很容易实现用程序自动分块。矢量图形由于要保证矢量数据的完整性,依据多级比例尺将图形进行分级,每级分割成一定数量同等大小瓦片来构成矢量金字塔。如果直接采用规则图形分割,会破坏其完整性,到后期图幅拼接时由于目前拼接算法还不够成熟,很难做到高效地将两幅图形接缝处的被分割成两个对象合并成完整的一个对象。

上述技术存在如下不足:

(1)现有地图制作软件基本上全部是基于完全内存调度的制图软件,很难支撑如此大的数据量,当数据全部加载后,每个操作响应时间长,极大影响了工作效率。有些软件提供了显示重定义技术,可以提高数据显示重绘效率,但是该技术无法顾及数据显示的视觉无缝体验,即给人产生数据不连续感。

(2)采用的瓦片技术规则分割地形图会破坏要素的完整性,到后期瓦片拼接时由于目前拼接算法还不够成熟,很难做到高效地将两幅图形接缝处的被分割成两个对象合并成完整的一个对象。

(3)目前瓦片调度广泛用于网络地图中,用于CAD平台上通过程序控制的瓦片调度算法还不成熟。

发明内容

本发明的目的针对目前电子地形图制作软件打开或操作大数据地形图响应时间长、效率低等一系列问题,利用类瓦片技术,提出“SSR”概念,对大文件型地形图进行分级分块组织,并基于地形图金字塔模型存储,然后建立二级索引查询语句促使该制图软件与数据库的交互,最终实现了在电子地形图制作软件中缩放漫游视图能够更高效地调度所需要的瓦片数据的方法。

本发明的方法是,一种类瓦片技术的海量线划地形图本原存储与调度方法,其中本原存储包括如下步骤:

S1:对地形图内要素进行分级并对层级命名;

S2:对每一层级进行矩形分块,并进行编号;

S3:求出每一层级的关键比例尺并计算出该层级的显示尺度,然后存储;

S4:确定瓦片并编号,即每一层级中落入或首相交于同一矩形块的要素集合在一块,生成瓦片,瓦片的形状为矩形,大小为其内所有要素最大外包矩形为准;瓦片的位置由瓦片矩形中心点确定,瓦片序号规则为:

瓦片序号=层级名+对应的矩形编号;

S5:将包括瓦片编号、大小、位置以及图形数据的每个瓦片数据作为一个整体进行存储;

其中调度包括如下步骤:

S6:加载;即打开视图或者视图变动时根据初始值或者已有条件判断应当显示的显示层级、显示中心点并根据当前屏幕窗口大小计算屏幕窗口区域包含以及相交于该层级中心点附近的哪些瓦片,从而加载相应的瓦片;

S7:视图变动判断,即在视图变动的时候判断该视图变动是视图缩放还是平移;

S8:计算,即如果视图变动是缩放,则计算缩放后的比例尺,而如果视图变动是平移,则计算平移距离;

S9:比较,即如果视图变动是缩放,则将缩放后的比例尺与该各层级的显示尺度进行比较;如果视图变动是平移,则将其与预设的平移阈值q进行比较;

S10:更新,即如果缩放后的比例尺在当前层级的显示尺度内或者平移距离小于等于平移阈值q,则进行正常的缩放和平移;如果缩放后的比例尺在其它层级的显示尺度内或者平移距离大于平移阈值q,则删除当前数据,加载对应的其它瓦片,即进行步骤S6。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S1中对地形图内要素从高到低分成3级,分别定义为A,B,C级,其按如下步骤实施分级:

S11:点状图层分级;对于大多数是点状物的图层,用点状符号表示,一般在最低显示级别C级内显示;

S12:主要线、面图层分级;根据图层内要素外包矩形大小分布情况,来决定分级级别,一般来说,外包矩形越大,更优先显示,级别也更高;

S13:不常见线面图层分级;按照轮廓范围、略详细物、最详细或不重要物顺序对不常见图层进行分级。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S3中按照下列步骤求出每一层级的关键比例尺:

S31:假设存在系数k,使得当在屏幕上的地图实体真实长度大于等于 k*0.1mm时,肉眼能够分辨清析,其中k为正整数;

S32:准备s台不同屏幕大小的配置合格的电脑,选择t幅具有相对完整图层的具有同一绘图比例尺的地形图样本,其中s,t均为大于2的正整数;

S33:将地形图样本按地图分级模型分成多个层级,将每个层级的地图要素分别合并成一幅图形;

S34:调整k值来观察在不同的电脑上每一层级的要素在界面中缩放显示情况,并最终根据清晰度以及冗余度确定出s×t个k值;

S35:统计上述s×t个k值中,相同个数最多的k值确定为步骤S31中的系数k;

S36:利用下面公式求出关键比例尺;

Mi×Ci×Pixelh=ε×k

其中Mi:当前层级显示长度(单位:m);

Ci:当前层级关键比例尺(单位:像素个数/m);

K:像素个数;

ε:人眼最小分辨率,通常为0.1mm;

Pixelh:单位像素物理长度(单位:mm)。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S12中按照下列步骤实施:

S121:选取与本地形图类似的相同比例大小的多幅地形图;

S122:将每幅图中的要素的外包矩形的长按照固定长度m划分为n个区间,即形成(0-m],(m-2m],(2m-3m],…((n-2)m-(n-1)m],((n-1)m,+∝]共n 个区间,其中m大小按照地图比例以及要素情况进行选取,n为大于1的正整数;

S123:设定阈值r,其中r=2,3,…,n;

S124:分别统计每一幅图中几个主要线、面图层在这n个区间内包含的所有要素外包矩形的长在上述n个区间的百分比hi,其中i=0,1,2,3,…,n-1;

S125:求出多幅图中n个相同区间中的hi的平均值gi,并找出gi最大值所在的区间,然后统计出几个主要线、面图层gi最大值在上述n个区间中的个数fj,其中j=0,1,2,3,…,n,找出个数fj最多的区间为第N个区间并将其个数设为Fj;

S126:利用阈值判断;(1)如果fn=0,则将m值减小一半,转到步骤S122; (2)如果fn≠0且Fj≤r,则进行下一步;(3)如果fn≠0且Fj>r且N不属于 ((n-1)m,+∝]区间,则将N区间划分为两个步长基本相等的区间,这时的n 值加1,转到步骤S124;(4)如果fn≠0且Fj>r且N为((n-1)m,+∝]区间,则将m值加倍,转到步骤S122;

S127:将N区间之前的全部区间合并成一个区间X,将N区间命名成Y区间,将N区间之后的所有区间合并成一个区间Z,这样形成包括N区间在内的三个区间X、Y和Z;如果N区间之前没有其它区间,则将N区间命名成X区间,将 N区间之后到((n-1)m,+∝]之前的区间合并成一个区间Y,将((n-1)m,+∝] 区间设为一个区间Z,这样也形成三个区间X、Y和Z;

S128:根据S125步骤数据判断几个主要线、面图层中哪些图层的gi最大值所在区间在步骤S127设定的三个区间X、Y和Z中的哪一个区间范围,在X区间的图层归入C级,在Y区间的图层归入B级,在Z区间的图层归入A级。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S2中对每一层级进行矩形分块方法为:矩形块长和宽相等,其长度按照下列公式求出:

ScreenH为屏幕高度(单位:像素个数)。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S4中包括如下步骤:

S41:遍列每一层级中落入或首相交于同一矩形块的要素的全部坐标,找出其横坐标最大值Xmax与最小值Xmin以及纵坐标的最大值Ymax与最小值Ymin

S42:求出瓦片的四个角的坐标(Xmin,Ymin)(Xmin,Ymax)(Xmax,Ymin)(Xmax,>max),并由下列公式求出瓦片中心点的坐标以及长和宽;

瓦片长=|Xmax-Xmin|;

瓦片宽==|Ymax-Ymin|。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S2中矩形的编号方法为将格网内的一个个小矩形按从左至右,从下至上进行编号,编号初始值从0开始,编号值为十进制数,表示该层级的第多少号网格,编号id=n×y+x,其中,n为总列数且为大于1的正整数,x为第x列,y为第y行,其中x、y都从0开始取值。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S5中存储模式采用数据库模式。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S9中位移阈值q的大小为步骤S2中矩形块的长的一半大小。

上述的一种类瓦片技术的海量线划地形图本原存储与调度方法,还可以是,步骤S123中阈值r设置为r=INT(n/2),其中INT为取整函数,指不超过实数n/2 的最大整数。

本发明的一种类瓦片技术的海量线划地形图本原存储与调度方法,在电子地形图制作软件中打开以及平移和缩放的时候可以明显的提高其反应速度。

附图说明

图1是瓦片与相似小矩形关系图;

图2是相似小矩形编号图;

图3是金字塔模型与数据表数据传输图;

图4是缩放平移调度流程图。

具体实施方式

下面结合实施例详细说明本发明。

本发明的一种类瓦片技术的海量线划地形图本原存储与调度方法,其中本原存储包括如下步骤:

S1:对地形图内要素进行分级并对层级命名;

S2:对每一层级进行矩形分块,并进行编号;

S3:求出每一层级的关键比例尺并计算出该层级的显示尺度,然后存储;

S4:确定瓦片并编号,即每一层级中落入或首相交于同一矩形块的要素集合在一块,生成瓦片,瓦片的形状为矩形,大小为其内所有要素最大外包矩形为准;瓦片的位置由瓦片矩形中心点确定,瓦片序号规则为:

瓦片序号=层级名+对应的矩形编号;

S5:将包括瓦片编号、大小、位置以及图形数据的每个瓦片数据作为一个整体进行存储;

其中调度包括如下步骤:

S6:加载;即打开视图或者视图变动时根据初始值或者已有条件判断应当显示的显示层级、显示中心点并根据当前屏幕窗口大小计算屏幕窗口区域包含以及相交于该层级中心点附近的哪些瓦片,从而加载相应的瓦片;

S7:视图变动判断,即在视图变动的时候判断该视图变动是视图缩放还是平移;

S8:计算,即如果视图变动是缩放,则计算缩放后的比例尺,而如果视图变动是平移,则计算平移距离;

S9:比较,即如果视图变动是缩放,则将缩放后的比例尺与该各层级的显示尺度进行比较;如果视图变动是平移,则将其与预设的平移阈值q进行比较;

S10:更新,即如果缩放后的比例尺在当前层级的显示尺度内或者平移距离小于等于平移阈值q,则进行正常的缩放和平移;如果缩放后的比例尺在其它层级的显示尺度内或者平移距离大于平移阈值q,则删除当前数据,加载对应的其它瓦片,即进行步骤S6。

进一步的,步骤S1中对地形图内要素从高到低分成3级,分别定义为A,B, C级,其按如下步骤实施分级:

S11:点状图层分级;对于大多数是点状物的图层,用点状符号表示,一般在最低显示级别C级内显示;

S12:主要线、面图层分级;根据图层内要素外包矩形大小分布情况,来决定分级级别,一般来说,外包矩形越大,更优先显示,级别也更高;

S13:不常见线面图层分级;按照轮廓范围、略详细物、最详细或不重要物顺序对不常见图层进行分级。

进一步的,步骤S3中按照下列步骤求出每一层级的关键比例尺:

S31:假设存在系数k,使得当在屏幕上的地图实体真实长度大于等于 k*0.1mm时,肉眼能够分辨清析,其中k为正整数;

S32:准备s台不同屏幕大小的配置合格的电脑,选择t幅具有相对完整图层的具有同一绘图比例尺的地形图样本,其中s,t均为大于2的正整数;

S33:将地形图样本按地图分级模型分成多个层级,将每个层级的地图要素分别合并成一幅图形;

S34:调整k值来观察在不同的电脑上每一层级的要素在界面中缩放显示情况,并最终根据清晰度以及冗余度确定出s×t个k值;

S35:统计上述s×t个k值中,相同个数最多的k值确定为步骤S31中的系数k;

S36:利用下面公式求出关键比例尺;

Mi×Ci×Pixelh=ε×k

其中Mi:当前层级显示长度(单位:m);

Ci:当前层级关键比例尺(单位:像素个数/m);

K:像素个数;

ε:人眼最小分辨率,通常为0.1mm;

Pixelh:单位像素物理长度(单位:mm)。

进一步的,步骤S12中按照下列步骤实施:

S121:选取与本地形图类似的相同比例大小的多幅地形图;

S122:将每幅图中的要素的外包矩形的长按照固定长度m划分为n个区间,即形成(0-m],(m-2m],(2m-3m],…((n-2)m-(n-1)m],((n-1)m,+∝]共n 个区间,其中m大小按照地图比例以及要素情况进行选取,n为大于1的正整数;

S123:设定阈值r,其中r=2,3,…,n;

S124:分别统计每一幅图中几个主要线、面图层在这n个区间内包含的所有要素外包矩形的长在上述n个区间的百分比hi,其中i=0,1,2,3,…,n-1;

S125:求出多幅图中n个相同区间中的hi的平均值gi,并找出gi最大值所在的区间,然后统计出几个主要线、面图层gi最大值在上述n个区间中的个数fj,其中j=0,1,2,3,…,n,找出个数fj最多的区间为第N个区间并将其个数设为Fj;

S126:利用阈值判断;(1)如果fn=0,则将m值减小一半,转到步骤S122; (2)如果fn≠0且Fj≤r,则进行下一步;(3)如果fn≠0且Fj>r且N不属于 ((n-1)m,+∝]区间,则将N区间划分为两个步长基本相等的区间,这时的n 值加1,转到步骤S124;(4)如果fn≠0且Fj>r且N为((n-1)m,+∝]区间,则将m值加倍,转到步骤S122;

S127:将N区间之前的全部区间合并成一个区间X,将N区间命名成Y区间,将N区间之后的所有区间合并成一个区间Z,这样形成包括N区间在内的三个区间X、Y和Z;如果N区间之前没有其它区间,则将N区间命名成X区间,将 N区间之后到((n-1)m,+∝]之前的区间合并成一个区间Y,将((n-1)m,+∝] 区间设为一个区间Z,这样也形成三个区间X、Y和Z;

S128:根据S125步骤数据判断几个主要线、面图层中哪些图层的gi最大值所在区间在步骤S127设定的三个区间X、Y和Z中的哪一个区间范围,在X区间的图层归入C级,在Y区间的图层归入B级,在Z区间的图层归入A级。

进一步的,步骤S2中对每一层级进行矩形分块方法为:矩形块长和宽相等,其长度按照下列公式求出:

ScreenH为屏幕高度(单位:像素个数)。

进一步的,步骤S4中包括如下步骤:

S41:遍列每一层级中落入或首相交于同一矩形块的要素的全部坐标,找出其横坐标最大值Xmax与最小值Xmin以及纵坐标的最大值Ymax与最小值Ymin

S42:求出瓦片的四个角的坐标(Xmin,Ymin)(Xmin,Ymax)(Xmax,Ymin)(Xmax,>max),并由下列公式求出瓦片中心点的坐标以及长和宽;

瓦片长=|Xmax-Xmin|;

瓦片宽==|Ymax-Ymin|。

进一步的,步骤S2中矩形的编号方法为将格网内的一个个小矩形按从左至右,从下至上进行编号,编号初始值从0开始,编号值为十进制数,表示该层级的第多少号网格,编号id=n×y+x,其中,n为总列数且为大于1的正整数,x为第x列,y为第y行,其中x、y都从0开始取值。

进一步的,步骤S5中存储模式采用数据库模式。

进一步的,步骤S9中位移阈值q的大小为步骤S2中矩形块的长的一半大小。

进一步的,步骤S123中阈值r设置为r=INT(n/2),其中INT为取整函数,指不超过实数n/2的最大整数。

下文以AutoCAD为例进一步详细说明本发明。

步骤1,矢量地图分级方案设计及地图分级模型构建

(1)标准图层名称配置

对于地形图,本方法以CASS定义的26个标准图层名称为标准图层分类及名称。设计一配置表结构,字段名分别为“原图层名”和“标准图层名”。可以将源矢量图的图层名称提取出来,导入到“原图层名”字段栏中。在“标准图层名”栏将原图层名配置成标准图层名称,将标准图层名称以一维数组形式返回,即可对图层的名称按照标准图层名称重命名。

(2)分级原理与原则的设定

大地形图内容复杂,信息丰富,为避免数据冗余,符号不清晰,对其进行分级显示。地形图要素的分级与地图概括相似,就是将每一类地形图要素按照其用途,以其几何大小或是重要程度为依据将地形图要素分成多个层级。要素的重要性主要表现的地方有:行政等级、要素长短、面积大小与高差间隔。同类要素内部的等级也可不同,不同类别要素间的等级通常也有高低之分。分级原则:1) 图层内要素总体显示重要程度差别不大时尽量划分在同一层级内;

2)分层时要注意保持空间的逻辑连续性;

3)相邻层级间地图流畅切换,不会出现较大的断层;

4)必须保证要素和其具有空间联系的附属物在同一层,比如沟渠与桥梁;

5)有填充区域的对象要附上填充区域,如稻田符号与稻田边界。

特殊图层处理。对于一些内部要素显示等级相差大的图层,不能放在一个层级来显示,需要分成多个图层来分级显示。等高线分为首、计曲线,两者间的间距较大,计曲线显示级别比首曲线更高。对于等高线图层(编号为DGX),需要分割成两个图层,分别编号命为DGX-S,DGX-I。将等高线图层内的首、计曲线分隔开,首曲线实体存入DGX-S里,计曲线实体存入DGX-I中。SXSS图层代表各种水系设施,如湖泊,河流,沟渠,或者水井、池塘、海岸线等,以及水体附属物如涵洞。对于水系,线状水系一般贯穿整幅地形图,构成图形的基本轮廓,比面状水系等级更高。将SXSS分割成图层名SXSS-R线状水系和图层名 SXSS-B面状水系两个图层,将线状水系存入SXSS-R图层中,面状水系放入 SXSS-B图层中。

(3)地图分级模型建立

对于电子地形图,各图层间的重要程度不一样,显示等级也不同,本文对地图的分级以图层为主。CASS定义的26个图层加上本文自定义的特殊图层处理变动的图层总共30个,根据点、线、面状划分如表1所示。

表1标准图层分类表

本文采取“三步法”对地理要素以图层划分为主进行分级,分别为点状图层分级、主要线与面图层分级、和不常见线面图层分级。

1)点状图层分级

对于大多数是点状地物的图层,用点状符号表示,一般在最低显示级别内显示。

2)主要线、面图层分级

一般CAD地形图中常见的主要图层有JMD、DLDW、DMTZ、ZBTZ、GXYZ、 DLSS等。

分级方法:根据图层内要素外包矩形大小分布情况,来决定分级级别。一般来说,外包矩形越大,更优先显示,级别也更高。

举例:随机选择五幅至少含有以上几种常见图层的普通1:500地图,将上述地形图中所有要素外包矩形大小(长/宽)以实际长度5m为单位划分七个区间分别为(0,5],(5,10],(10,15],(15,20],(20,25],(25,30],(30,+∝],下文为了表述简单也可能将上述区间写成0-5,5-10,10-15,15-20,20-25,25-30,>30。分别统计这几个图层在这七个区间内包含的所有要素外包矩形最长边在上述七个区间中的百分比hi(i=0,1...,6),最后所有地形图上述相同区间的hi取平均数 gi,即gi=hi÷5,将gi依次填入表2中区间字段下方对应空格处。

表2图层要素外包大小各区间统计表

表2各横向对比可知,可知各个图层要素外包大小主要分布在哪个区间内,填入表中主要区间归类字段下。由于处于0-5区间的图层最多为6个,因此将0-5 区间定为N区间,将该个数定为Fj,即Fj=6。由于该区间中非常密集,因此需要对主要在该区间的图层再细划分区间0-3与3-5,用同样方法统计gi大小之后,可以得出0-3之间也有3个图层,3-5之间有3个图层,因此可以将0-3区间定为N区间,这时Fj=3。由于N区间之前没有其它区间因此将N区间定为X区间,由于5-30区间只有一个图层,所以将3-5与5-30合并在一个区间内,定义为Y 区间,30以上有两个图层,因此将其定为Z区间,这样得到这常见图层区间分布情况如表3所示。

表3常见图层区间分布情况表

上述中,30以上的区间即Z区间中有两个图层,这两个图层划入A级,3-30 的区间即Y区间有4个图层,这4个图层划入B级,0-3的区间即X区间有3 个图层,这3个图层划入C级。

需要说明的是,由于图层性质的不同,可能需要划分的区间的长度不一致,同时对图层密集程度理解以及需求不一致,因此为了减少人为操作,更多的可用计算机统计,因此可以设置一个阈值r,该阈值决定多少图层分布在某个区间为合理,对于超出阈值的则需要重新划分区间进行统计。对于上述的例子,开始设置的区间长度为5m,这9个图层中处于0-5区间的图层有6个,5-30之间的有1 个,大于30的有2个,其大部分均在0-5区间,说明其设置并不合理,因此上述例子中将0-5区间进行了进一步的划分为0-3与3-5两个区间,重新划分后0-3 区间有3个图层,3-5之间也有3个图层,其分布已经比较合理,因此不再进行重新划分。对于上述,我们可以设置阈值r=5,最开始的时候Fj=6>r,因此需要重新划分区间,而重新划分后阈值Fj=3<r因此不再继续划分区间。阈值的大小与划分的区间个数n有关系,通常可以设置n/3<r<2n/3,更简单的设置可以设置阈值为图层数一半,若图层数为奇数,则其除以2之后再取整,即可以设置 r=INT(n/2),其中INT为取整函数,指不超过实数n/2的最大整数。

如果由上述步骤得出的最后一个区间的图层数为0,即fn=0,则说明区间的划分并不合理,区间步长偏长,因此应当选用更小的区间,这时可以选用原区间步长约一半长度来重新建立区间并重新统计,即原来的区间长度为5m,现在可以选用区间长度为2.5m进行重建区间并统计。

如果上述得出的最后一个区间的图层数不为0,并且最多的图层数也没有在最后一个区间,则在其他区间中找出N区间,再用阈值进行判断,如果Fj≤r,则说明区间分配比较合理。

如果上述得出的最后一个区间的图层数最多,即最后一个区间为N区间,则说明区间步长偏小,因此应该选用更长步长的区间,通常可以将其步长加倍。

本文中为了陈述方便,选用了区间步长的说法,该说法并不是严格的数学概念,本文中所谓区间步长表示区间中前后两个数字的差(不分开区间和闭区间),反应了区间的长短,比如(0,5)区间的步长为5-0=5。

3)不常见线面图层分级

根据前两步分级,按照轮廓范围、略详细地物、最详细或不重要地物顺序显示等级原则可以大致分为三大层级A、B、C,划分等级由高级到低级开始,层级标识号以大写字母A为最高显示级别,每下一层级的的标识号的比上一级的大一位,显示级别比上一级低一级。

根据本文2.1.2节定义的分级原理与原则,将剩下的不常见线面图层进行分级。JJ表示整个区域间的界限,是行政划分,应该处于最高级A;TK与DLSS 表示一幅地图的轮廓,应该在最高级别显示。DMTZ统计时因为去掉了块参照所以一些区域填充物没有统计,另外该图层表示要素是属于详细地物,应列于B 级中,同样DLJ与DMTZ类似地物列入B级。由于等高(深)线比较密集,加载不方便,等高距一般为1m,可以将DGX-S、DSX-S列入C级,DGX-I、DSX-I 列入B级。注记类图层和点状符号可以看作一个点列入最低显示级C中。对于 CAD里系统默认的0图层,含有不重要的要素,一般是辅助要素,可以列入在最低显示级C中。由此建立分级模型表4,其中显示长度为划分层级的右区间外包矩形大小。

表4地形图分级模型

步骤2,基于LOD的多尺度模型构建

LOD技术最原始是应用于计算机中来简化三维模型,后来将LOD技术应用到电子地图上的思想是:在不同缩放比例尺的视图下,视点越远,人体视觉获得的要素越模糊,只需要显示较粗略的图形;视点越近,获得的要素越清晰,这时需要更详细的图形。地图的多尺度显示方法有两种,第一种是建立多尺度模型存储多尺度相关信息来实现,第二种是地图的自动综合。对于地形图利用自动综合难以实现,第一种方法利用LOD思想,将一幅地形图按照地图内容的显示级别进行分层,通过放大显示区域,展现更高层级的要素,缩小显示区域,详细要素不再显示,保留更低级的层级要素。

(1)屏幕窗口像素大小

每个显示设备的屏幕窗口大小是不变的,它的宽与高以像素个数为单位,像素坐标系的坐标系原点在屏幕左上角,其与WCS坐标系(x,y)的左下角为原点不一样。可先求出一个视图窗口的范围,即其左下角、右上角两个点的投影坐标即 (x,y)坐标,然后用Editor.PointToScreen方法将视图内的WCS坐标转换为当前屏幕坐标,即可求出屏幕窗口大小。PointToScreen有两个参数,第一个参数是要转化的WCS坐标,另一个是当前视图的编号,可以用"CVPORT"参数获得,如下所示:

Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("CVP ORT")。

求屏幕窗口大小算法如下:

第1步:求一个视图的左下角ptmin和右上角ptmax坐标;

第2步:利用PointToScreen方法求对应的屏幕左下角Screenpt1坐标与右上角Screenpt2坐标;

第3步:屏幕显示高度像素值ScreenH=Math.Abs(Screenpt1.Y– Screenpt2.Y)。

(2)关键比例尺

随着电子图在屏幕中的无极缩放,比例尺发生改变。根据人眼的视觉感受及分辨能力,当缩小到一定程度时,数据出现冗余,变得不清晰,要将不需要的图形数据清除,这时的比例尺通常称为关键比例尺。每一层级,都有一相对应的关键比例尺。

地形图矢量金字塔模型的每层级是否在AutoCAD中显示的关键比例尺,关键是确定视图拉伸的高或宽达到多大值时,需要进行图形要素增减。不同屏幕窗口大小,要达到关键比例尺的视图拉伸长宽的值又会发生变化。因此,关键比例尺与屏幕窗口大小和当前视图窗口大小有关,可以定义视图比例尺为屏幕窗口大小与当前视图窗口大小高度之比,如公式(2)所示Criscale(单位:像素个数/ 米)。

CriScale=ScreenH/VtH(1)

其中:ScreenH为屏幕高度(单位:像素个数);VtH为视图需要进行图形要素的增减时的当前视图高度(单位:m)。

其中:ScreenH为屏幕高度;VtH为视图需要进行图形要素的增减时,当前视图高度。

(3)多尺度显示模型

显示尺度:在两个关键比例尺之间,进行缩放时,显现的内容即要素数目、种类保持不变,即不需要调度新一级图块展现,也不需要删除旧图块要素,屏幕内容依然清晰,不出现冗余。

多尺度显示模型由多个显示尺度组成,组成模型的每一个节点为关键比例尺。多尺度模型为{C1,C2,…Ck,…,Cn},其中Ci为关键比例尺,[C1,C2],[C2,C3]就是显示尺度,n为地形图分级的层数。利用该模型,缩放屏幕,调用当前显示尺度所对应的层级的图形要素。

随着视图缩放比例尺变化,每一层级的显示长度真实显示在屏幕上的物理长度也在改变。根据瑞利判据,由于人眼在正常情况下可以清晰地分辨0.1mm大小长度。设想,若当前层级的显示长度显示在CAD窗口上的物理长度达到人眼最小辨识尺度时,则该层级的瓦片显示在屏幕上。由于本发明面向的对象是矢量地形图,在屏幕上观看目标的距离会不一样,以及地图各要素间的联系,单以人眼分辨的最小尺度,不能作为分辨屏幕上的地图内要素的分辨率。假设存在系数 k,使得当在屏幕上的地形图实体真实长度大于等于k*0.1mm时,肉眼能够分辨清析。由分级模型已知各层级的显示长度,根据下列公式(3)可以得出各关键比例尺与屏幕要素可识别的关系。

Mi×Ci×Pixelh=ε×k(2)

Mi:当前层级显示长度(单位:m),如表4所示,为划分层级的右区间外包矩形大小,要表达在图上的该层级大部分要素真实地理长度;

Ci:当前层级关键比例尺(单位:像素个数/m);

K:像素个数;

ε:人眼最小分辨率,通常为0.1mm;

Pixelh:单位像素物理长度(单位:mm)。

Pixelh的确定:由于显示设备不一样,像素大小也没有统一的规定。若已知屏幕的物理尺寸和像素,可以进而求得单位像素物理大小。然而如果随着显示器的改变,根据屏幕的参数由人工进行设定效率太低。可以通过Window的API 来求得像素的大小,调用GetDC函数获取显示设备上下文环境的句柄,通过函数GetDeviceCaps根据指定参数值来获得相关设备的尺寸描述信息。单位像素物理长度可以根据屏幕的物理高度与垂直方向像素数之比,或屏幕的物理宽度与水平方向像素数之比计算得出,如公式(4)所示。

Pixelh=ScreenH/ScreenYN(3)

其中,ScreenYN为屏幕垂直方向的像素数。

通过DllImport关键字将非托管动态库"user32.dll"与"gdi32.dll"引用到C#程序里来定义如下函数。

[DllImport("user32.dll")]//引入user32.dll

static extern IntPtr GetDC(IntPtr ptr);

[DllImport("gdi32.dll")]

static extern int GetDeviceCaps(

IntPtr hdc,//handle to DC

int nIndex//index of capability);

式(3)中的k值实验研究实验方法举例:准备5台不同屏幕大小的配置合格的电脑,选择5幅拥有相对完整图层的具有同一绘图比例尺1:500的地形图。将 5×5地形图样本按地图分级模型分成多个层级,将每个层级的地图要素分别合并成一幅图形。然后通过调整k值来观察每一层级的要素在屏幕中调度显示情况,由于微调k值大小不能引起前后显示效果之间的明显变化,所以以10为单位调整,则k=10*n,n=1,2,3,...,如果此时正好满足屏幕显示需求,则此k值为最佳系数。

设置一个非模态窗口,用于根据实验的满意度随时调整n值,设计一个调度层级地图显示在屏幕上的开关,通过视觉感知来获得当前n值系数下各层级内要素的显示情况(清晰度、冗余度)最终确定系数n值,主要实验步骤所示如下:

填入n值,点击“确定”按钮,首先调度最高显示级A层的所有要素。利用人眼视觉感知判断该图形内要素是否清晰易读。适当缩小出现数据冗余,要素模糊;适当放大时要素间间距足够大,需要再补充要素以填补当前视图空洞,满足用户需求。

点击“下一层”按钮,用相同方法查看其他层的显示情况。

所有屏幕最终最佳显示效果与地形图相适应的n值如表5所示。

表5屏幕与地形图相适应的n值

根据表5中的n值结果,统计各个值的个数,从上可以可看出n值最常取值为3或附近的数,因此n的最理想取值为3,因此k=30。

根据效果对比得出合适n值之后,可进一步由公式(3)以及表4的显示尺度,求得各层级的关键比例尺Ci=3/(Mi*Pixelh),建立多尺度显示模型如表6所示,则在屏幕大小确定下,根据公式(2)视图比例尺对应VtH也可求得。A层级的显示级别最高,可在地图加载初始化时显示A层瓦片数据,可定义其关键比例尺为0,表示地图初始化的最初层,在任何时候显示窗口范围内的该层瓦片数据都需显示出。

表6显示尺度表

根据表6所示,则该多尺度模型为{0,1/(10*Pixelh),1/Pixelh}。

步骤3,基于类瓦片技术的地图分块

(1)类瓦片技术

矢量地理数据的放大缩小不同于影像数据采用重采样方法,从高分辨率影像重采样生成低分辨率影像数据,即在金字塔里从层级高的瓦片数据经过重采样生成更低一层级的瓦片,矢量图每级都是不同的图形数据,每层之间的图形数据没有重叠。影像数据分块形状可以是三角形,正方形或者是六边形等,较普遍用的是正方形,因为正方形结构简单,可以对影像图划分成有规则的正方形,用这种模型很容易用程序实现自动分块。矢量地图由于要保证矢量数据的完整性,依据多级比例尺将地图进行分级,每级分割成一定数量同等大小瓦片来构成矢量金字塔。如果直接采用规则图形分割,会破坏其完整性,后期图幅拼接非常耗时,而且难以复原。基于此,本发明提出一种类瓦片技术,它采用类似于瓦片技术,采用不规则矩形分割DWG地形图的思想。所谓的不规则矩形分割地形图,是将整个地形图范围内的所有完整的对象生成独立图块,保存到一幅图形文件中,假设图块间不会产生重叠,然而,很难找到这样不规则图形作为模型,使其适用于对地形图各个分块中。可以将地形图每个层级要素所组成的图形按一定长和宽建立格网,可知,该层级所有要素都落入单元网格中或与其相交。将这些落入或首相交同一单元网格的要素集合在一块,生成类瓦片,即本发明提出的所谓“相似小矩形”。其中所谓首相交意思为在与要相交的单元格,取离要素起始点坐标最近的单元格,即为首相交该单元格,即该单元格首相交此要素。利用类瓦片技术生成瓦片步骤有:相似小矩形的分割与编号、瓦片的编码、瓦片内容填充及要素编码、矢量瓦片文件生成。

(2)相似小矩形

由于矢量瓦片需保证其内部实体的完整性,其瓦片的大小很难确定,因此提出相似小矩形(Similar small rectangle,简称SSR)概念:对当前层级的覆盖范围以一定长与宽均匀划分m*n个网格,每个网格所包含的要素形成一小矩形,按“一对一”原则,每个矩形对应一个瓦片(block),小矩形就是相对应瓦片的相似小矩形;然后判断要素是否与这些小矩形相关(包含于或首相交于小矩形);最终将这些与同一个小矩形相关的实体要素组合生成一瓦片。这些瓦片的大小不固定,它随着每个相似小矩形包含的要素最小外包矩形大小而变化,但是位置范围与格网的位置大小相关,即瓦片与其对应的SSR是相似的。如图1所示,当前格网划分为四个网格即四个相似小矩形分别为0、1、2、3号,其中0号相似小矩形中包含两个要素,其全部落入小矩形0中,因此瓦片0号对应的为小矩形 0号,瓦片0号大小为这两个要素最大外包矩形,其位置以该最大外包矩形中心点为准确定;而3号相似小矩形包含一个要素并与两个要素首相交,因此瓦片3 号对应的为3号小矩形,其大小为该3个要素最大外包矩形,其位置以最大外包矩形中心点为准。瓦片之间互不重叠。

瓦片的大小和位置可以通过如下方式确定:遍列每一层级中落入或首相交于同一矩形块的要素的全部坐标,找出其横坐标最大值Xmax与最小值Xmin以及纵坐标的最大值Ymax与最小值Ymin;然后求出瓦片的四个角的坐标(Xmin,Ymin)>min,Ymax)(Xmax,Ymin)(Xmax,Ymax),并由下列公式求出瓦片中心点的坐标以及长和宽;

瓦片长=|Xmax-Xmin|;

瓦片宽==|Ymax-Ymin|。

(3)瓦片的编码

将格网内的一个个小矩形按从左至右,从下至上进行编号,编号初始值从0 开始,编号值为十进制数,表示该层级的第多少号网格,编号id=n*y+x。其中,n为总列数,其取值为大于1的正整数,而x表示为第x列,y表示为第y 行,都从0开始取值如图2所示。

本发明利用层级名与瓦片对应的相似小矩形所在的层级范围内的序号,将每层瓦片进行编码如公式(5)所示,其中的瓦片序号与其对应的相似小矩形的编号相同。

Blockid=层级名+瓦片序号(5)

瓦片的内容填充算法。Step1:遍历当前层级所有的实体;Step2:求实体所在的该层行列号m,n;Step3:根据step2选择与该实体外包矩形首相交的相似小矩形;Step4:将该实体添加入该相似小矩形对应的瓦片中;Step5:如果有实体剩余,返回至Step2,否则结束。

瓦片内要素编码。现行国家标准《基础地理信息要素分类与代码》(GB T13923-2006)将地理信息分为几大类,每一类都有一个要素编码。此外,要素编码可以对同一瓦片的所有要素进行标识编码,增加所属层级ID和所属瓦片ID 两个拓展属性。可以用这两个拓展属性来索引相关瓦片或层级内的要素,方便在 CAD操作内对其管理,如清除某一瓦片的所有要素。对CAD地形图添加要素编码,可以利用扩展属性xdata进行存储,添加每一组拓展属性都需要将注册的应用程序名为第一个属性值,后期可以根据其来管理这组拓展属性。通过appname, LevelID,BlockID这三个值生成TypedValue数组,来实现ResultBuffer对象,即 xdata值。

矢量瓦片DWG文件的生成。新建CAD有模板数据库,将矢量瓦片包含的实体插入其模型块表记录中,再保存到本地文件夹里,瓦片文件名为blockid.dwg。如果瓦片内没有数据,则移除该瓦片,不生成本地文件。通过GetObject方法获取数据库里的块表及块表记录;接着,往数据库里添加内容,用 WblockCloneObjects方法将所有瓦片实体的Objectid浅度克隆到新建数据库的块表记录中;最后,SaveAs方法将新建的数据库保存到本地文件夹中,生成格式为.dwg的瓦片文件。

(4)SSR分割大小

对各层级内图形根据格网划可分成若干个等大小的相似小矩形。由于相似小矩形的大小直接与其对应的瓦片大小成正相关,若SSR太大,则瓦片也相对很大,消耗内存,影响效率,则对大地形图的分割失去了意义。若SSR太小,则生成的瓦片的个数也很多,这对于大量瓦片的管理也不易;同时,调度瓦片的次数也大大增多,图形操作软件CAD与后台数据库的交互将很频繁。因此,要合理地划分SSR。

当展示某一层级实体时,屏幕显示区域内显现图形,区域外不显示。为了减少实体的读取量,最好读取的实体为屏幕显示区域需要显现的实物。同时为了小幅度地平移地图时,当前视图空白处需要及时地更新数据,因此,分块大小应该尽量不大于屏幕区域当前比例尺下视图范围。若是瓦片过小,生成的瓦片数量庞大,数据不方便维护管理。很可能有大量的瓦片内容并不多,即要素稀少。视图范围稍微改变就需调度瓦片更新地图,无疑会大量消耗内存,影响效率。

每一层级的BlockWidth(相似小矩形宽)值互不相同,随着层级递进(以 A-B-C顺序),视图放大,视点离得越近,BlockWidth越小。因此,BlockWidth 值与层级的关键比例尺有关。基于此,由于瓦片大小是由其相似小矩形来决定的,本方法划定显示区域至少由两幅瓦片来填充。根据一般屏幕区域高度值比宽度值小很多的情况,可以横铺两块瓦片,本方法将当前屏幕显示区域高度值VtH定义为BlockWidth,为SSR的长与宽,即等长宽切割当前层级范围来划分相似小矩形。BlockWidth=VtH。

由多尺度模型和关键比例尺CriScale公式可以得出各层级瓦片分割大小即 SSR大小,即可以用BlockWidth=ScreenH/Ci求出SSR大小,但由于A层级的关键比例尺C1=0,因此对于A层级需要另行设定。我们知道,A层级SSR要比 B层级的大,这里可以设为其2倍,求出B层级的SSR大小后,就可以求出A 层级的SSR大小,如表7所示,其中ScreenH屏幕显示窗口是一个不定值,Pixelh 像素大小也是个不定值,一般屏幕显示器变化,其值可能会变化。

表7各层级SSR大小分布表

步骤3,基于DWG地形图金字塔模型设计

金字塔模型常用于栅格影像中构成影像金字塔结构,结构模型中的“分层”是根据采样自底而上生成金字塔,对于过大的原影像图幅,对每层级的影像采用分块技术,进行分块组织,这种金字塔称作瓦片金字塔模型。DWG地形图金字塔模型与普遍应用的影像金字塔模型不同,分级方法与分块组织也不一样。根据本方法中构建出的地形图分级模型与多尺度模型,以及层级分块组织,可以构建出用于DWG地形图的矢量金字塔模型。矢量金字塔模型由索引数据和图形数据文件组成。

(1)金字塔模型构建算法

Step1:根据本方法构建的地图分级模型对DWG地形图进行分级划分;

Step2:对每一层级根据本方法的SSR原理进行分块组织处理;

Step3:获取每层的分块大小、关键比例尺、每层的属性BlockID以及 BlockMBR,生成矢量瓦片文件;

Step4:将所有的矢量瓦片存入到本地文件夹或数据库中。

(2)存储模式

模式一:将金字塔模型生成文件,存入本地文件夹中。这种操作方式简单方便,通过索引文件利用索引直接读取数据文件中的数据,再通过偏移量获取所需的层级瓦片。然而该模型有很大局限性,不便管理。

模式二:将金字塔模型所有的数据存入到数据库中。根据金字塔模型结构,将数据存入到数据库中,利用数据库,方便对数据的增、删管理,数据查询、更新效率明显提高而且访问速度更快。除此之外,放入数据库中相对于放入本地磁盘中更安全,避免了数据的误删与泄漏。

基于这两个模式的优缺点,为了方便本方法实现完整地形图分割成的瓦片数据在CAD中的调度管理操作这一目的,将设计好的DWG地形图金字塔模型里的图形数据和索引数据存入数据库中。

步骤4,数据库搭建与数据表设计及瓦片数据插入

Postgresql是目前功能最强大、最复杂、支持数据类型更多的一种开源数据库系统,PostGIS插件与Postgresql的配合很好地补充了对空间对象的查询、修改、索引功能与Oracle的Spacial类似。

(1)数据库的连接。可利用Npgsql组件来访问Postgresql数据库。实现连接数据库方法类,可在C#语言中将Npgsql组件里的名为Npgsql、Mono.Security 两个类库添加到obj文件夹中,引用Npgsql.dll类库,即可利用Npgsql里的API。这里要注意的是Npgsql版本需与工程项目里用的.NET版本不发生冲突。连接数据库参数见表4.2,通过设计一个窗体,填入参数生成连接数据库的字符串,可以创建一个连接对象NpgsqlConnection即可打开指定数据库。

表7数据库连接参数表

为了保存用户的连接数据库参数信息,以免用户下次登录重新输入参数。一般用xml文档进行保存,创建一个XML文档结构如下:

<appSettings>

<add key="Server"value="">

</add>

<add key="Port"value="">

</add>

<add key="UserID"value="">

</add>

<add key="Password"value="">

</add>

<add key="Database"value="">

</add>

</appSettings>

读取xml文件代码并修改里面的属性值代码如下:

XmlDocument xdoc=new XmlDocument();

xdoc.Load(strFileName);

XmlNodeList nodelist=xdoc.GetElementsByTagName("add");

for(int k=0;k<nodes.Count;k++)

{

XmlAttribute xattr=nodelist[k].Attributes["key"];

//通过“key”指引赋值元素中的内容字段

nodelist[k].Attributes["value"].Value=Dic[xattr.Value];

break;

}

xdoc.Save(strFileName);

新建数据库。SQL命令如下:

CREATE DATABASE mydatabase WITH [TEMPLATE=postgis_21_sample]

(2)数据表设计

将目标矢量地形图存入到数据库中,需按照DWG地形图金字塔模型对地形图分层分块,将瓦片存入到数据库中。该模型中每一数据块都存为数据库表里的一条记录,这条记录有多个字段,用来记录该对应瓦片的属性数据与图形数据。将该矢量图分级分块成的所有瓦片图块存入一张表中,该表结构如表8所示。

表8目标图形数据的数据表

新建数据表sql语句如下:

string command="CREATE TABLE"+tablename+"(BlockID VARCHAR(36)PRIMARYKEY,BlockMBR Box2D,LevelID VARCHAR(36),Image Text);"

然后按照DWG地形图金字塔模型,将地形图分级分块后的瓦片图形数据及属性索引数据存入到DWG地形数据库的数据表中,如图3所示。

步骤5,类瓦片在AutoCAD中的本原调度方法

(1)二级空间索引查询

在PostGIS中对空间数据进行插入修改删除等操作都是通过sql语句来进行的,sql语句对Postgresql进行了拓展。由于其具有动态装载性质,可以用来在 SQL解析器中识别解析出WKT与WKB类型函数。

要对CAD屏幕区域的当前显示比例尺所需绘制的地图进行调度,需对新建的DWG矢量地形数据库建立索引。根据当前显示比例尺,判断调用哪些层级的瓦片;再根据屏幕区域与索引出的层级里的瓦片是否相交,来判断需要调度的瓦片。可以利用数据库中的SQL查询语句来建立索引。SQl索引语句设计如下:

SELECT BlockID,Image FROM[数据表名]where LevelID=[Scale]ANDBlockMBR&& ViewMBR

语法解释:BlockID为数据表字段名,是瓦片标志号;Image数据表字段名,为存储的图形数据;BlockMBR为数据表字段名,为瓦片相似小矩形的最小外包;Scale表示对应的层级号;ViewMBR为当前窗口范围。

通过层级编号及相似小矩形最小外包与窗口显示区域相交两个条件可从数据表中选择符号条件的瓦片记录,然后将搜索到的瓦片数据从数据库导出。

(2)图形数据加载

将查询到的所有图形数据从数据库导入到CAD中,首先需导出到本地文件夹生成dwg格式文件,文件名为其对应的blockid.dwg,该文件夹即为缓存区,核心代码如下:

DataTable dt=_PgsqlWorker.QuerySQL(sql);

for(int r=0;i<dt.Rows.Count;i++)

{

//表第r行第一个字段元素blockid

string str0=(string)dt.Rows[r][0];

//表第r行第二个字段元素image(瓦片数据)

string str1=(string)dt.Rows[r][1];

//将字符串转化为字节数组

byte[]buff=Convert.FromBase64String(str1);

//生成文件,文件名为blockid.dwg

File.WriteAllBytes(newdwgpath+"/"+str0+".dwg",buff);

}

其中_PgsqlWorker.QuerySQL方法的参数sqlstr是sql语句,通过执行该sql 查询语句来返回得到一个DataTable值,与数据表同结构。最终缓存区的本地文件导入到CAD中,可通过数据库的WblockCloneObjects方法将图形文件进行克隆加载。

最终缓存区的本地文件导入到CAD中,可通过数据库的WblockCloneObjects 方法将图形文件进行克隆加载。

(3)图形数据本原调度技术

在CAD界面内,要想实现对图形数据的实时调度,需要不断触发一个事件。当对CAD窗口进行缩放、平移时,视图会发生变化,可以触发已注册的Document 类ViewChanged事件来调用处理方法。

获取操作的文档,当缩放或移动视图时,会触发该文档的ViewChanged事件,来调用调度瓦片的方法,最终将瓦片在窗口内显示出来,总的流程如图4 所示。

1)缩放调度

对视图进行放大缩小,改变视点的远近距离,显示比例尺也发生变化,当放大到一定程度时,需要额外调度更低显示层级的瓦片数据,来满足用户需要;当缩小到一定程度时,当前显示要素变得模糊不清,因此需要将低等级的瓦片数据不显示。实现缩放调度函数算法如下:

Step1:判断视图宽或高是否变化,若是,进行Step2。若否,返回。

Step2:计算当前视图viewtbr的比例尺ScreenH/viewtbr.Height,若小于当前层级的更低级显示比例尺,则为放大操作,从数据库中调度显示下一级对应的窗口范围图块;若大于当前层级的显示比例尺,则判定为缩小操作,删除已显示在窗口中当前层级所有图块。

2)平移调度

平移当前地图,视图位置会发生改变,当前的图形已经偏离了显示区域内,不能满足浏览地图所需要的要素,因此,需要根据当前的新显示区域调度相关的瓦片来进行显示。

(1)位移阈值设置

当不断平移视图时,不断计算当前视图尺度,CAD不断与后台交互,消耗内存,影响速度,特别是小幅度平移地图。因此,需要设置一个平移的位移阈值,来决定是否需要调度瓦片,即只有超过该阈值,才计算调度瓦片。

本发明阈值根据瓦片的相似小矩形大小(BlockWidth)来设定。阈值设为BlockWidth/2,当前视图中心点距离上一次需要进行调度地图计算的视图中心点水平位移或垂直位移超过该阈值时,进行判断是否需要调度瓦片。

(2)平移调度算法

Step1:先获取当前视图的尺度值,根据显示尺度模型定位到对应的层级;

Step2:获取显示区域的范围,求与范围相交或包含的所有对应层级瓦片;

Step3:判断瓦片是否在显示区域中,若不存在则判断是否在缓存区中;是则直接调用到CAD中,若不存在,则根据本发明建立的二级索引查询索引语句从数据库获取瓦片到缓存区,然后从缓存区中调用到CAD中。对于不在显示区域内已经加载的瓦片应当清除。

缓存区中未正被调用的瓦片,是先前在CAD里从数据库中索引导出,然后调度显示完成的,由于该瓦片不需要显示出,所以被释放,但依然还保存在缓存区里。当本次对地图在CAD中的操作完成后,应当删除缓存区的文件,以防下次操作时将已经存在于缓存区的文件再次导入到CAD中。

以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号