CN111080744B - 顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法 - Google Patents
顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法 Download PDFInfo
- Publication number
- CN111080744B CN111080744B CN201911365146.5A CN201911365146A CN111080744B CN 111080744 B CN111080744 B CN 111080744B CN 201911365146 A CN201911365146 A CN 201911365146A CN 111080744 B CN111080744 B CN 111080744B
- Authority
- CN
- China
- Prior art keywords
- value
- line
- point
- points
- vector
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 239000013598 vector Substances 0.000 title claims abstract description 88
- 238000000034 method Methods 0.000 title claims abstract description 55
- 230000007797 corrosion Effects 0.000 claims abstract description 13
- 238000005260 corrosion Methods 0.000 claims abstract description 13
- 238000006243 chemical reaction Methods 0.000 claims abstract description 5
- 101100391182 Dictyostelium discoideum forI gene Proteins 0.000 claims 2
- 229910000831 Steel Inorganic materials 0.000 claims 2
- 239000003550 marker Substances 0.000 claims 2
- 239000010959 steel Substances 0.000 claims 2
- 230000008569 process Effects 0.000 abstract description 6
- 238000009877 rendering Methods 0.000 description 9
- 230000000694 effects Effects 0.000 description 7
- 238000004364 calculation method Methods 0.000 description 5
- 238000005530 etching Methods 0.000 description 5
- 230000003993 interaction Effects 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 239000003086 colorant Substances 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 230000001133 acceleration Effects 0.000 description 2
- 238000013459 approach Methods 0.000 description 2
- 230000003628 erosive effect Effects 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 238000011160 research Methods 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 238000007664 blowing Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000004040 coloring Methods 0.000 description 1
- 230000008602 contraction Effects 0.000 description 1
- 230000001186 cumulative effect Effects 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000004927 fusion Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000012876 topography Methods 0.000 description 1
- 238000012800 visualization Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T11/00—2D [Two Dimensional] image generation
- G06T11/20—Drawing from basic elements, e.g. lines or circles
- G06T11/203—Drawing of straight lines or curves
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T11/00—2D [Two Dimensional] image generation
- G06T11/20—Drawing from basic elements, e.g. lines or circles
- G06T11/206—Drawing of charts or graphs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T3/00—Geometric image transformations in the plane of the image
- G06T3/40—Scaling of whole images or parts thereof, e.g. expanding or contracting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T5/00—Image enhancement or restoration
- G06T5/20—Image enhancement or restoration using local operators
- G06T5/30—Erosion or dilatation, e.g. thinning
Landscapes
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Image Generation (AREA)
Abstract
本发明公开了一种顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法,包括以下步骤:初始化矢量线要素,指定屏幕坐标系线宽,指定起点和终点处是否绘制半开放尖角形箭头,接着按照坐标转换规则将屏幕线宽转换为世界坐标系的线宽,对线要素进行三角化操作,并在起点和终点进行膨胀操作。然后构建顾及线宽一致性的GPU状态协议,在CPU中组装协议内容并传递到GPU。最终在GPU中获取状态协议,在起点和终点进行半开放尖角形箭头的腐蚀操作,实现保持线宽一致的绘制。本发明通过构建面向半开放尖角形箭头线符号绘制的状态协议,利用结构化的状态协议,实现在地图缩放过程中不改变线宽、不重新三角化,完成线要素起点、终点处的半开放尖角形箭头绘制。
Description
技术领域
本发明涉及数字地图制图领域和地理信息系统领域的矢量地图线符号半开放尖角形箭头绘制方法,尤其涉及一种顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法。
背景技术
数字地图制图是将现实世界中各种空间信息以地图的方式呈现出来,点、线和面要素是地图中最基础的三种表达结构,由此主导了点、线和面符号化方法。通过各种不同的点符号、线符号和面符号,能够将空间实体的分布状况、关联关系、相互作用等信息形象化的传递给读图者。为了能够支撑读图者快速理解地图、准确获取空间信息,地图符号的绘制是最为关键的因素。在现实地理世界中,广泛存在着“方向”型的空间信息,如风吹的方向、河流的方向、道路的行驶方向等。为了能够将此类方向型的信息传递给读图者,带有半开放尖角形箭头的线符号是一种常用的方法。
为了能够绘制带有半开放尖角形箭头的线符号,当前主要有两种方法:一种是基于软件绘制的方法,一种是基于GPU硬件的方法。前者广泛应用于现有各种二维地图平台上,主要是通过纯软件的方式来操作像素着色,典型的方法有GDI+,Cairo,AGG等。例如,论文《面向GIS的矢量线状符号填充算法研究》(张海泉,潘懋,吴焕萍,等.《地理与地理信息科学》,2004,20(04):11-14.),给出了一种基于GDI+的纯软件绘制方法来表达矢量线要素。该种方法严格依赖于矢量线的屏幕坐标和屏幕宽度,当地图缩放时,需要不断的进行重新计算和绘制,严重降低了地图显示的效率。针对此效率低下的问题,后续的研究大多数集中于如何用硬件加速的方法,即后者基于GPU硬件的方法来实现矢量线符号的绘制。
基于GPU硬件绘制的方法主要是研究如何通过GPU着色器(Shader)来绘制线符号。代表性的方法如论文《A function-based linear map symbol building and renderingmethod using shader language》(Yue SS,Yang JS,Chen M,等.《International Journalof Geographical Information Science》,2016,30(2):143-16)提出了一种利用OpenGLShader来构建线符号并用GPU绘制。该方法依赖于一个颜色二维数组来表达符号结构,虽然能够通过数组标记来表达和绘制虚线符号,但整个方法中只是针对固定地图比例尺的绘制,对于线宽的一致性问题完全没有涉及;此论文方法也只是对不带箭头的线符号,如何处理带半开放尖角形箭头的线符号未有涉及。
而论文《一种基于屏幕的三维地图线状符号渲染方法》(刘君妍,陈雅茜,高亦远,等.《地球信息科学学报》,2018,20(8):1047-1054)提出了将矢量线要素映射成为纹理数据,通过纹理数据来绘制线;该方法主要是针对线要素与地形的融合,线要素的线宽处理明确是随着地图缩放而变化的。此外名称为“基于GPU的地图线形符号绘制方法及系统”(申请号201310125110.6)的中国专利,名为“基于GPU的宽度渐变线型地图符号绘制方法”(申请号201610015703.0)的中国专利,名为“基于GPU的颜色渐变线型地图符号绘制方法”(申请号201610016561.X),都是在分析GPU绘制矢量线要素难点的基础上,提出了用Shader着色器来绘制线符号的方法。但是这些方法都是针对固定比例尺的线符号绘制,当地图比例尺变化时,为了保持线宽不变,前述方法都需要重新三角化和绘制。反复不断的三角化对绘制效率具有明显的影响,由此造成了地图的缩放交互仍然存在效率瓶颈。并且由于半开放尖角形箭头的特殊性,已有GPU硬件绘制方法均未提出明确的解决方案。
整体而言,现有方法主要是面向静态线宽绘制,当地图比例尺缩放时,需要重新计算和绘制;另外,基于GPU硬件加速的带半开放尖角形箭头的线要素绘制也未见公开方法。本发明提出了一种顾及线宽一致性的矢量地图线要素半开放尖角形箭头绘制方法,其可以实现:(1)随着地图比例尺缩放保持线宽一致,(2)矢量线要素不需要重新进行三角化,(3)半开放尖角形箭头能够与线要素一起绘制。因为GPU的绘制依赖于三角面片,当一个矢量线被三角化成三角形序列后,GPU只能拿到坐标和颜色,整个绘制是无状态的(即无法区分哪里是起始点、哪里是终止点、哪里是箭头等)。为了能够在GPU中绘制半开放尖角形箭头,本发明的核心就是构建了独特的GPU状态协议,从而驱动CPU-GPU协同工作,实现随着地图缩放线宽保持一致的半开放尖角形箭头绘制。
发明内容
本发明的目的是在GPU绘制环境下,针对带有半开放尖角形箭头的地图线符号线宽一致性绘制需求,突破传统要么不管线宽一致性、要么反复三角化的问题,提供一种能够实现在地图缩放过程中不改变线宽、不重新三角化,实现线要素起点、终点处的半开放尖角形箭头绘制的顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法。
技术方案:一种顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法,包括下列步骤:
步骤1、对矢量线要素的坐标序列进行初始化,设置以像素为单位的屏幕线宽,设置起点和终点处是否绘制半开放尖角形箭头;
步骤2、构建矢量线要素的世界坐标系和屏幕坐标系之间的转换规则,通过此规则将屏幕线宽转换为世界坐标系的线宽,根据此世界坐标系线宽:顺序遍历矢量线要素的每个坐标,由线生成三角形集合,其中每个三角形的每个顶点都具有沿线走向的U值和垂直线走向的V值,并且每个顶点还具有一个缩放方向向量D值;对矢量线要素的起点和终点分别进行膨胀操作和协议标记;
步骤3、组装GPU着色器的状态协议:该状态协议包括两个层次,一个是顶点层,包括U值、V值、缩放方向D值,另一个是结构层,包括最大线宽M值、地图比例缩放S值、起点标记CB、终点标记CE;
步骤4、在CPU中获取初始的世界坐标系线宽和地图比例尺缩放系数,并分别按照状态协议中的M值、S值、CB值和CE值传递到GPU中,由此在GPU着色器中解析状态协议中的U、V、D、M、S、CB、CE值,动态计算当前半开放尖角形箭头需要绘制的像素位置,并最终完成绘制。
进一步的,所述步骤2中:沿线走向的U值根据每个顶点沿着线要素的距离计算获得,其中起点扩张出来的两个顶点U值均为0,终点扩张出来的两个顶点U值均为整条线的长度除以线宽,其他点扩张出来的两个顶点U值均根据长度累积值除以线宽获得;垂直线走向的V值根据每个顶点向两侧扩张的距离计算获得,线要素上的每个点,其扩张出来的两个顶点位于线走向左侧的V为1,位于右侧的0;顶点缩放方向的D值:D值是一个二维向量,指明了扩张出来的每个顶点与原始点之间的连接方向,并且不是一个归一化的向量,D值二维向量的长度是根据扩张顶点与原始点之间的距离计算获得的;
进一步的,所述步骤2中:
矢量线要素的起点膨胀操作:矢量线要素的起点逆于线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此形成两个点;矢量线要素的起点顺着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此再形成两个点;此四个点构成以三个线宽为边长的正方形,也就是起点处的膨胀正方形;
矢量线要素的终点膨胀操作:矢量线要素的终点逆着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此形成两个点;矢量线要素的终点顺着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此再形成两个点;此四个点构成以三个线宽为边长的正方形,也就是终点处的膨胀正方形;
进一步的,所述步骤2中:
矢量线要素的起点标记:起点膨胀正方形中逆着线方向膨胀出来的两个点,其U值均为为-2.0;起点膨胀正方形中顺着线方向膨胀出来的两个点,其U值均为为-1.0;起点膨胀正方形中位于线走向右侧的两个点V值为0,左侧的两个点V值为1;
矢量线要素的终点标记:终点膨胀正方形中逆着线方向膨胀出来的两个点,其U值均为为-10.0;终点膨胀正方形中顺着线方向膨胀出来的两个点,其U值均为为-11.0;终点膨胀正方形中位于线走向右侧的两个点V值为0,左侧的两个点V值为1;
区分起点和终点:线要素中既不是起点也不是终点部分的U值均为大于等于0,起点和终点部分的膨胀正方形U值均小于0,其中起点处的U值大于等于-2.0,而终点处的U值小于-2.0;
进一步的,所述步骤3中,最大线宽M值是根据步骤2中计算获得的世界坐标系的线宽;地图比例缩放S值是随着地图比例尺缩放动态更新的比例值;起点标记CB值和终点标记CE值是对应于是否绘制半开放尖角形箭头的浮点数值,等于0表示不绘制半开放尖角形箭头,小于0表示绘制左侧半开放尖角箭头,大于0表示绘制右侧半开放尖角形箭头;状态协议按照U值、V值、D值、M值、S值、CB值、CE值进行组织,其中U值和V值是一维浮点数、D值是二维浮点数、M值和S值是一维浮点数、CB值和CE值也是一维浮点数,将U值、V值、D值按序组织成四维向量,将M值、S值、CB值、CE值按序组织成四维向量,最终形成的状态协议由两个向量构成:U-V-D四维向量和M-S-CB-CE四维向量,顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制必须严格遵从此协议,在CPU和GPU之间进行消息传递时也必须严格依照此协议进行消息组装。
进一步的,所述步骤4中:
A.将起点处的膨胀正方形的四个点U值统一加上1.0,形成一个0.0到-1.0的区间;将终点处的膨胀正方形的四个点U值统一加上10.0,形成一个0.0到-1.0的区间;
B.根据线的走向,将半开放尖角箭头分为左侧半开放尖角箭头和右侧半开放尖角箭头;
B1.左侧半开放尖角箭头:
首先腐蚀V值小于1/3的部分;
其次,针对V值大于等于1/3的部分,依据U值V值的关系进行划分,按照-2/3的斜率,V值大于U值乘以斜率-2/3的部分进行腐蚀;
剩下的部分,仍然按照-2/3的斜率,V值小于U值乘以斜率-2/3减0.25的部分则继续腐蚀,得到的腐蚀区域中,针对U值小于等于-0.5并且大于等于-0.75的部分,进行填补;
根据上述腐蚀剩下的部分,绘制左侧半尖角箭头;
B2.左侧半开放尖角箭头:
首先腐蚀V值大于2/3的部分;
其次,针对V值小于等于2/3的部分,依据U值V值的关系进行划分,按照2/3的斜率,V值小于U值乘以斜率2/3的部分进行腐蚀;
剩下的部分,仍然按照2/3的斜率,V值大于U值乘以斜率2/3减0.25的部分则继续腐蚀,得到的腐蚀区域中,针对U值小于等于-0.5并且大于等于-0.75的部分,进行填补;
根据上述腐蚀剩下的部分,绘制右侧半尖角箭头。
和现有技术相比,本发明具有如下显著优点:本发明可以充分利用GPU硬件加速的绘制性能,突破GPU仅依靠坐标和颜色的无状态绘制局限,通过定制合理的状态协议,将矢量线的走向信息、线宽信息、起点和终点信息、地图缩放比例信息、半开放尖角形箭头信息在CPU和GPU之间传递。通过两个四维向量的组合,能够有效的组装状态协议;按照U-V-D-M-S-CB-CE的结构能够方便的实现状态内容的获取,从而在GPU的着色器中进行保持线宽一致的半开放尖角形箭头绘制。相比于传统的方法,本发明能够在不重复三角化的基础上,定制清晰的状态协议,实现随着地图比例尺的缩放进行线宽一致的半开放尖角形箭头绘制,从而提升地图的绘制效率和效果。
附图说明
图1是本发明方法的流程示意图;
图2是状态协议的基本结构;
图3是U值、V值和D值的说明,以及基于状态协议的矢量线要素三角化方法说明;
图4是线要素起点处、终点处的膨胀方法说明;
图5是以终点处为例说明在GPU如何进行半开放尖角形箭头的腐蚀方法说明;
图6是M值和S值的说明,以及地图缩放后线宽处理的方法说明,其中深色填充部分为真实绘制的线宽,外层虚线部分为原始不处理前的绘制区域(即一开始三角化的结果);
图7是利用本发明的方法绘制结果示意图,(a)为小比例尺双向半开放尖角形箭头,(b)为大比例尺双向半开放尖角形箭头端头,(c)为小比例尺终点半开放尖角形箭头,(d)大比例尺终点半开放尖角形箭头端头,(e)为小比例尺起点半开放尖角形箭头,(f)为大比例尺起点半开放尖角形箭头端头。
具体实施方式
下面结合附图和具体实施例对本发明的技术方案做进一步说明。
图1为本发明方法的流程图。该方法包括以下步骤:首先对待绘制的矢量线要素进行初始化,指定需要在屏幕上呈现的线宽(像素单位),指定起点和终点处是否绘制半开放尖角形箭头,并确定矢量线要素的世界坐标系和屏幕坐标系之间的转换规则。接着,按照坐标转换规则将屏幕线宽转换为世界坐标系的线宽,并在世界坐标系下对矢量线要素进行三角化操作,同时在起点和终点处进行膨胀操作。然后,按照所构建的顾及线宽一致性的GPU状态协议,在CPU中获取地图缩放比例系数、初始线宽大小、起点终点半开放尖角形箭头标记等信息,并利用状态协议传递到GPU中。最终,在GPU中获取状态协议内容,在起点和终点处进行半开放尖角形箭头的腐蚀操作,实现保持线宽一致的半开放尖角形箭头绘制。
在GPU绘制环境下,三角化是将矢量线要素进行线符号化绘制的关键。GPU着色器获取三角形序列,通过三角形的坐标和颜色来在屏幕上呈现待绘制对象。本质上,GPU的绘制流水线是一种无状态的过程,矢量线的线宽相关信息无法从CPU直接传递给GPU。对于带有半开放尖角形箭头的线符号而言,其需要沿着线的走向、按照确定的线宽进行绘制。基于此需求,本发明设计了一种面向带有半开放尖角形箭头的线符号保持线宽一致性绘制的状态协议。CPU中需要按照此状态协议组织信息,GPU中需要按照此状态协议解析信息。
状态协议包含两个层面,一个是顶点层的U值,V值和D值,另一个是结构层的M值、S值、CB值和CE值,如图2所示;U值、V值、D值、M值、S值、CB值和CE值的内涵和计算方法在后续几个段落阐述。U值和V值分别是两个浮点型float数值,D值是一个二维向量,其具有X和Y方向的分量D(x)和D(y)。M值、S值、CB值和CE值是四个浮点型的数值。U-V-D三个值被组装成一个四维向量,M、S、CB、CE四个值被组装成一个四维向量。因此,面向半开放尖角形箭头的线宽一致性绘制,CPU和GPU之间的信息传递就依赖于这两个四维向量的组合。之所以将U-V-D组装成一个四维向量、将M-S-CB-CE组装成一个三维向量,是为了在CPU-GPU信息传递过程中尽可能减少信息交互的次数,批量进行传递。
对于U-V-D值而言,在图3中给出了相关的计算方法。U-V-D值是附加在每个扩展顶点上的。扩展顶点是指依据矢量线要素上的任一点,按照垂直与线走向的方向分别向两边进行扩张后得到的顶点;其中,扩张距离是线宽的一半(世界坐标系的线宽)。扩张顶点可以分为左侧点和右侧点(根据沿线走向来确定)。如图3所示,所有右侧顶点的V值都是0,所有左侧顶点的V值都是1。任一个扩张顶点的U值都是通过计算其所关联的点与起始点之间的距离得到。起始点的两个扩张顶点的U值都是0,终止点的两个扩张顶点的U值都是整个矢量线的长度除以线宽。起始点与终止点中间的任一点都是按照累积距离除以线宽得到。D值是表明扩张顶点方向的二维向量,该向量是依据扩张顶点与关联点获得。需要注意的是,D向量不能进行归一化,其向量长度就是扩张顶点与关联点之间的长度。
特别的,对于矢量线要素两个端点的U-V-D值而言,起点和终点处均需要进行膨胀处理,如图4所示。在图4中的左半部分,也就是起点位置处:首先逆着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,形成相应的两个膨胀点(左侧点1和右侧点1);接着沿着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,形成相应的另外两个膨胀点(左侧点2和右侧点2)。通过左侧点1、右侧点1、左侧点2和右侧点2这个四个点,构成了起点处的膨胀正方形。通过正方形的对角线进行划分,形成两个三角形传递到GPU中。类似的,图4中同样给出了终点出的膨胀方法,起点和终点的膨胀正方形是对称的:
(1)起点处膨胀正方形的左侧点1和右侧点1,其U值均为-2.0;起点处膨胀正方形的左侧点2和右侧点2,其U值均为-1.0。另外,左侧点1和左侧点2的V值都为1,右侧点1和右侧点2的点V值都为0。四个点的D值都是各自与起点的连接向量。
(2)终点处膨胀正方形的左侧点1和右侧点1,其U值均为-11.0;终点处膨胀正方形的左侧点2和右侧点2,其U值均为-12.0。另外,左侧点1和左侧点2的V值都为1,右侧点1和右侧点2的点V值都为0。四个点的D值都是各自与起点的连接向量。
通过GPU状态协议中的U-V-D值能够判断出起点和终点的位置。既不是起点也不是终点的U值大于等于0;起点的U值小于等-1.0并且大于等于-2.0;终点的U值小于等于-10.0并且大于等于-11.0。
在能够判断何处是起点、何处是终点的基础上,图5给出了基于GPU状态协议的终点处半开放尖角形箭头腐蚀方法。图5的(a)和(b)中正方形区域是终点膨胀正方形,其中没有深色填充的部分就是需要腐蚀掉的部分。在进行腐蚀操作之前,首先将终点膨胀正方形的四个点U值统一加上10.0,从而形成一个0.0到-1.0的区间。接着对半开放尖角箭头按照左侧和右侧进行分类,如果是左侧就根据图5的(a)来进行腐蚀,如果是右侧就根据图5的(b)来进行腐蚀(此处的左侧和右侧同样是以线的走向来区分的)。对于图5的(a)左侧半开放尖角箭头的情况,首先按照V值是否大于1/3进行划分,V值小于1/3的部分进行腐蚀(对应腐蚀区域1)。V值大于等于1/3的部分,再依据U值V值的关系进行划分,按照-2/3的斜率,V值大于U值的部分需要进行腐蚀(对应腐蚀区域2)。剩下的部分,同样按照-2/3的斜率,如果V值小于U值减1/4则继续腐蚀(对应腐蚀区域3和区域4)。最后,在腐蚀区域3中,U值小于等于-0.5并且大于等于-0.75的部分属于错误腐蚀的部分,进行填补(对应于区域4)。由此腐蚀剩下的部分就是绘制左侧半尖角箭头的区域。
对于图5的(b)右侧半尖角箭头,与图5的(a)类似,首先腐蚀V值大于2/3的部分(腐蚀区域1),再腐蚀小于斜率2/3的部分(腐蚀区域2),再腐蚀U值减去1/4后大于斜率2/3的部分(腐蚀区域3和区域4),再填充U值小于等于-0.5并且大于等于-0.75的部分(区域4),最终完成右侧半尖角形箭头的绘制。
图5中给出了终点处的工艺,在起点的工艺与之类似,不同之处在于U值需要统一加上1.0,从而也形成一个0.0到-1.0的区间。
对于M-S-CB-CE值而言,M值是在初始地图比例尺下显示的最大线宽的值,S值是相对于初始地图比例尺的缩放系数,CB值和CE值是指起点和终点是否绘制半开放尖角形箭头。如果CB值等于0表示在起点处不绘制半开放尖角形箭头,CB值小于0表示在起点处绘制左侧半开放尖角箭头,CB值大于0表示在起点处绘制右侧半开放尖角箭头。同样的,如果CE值等于0表示在终点处不绘制半开放尖角形箭头,CE值小于0表示在终点处绘制左侧半开放尖角形箭头,CE值大于0则在终点处绘制右侧半开放尖角形箭头。
如图6所示,在GPU中解析状态协议里面的M-S-CB-CE值,利用以下公式重新计算任一扩张顶点的坐标:X=D(x)*M*(1.0-S)/2.0,Y=D(y)*M*(1.0-S)/2.0。D(x)和D(y)分别表示顶点方向向量的X分量和Y分量。在GPU中结合D值、M值和S值,动态计算每个点真正需要绘制的位置。在图6中外部虚线部分为初始比例尺下需要绘制的区域,中间深色填充部分为缩放比例尺之后需要绘制的区域。可以看出初始区域大,大比例尺区域小;因为在大比例尺下,矢量线要素的扩张顶点直接转换为屏幕坐标后会比初始比例尺大,所以通过D向量和M-S值来控制扩张顶点向内收缩,从而达到一致线宽的绘制效果。
在图7中给出了两个不同地图比例尺,不同半开放尖角形箭头的绘制效果。(a)为小比例尺双向半开放尖角形箭头,(b)为大比例尺双向半开放尖角形箭头端头,(c)为小比例尺终点半开放尖角形箭头,(d)大比例尺终点半开放尖角形箭头端头,(e)为小比例尺起点半开放尖角形箭头,(f)为大比例尺起点半开放尖角形箭头端头。其中,(a)、(c)、(e)都是小比例尺绘制,(b)、(d)、(f)都是大比例尺绘制。(a)、(b)是双向半开放尖角形箭头的绘制效果,(c)、(d)是终点半开放尖角形箭头的绘制效果,(e)、(f)是起点半开放尖角形箭头绘制效果。通过交叉对比可以看出小比例尺和大比例尺的绘制效果在线宽方面是一致的。
实施例:
相比于传统计算机可视化领域中的线绘制,地图绘制中的半开放尖角形箭头符号需要考虑地图比例尺的变化。GPU绘制环境下,仅通过三角形集合的坐标和颜色来控制绘制流程,无法满足保持线宽一致性的需求。所以本发明设计了一种GPU状态协议,通过此协议将线宽相关的信息打包传递给GPU,在GPU中能够有序解析这些信息;同时在起点和终点处定制了独特的膨胀和腐蚀方式,从而达到顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制。
以下是利用OpenGL Shader给出了本发明的实施例:
(1)GPU状态协议结构
(2)CPU状态协议结构
Claims (4)
1.一种顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法,其特征在于,包括下列步骤:
步骤1、对矢量线要素的坐标序列进行初始化,设置以像素为单位的屏幕线宽,设置起点和终点处是否绘制半开放尖角形箭头;
步骤2、构建矢量线要素的世界坐标系和屏幕坐标系之间的转换规则,通过此规则将屏幕线宽转换为世界坐标系的线宽,根据此世界坐标系线宽:顺序遍历矢量线要素的每个坐标,由线生成三角形集合,其中每个三角形的每个顶点都具有沿线走向的U值和垂直线走向的V值,并且每个顶点还具有一个缩放方向D值;对矢量线要素的起点和终点分别进行膨胀操作和协议标记;
所述矢量线要素的起点膨胀操作:矢量线要素的起点逆着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此形成两个点;矢量线要素的起点顺着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此再形成两个点;此四个点构成以三个线宽为边长的正方形,也就是起点处的膨胀正方形;
所述矢量线要素的终点膨胀操作:矢量线要素的终点逆着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此形成两个点;矢量线要素的终点顺着线走向扩张1.5个线宽,再垂直于线走向分别向两侧扩张1.5个线宽,由此再形成两个点;此四个点构成以三个线宽为边长的正方形,也就是终点处的膨胀正方形;
所述矢量线要素的起点协议标记:起点膨胀正方形中逆着线方向膨胀出来的两个点,其U值均为-2.0;起点膨胀正方形中顺着线方向膨胀出来的两个点,其U值均为-1.0;起点膨胀正方形中位于线走向右侧的两个点V值为0,左侧的两个点V值为1;
所述矢量线要素的终点标记:终点膨胀正方形中逆着线方向膨胀出来的两个点,其U值均为-10.0;终点膨胀正方形中顺着线方向膨胀出来的两个点,其U值均为-11.0;终点膨胀正方形中位于线走向右侧的两个点V值为0,左侧的两个点V值为1;
区分起点和终点:线要素中既不是起点也不是终点部分的U值均为大于等于0,起点和终点部分的膨胀正方形U值均小于0,其中起点处的U值大于等于-2.0,而终点处的U值小于-2.0;
步骤3、组装GPU着色器的状态协议:该状态协议包括两个层次,一个是顶点层,包括U值、V值、缩放方向D值,另一个是结构层,包括最大线宽M值、地图比例缩放S值、起点标记CB值、终点标记CE值;
A.最大线宽M值是世界坐标系的线宽;
B.地图比例缩放S值是随着地图比例尺缩放动态更新的比例值;
C.起点标记CB值和终点标记CE值:是对应于是否绘制半开放尖角形箭头的浮点数值,等于0表示不绘制半开放尖角形箭头,小于0表示绘制左侧半开放尖角箭头,大于0表示绘制右侧半开放尖角形箭头;
D.状态协议:按照U值、V值、D值、M值、S值、CB值、CE值进行组织,其中U值和V值是一维浮点数、D值是二维浮点数、M值和S值是一维浮点数、CB值和CE值也是一维浮点数,将U值、V值、D值按序组织成四维向量,将M值、S值、CB值、CE值按序组织成四维向量,最终形成的状态协议由两个向量构成:U-V-D四维向量和M-S-CB-CE四维向量;
步骤4、在CPU中获取初始的世界坐标系线宽和地图比例尺缩放系数,并分别按照状态协议中的M值、S值、CB值和CE值传递到GPU中,由此在GPU着色器中解析状态协议中的U值、V值、D值、M值、S值、CB值、CE值,动态计算当前半开放尖角形箭头需要绘制的像素位置,对起点和终点进行半开放尖角形箭头腐蚀操作,并完成绘制:
A.将起点处的膨胀正方形的四个点U值统一加上1.0,形成一个0.0到-1.0的区间;将终点处的膨胀正方形的四个点U值统一加上10.0,形成一个0.0到-1.0的区间;
B.根据线的走向,将半开放尖角箭头分为左侧半开放尖角箭头和右侧半开放尖角箭头;
B1.左侧半开放尖角箭头:
根据上述腐蚀剩下的部分,绘制左侧半尖角箭头;
B2.左侧半开放尖角箭头:
根据上述腐蚀剩下的部分,绘制右侧半尖角箭头。
2.根据权利要求1所述的顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法,其特征在于,所述步骤2中,沿线走向的U值根据每个顶点沿着线要素的距离计算获得,其中起点扩张出来的两个顶点U值均为0,终点扩张出来的两个顶点U值均为整条线的长度除以线宽,其他点扩张出来的两个顶点U值均为长度累积值除以线宽。
3.根据权利要求1所述的顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法,其特征在于,所述步骤2中,垂直线走向的V值根据每个顶点向两侧扩张的距离计算获得,线要素上的每个点,其扩张出来的两个顶点位于线走向左侧的V值为1,位于右侧的V值为0。
4.根据权利要求1所述的顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法,其特征在于,所述步骤2中,顶点缩放方向的D值是一个二维向量,该二维向量的长度根据扩张顶点与原始点之间的距离计算获得。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911365146.5A CN111080744B (zh) | 2019-12-26 | 2019-12-26 | 顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911365146.5A CN111080744B (zh) | 2019-12-26 | 2019-12-26 | 顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111080744A CN111080744A (zh) | 2020-04-28 |
CN111080744B true CN111080744B (zh) | 2023-05-09 |
Family
ID=70318174
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911365146.5A Active CN111080744B (zh) | 2019-12-26 | 2019-12-26 | 顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111080744B (zh) |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8730258B1 (en) * | 2011-06-30 | 2014-05-20 | Google Inc. | Anti-aliasing of straight lines within a map image |
CN103268626A (zh) * | 2013-04-11 | 2013-08-28 | 江苏省在这里数字科技有限公司 | 基于gpu的地图线形符号绘制方法及系统 |
CN105513110A (zh) * | 2016-01-11 | 2016-04-20 | 南京师范大学 | 基于gpu的宽度渐变线型地图符号绘制方法 |
CN110298780B (zh) * | 2018-03-23 | 2022-10-28 | 腾讯科技(深圳)有限公司 | 地图渲染方法、装置及计算机存储介质 |
-
2019
- 2019-12-26 CN CN201911365146.5A patent/CN111080744B/zh active Active
Non-Patent Citations (1)
Title |
---|
一种基于屏幕的三维地图线状符号渲染方法;刘君妍;陈雅茜;高亦远;李创;佘江峰;;地球信息科学学报(第08期) * |
Also Published As
Publication number | Publication date |
---|---|
CN111080744A (zh) | 2020-04-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8400453B2 (en) | Rendering a text image following a line | |
CN101751682B (zh) | 一种通用地图的制备方法 | |
KR20140073480A (ko) | 라인을 따른 텍스트 이미지 렌더링 | |
WO2013048843A1 (en) | Label positioning technique to reduce crawling during zoom activities | |
Feng et al. | A parallel algorithm for viewshed analysis in three-dimensional Digital Earth | |
US9093006B2 (en) | Image shader using style attribute references | |
KR101552827B1 (ko) | 3차원 객체 모델의 분할 방법 | |
CN111145302B (zh) | 顾及线宽一致性的矢量地图方形虚线符号绘制方法 | |
KR100723422B1 (ko) | 포인트 기반 렌더링 장치와 방법 및 컴퓨터 프로그램을 저장한 컴퓨터로 읽을 수 있는 기록매체 | |
CN111028352B (zh) | 顾及线宽一致性的矢量地图线符号开放尖角形箭头绘制方法 | |
CN111145303B (zh) | 顾及线宽一致性的矢量地图线符号尖角形箭头绘制方法 | |
CN111145296B (zh) | 顾及线宽一致性的矢量地图线符号圆形箭头绘制方法 | |
CN111028353B (zh) | 顾及线宽一致性的矢量地图线符号燕尾形箭头绘制方法 | |
CN113808243B (zh) | 一种可形变雪地网格的绘制方法和装置 | |
CN111080744B (zh) | 顾及线宽一致性的矢量地图线符号半开放尖角形箭头绘制方法 | |
CN111028351B (zh) | 顾及线宽一致性的矢量地图线符号半尖角形箭头绘制方法 | |
CN111127297B (zh) | 顾及线宽一致性的矢量地图实线符号绘制方法 | |
CN111145295B (zh) | 顾及线宽一致性的矢量地图线符号半燕尾形箭头绘制方法 | |
CN111145297B (zh) | 顾及线宽一致性的矢量地图线符号钻石形箭头绘制方法 | |
CN111145301B (zh) | 顾及线宽一致性的矢量地图实线符号端头绘制方法 | |
KR101517465B1 (ko) | 폴리곤의 특징에 적응된 순서로 래스터화하는 래스터화엔진 및 3차원 그래픽스 시스템 | |
CN111145298B (zh) | 顾及线宽一致性的矢量地图栅栏虚线符号绘制方法 | |
CN111127589B (zh) | 顾及线宽一致性的矢量地图圆形虚线符号绘制方法 | |
CN101764940A (zh) | 一种基于像素空间掩码矩阵模型的字幕渲染方法 | |
US20150054842A1 (en) | Image shader using two-tiered lookup table for implementing style attribute references |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |