一种地方坐标系地图通用加载方法与流程

文档序号:20030036发布日期:2020-02-28 10:16阅读:491来源:国知局
一种地方坐标系地图通用加载方法与流程

本发明属于地理信息技术领域,尤其涉及一种基于地方坐标系地图通用加载方法。



背景技术:

随着人类物质生活的丰富和认知水平的提高,传统的二维gis(geographicinformationsystem,地理信息系统)已不能满足人们对自己所生存的三维空间的认知,需要一种新的方式来表达三维世界。随着计算机技术,特别是计算机图形学、三维仿真技术、虚拟现实技术以及网络通信技术的发展,传统的二维gis被注入了新的活力,web3d(万维网三维)技术与gis结合形成的三维webgis(万维网地理信息系统)已成为gis发展的一个重要方向。

webgl(webgraphicslibrary,web图形库)的发展为三维gis创造了新的发展机遇,webgl是由khronos发布的基于opengl(opengl,opengraphicslibrary,开放式图形库)es2.0的一个开源免费、跨平台的三维图形api(applicationprogramminginterface,应用程序编程接口),具有以下三个主要优点:首先,webgl通过javascript(javascript为一种脚本语言,简称js)脚本实现网络交互式三维动画的制作,无需安装任何插件;其次,webgl本身是opengles2.0的javascript绑定,其利用底层的图层硬件加速功能实现图层渲染,使三维对象的渲染更加流畅;最后,webgl属于开放标准,具有开放性和跨平台性,且有众多开发者的支持。

目前基于webgl的地图渲染引擎有很多,其中mapbox(一种地图渲染引擎,以数据为动力的绘图平台)因具有开源、支持矢量瓦片等的特点被众多用户所喜爱。mapboxgljs是mapbox在网页上显示可交互地图的javascript库,使用webgl进行地图的渲染,其支持两种坐标系:wgs84(worldgeodeticsystem-1984coordinatesystem,1984年世界大地坐标系统)坐标系和web墨卡托投影坐标系。

为了适应我国基础测绘生产生活的需要,国家制定了北京54、xian80地方坐标系和cgcs2000(chinageodeticcoordinatesystem2000,2000国家大地坐标系)大地坐标系以满足我国的实际生产需求。但诸如mapbox等的基于webgl的地图渲染引擎只能加载wgs84和web墨卡托投影两种坐标系下的地图,显然无法满足我国的工程需求,因此迫切需要寻求一种能加载多种坐标系下地图的通用方法。



技术实现要素:

鉴于上述问题,本发明的目的在于提供一种基于webgl的地方坐标系地图通用加载方法,旨在解决mapbox不能加载地方坐标系地图的技术问题。

本发明采用如下技术方案:

所述地方坐标系地图通用加载方法,包括下述步骤:

在当前地方坐标系下,计算地图的图幅范围,在图幅范围内计算地方坐标的像素索引值,将地方坐标系转换成世界坐标系;

根据瓦片范围,将所述世界坐标系转换为瓦片坐标系;

通过着色器使用矩阵转换将瓦片坐标系转换成四维的图形库坐标系,即gl坐标系;

将gl坐标系转换成标准设备坐标系,即ndc坐标系,将ndc坐标系转换成屏幕坐标系,最后直接在屏幕上显示最终的坐标转换结果,实现在屏幕上加载显示地方坐标系地图。

进一步的,所述计算地图的图幅范围,具体过程如下:

在当前地图下获取其中一层z层级下的比例尺s,结合每英寸像素点数dpi,得到该层级下的地图分辨率res=1/(s/0.0254×dpi),进而得到地图在第一层级下的分辨率,即最大分辨率mres=res×2z

根据瓦片尺寸ts即可得到地图图幅范围[ew,eh],其中:

ew=rbc[0]-tlc[0];

eh=rbc[1]-tlc[1];

rbc[0]=tlc[0]+mres×ts;

rbc[1]=tlc[1]+mres×ts;

rbc[0],rbc[1])为地图的右下角坐标;

(tlc[0],tlc[1])为地图的左上角坐标。

进一步的,所述计算地方坐标的像素索引值,具体过程如下:

对于一个地方坐标,结合瓦片大小,转化为其所处瓦片的行列号,行号为r,列号为c,然后结合所在层级,构成世界坐标。

进一步的,所述根据瓦片范围,将所述世界坐标系转换为瓦片坐标系步骤中,瓦片坐标系的瓦片坐标为(tc_x,tc_y),tc_x表示瓦片坐标的横坐标,tc_y表示瓦片坐标的纵坐标。其中:

tc_x=|(c-|c|)×te|;

tc_y=|(r-|r|)×te|;这里||表示取整,te表示瓦片范围。

进一步的,四维gl坐标具有四个分量(x,y,z,w),其中x代表从左到右的轴上分量,y代表从上到下的轴上分量,z代表一个与屏幕垂直的轴上分量,w表示深度值,将gl坐标转换为ndc坐标的实现方式是:将x,y,z分量除以w分量,x,y,z坐标即变换为[-1,1]之间的坐标,同时opengl渲染管线会将[-1,1]之外的坐标丢弃,其中ndc坐标的原点是屏幕的中心,ndc坐标转换成屏幕坐标的实现方式是:屏幕坐标的原点在屏幕的左上角,向右为x轴,向下为y轴,屏幕坐标为(u,v),其中u=(ndc坐标的x分量+1)×屏幕宽度/2;v=(1-ndc坐标的y分量)×屏幕高度/2。

本发明的有益效果是:本发明基于webgl的地图渲染引擎框架mapbox,通过一系列的坐标变换,将地方坐标系转换成世界坐标系,通过计算地图图幅的范围和像素索引值很好的解决了坐标转换的问题,对支持地方坐标系提供了较好的解决方案,解决了较多行业尤其是国土行业的实际应用需求,具有非常大的现实意义。

附图说明

图1是本发明实施例提供的地方坐标系地图通用加载方法的流程图;

图2是对于计算地图图幅范围的流程图;

图3是瓦片坐标系示意图;

图4是最终坐标转换结果示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。

图1示出了本发明实施例提供的地方坐标系地图通用加载方法的流程,为了便于说明仅示出了与本发明实施例相关的部分。

如图1所示,本实施例方法包括下述步骤:

步骤s1、在当前地方坐标系下,计算地图的图幅范围,在图幅范围内计算地方坐标的像素索引值,将地方坐标系转换成世界坐标系。

基于webgl的地图渲染引擎准确加载以地方坐标系为空间参考的地图服务,其核心是如何正确地将地方坐标系坐标转化为世界坐标,以为后续的坐标转换做准备,使之能正确的渲染在地图上,并且与地图的交互也是正确的。在webgl的三维渲染引擎中,将地方坐标转化为世界坐标是首要工作。mapbox采用墨卡托投影的方式将地理坐标投影到世界坐标系内,但是beijing54、xian80等地理坐标系以及高斯投影等平面坐标系无法使用墨卡托投影进行坐标的转换,本发明所以实现了一种能将xian80坐标系、beijing54坐标系、高斯投影坐标系、cgcs2000等地方坐标系转换到世界坐标系的方法。

将实现将地方坐标系转换成世界坐标系,具体包括两步:计算地图图幅范围和计算地方坐标的像素索引值。

对于计算地图图幅范围,在默认情况下wgs84坐标系下的地图范围是[-180,-90,180,90],但是地方坐标系下不是,地方坐标系坐标是贴合某一区域的局部坐标,发布地图服务之后,需要通过层级、比例尺、左上角坐标等参数来计算得到图幅范围。如图2所示,根据地图服务的参数可知地图的左上角坐标tlc,地图在某一层级z下的比例尺s,结合dpi(图像每英寸长度内的像素点数)则可求出该层级下的地图分辨率,进而可以求得地图在第一层级下的分辨率,最后根据瓦片大小即可获得地图的图幅范围。

具体的,对于一层z层级下的比例尺s,结合每英寸像素点数dpi,得到该层级下的地图分辨率res=1/(s/0.0254×dpi),比例尺表示图上一条线段的长度与地面相应线段的实际长度之比,即比例尺=图上距离/实际距离,dpi表示每英寸像素点数,即在屏幕上1英寸距离包含多少像素点,0.0254表示1英寸=0.0254m,地图分辨率res表示一个像素代表的地面实际距离,单位为米,由此可以推算出res=1/(s/0.0254×dpi)。进而得到地图在第一层级下的分辨率,即最大分辨率mres=res×2z,由于使用地图工具发布地图服务时,每层级的分辨率是呈等比形式排布的,且上一层级的分辨率是下一层级的2倍,故在知道了某一层级z的分辨率后,就能得出第一层级分辨率,即最大分辨率mres=res×2z。根据瓦片尺寸ts即可得到地图图幅范围[ew,eh],其中ew表示图幅宽度,eh表示图幅高度:

其中:ew=rbc[0]-tlc[0];

eh=rbc[1]-tlc[1];

rbc[0]=tlc[0]+mres×ts;

rbc[1]=tlc[1]+mres×ts;

rbc[0],rbc[1])为地图的右下角坐标;

(tlc[0],tlc[1])为地图的左上角坐标。

对于计算地方坐标的像素索引值,像素索引值表示某地方坐标在地图像素范围内的像素坐标,对于一个地方坐标,结合瓦片大小,转化为其所处瓦片的行列号,行号为r,列号为c,然后结合所在层级,构成世界坐标。比如,在第8级,瓦片大小是256像素,则地图所占像素范围是256×28=65536像素。mapbox采用的是墨卡托投影的方式将地理坐标转换为像素索引值,但地方坐标系无法采用此方式,本实施例可以将地方坐标系坐标转化为像素索引值,像素索引值可以代表地方坐标在地图上的位置,但是它无法表达其在地图金字塔中的位置,瓦片行列号是以(r,c,z)的形式表达,r表示瓦片所在行号,c表示瓦片所在列号,可以很清楚的表明地方坐标系坐标在地图金字塔中所处的位置,故将像素索引值以行列号的形式表达是很有必要的。将像素索引值转化为其所处瓦片的行列号的计算方式如下:

c=x/256

r=y/256

比如由地方坐标(37631945.11055844,3994519.8191189)计算所在瓦片行列号为(46.2223,95.4866,8),表示该地方坐标处于行号为46、列号为95的瓦片内,且处于第8层级,该瓦片行列号坐标即表示为世界坐标。

步骤s2、根据瓦片范围,将所述世界坐标系转换为瓦片坐标系。

加载一个地图瓦片的时候,需要将坐标转化成gpu(graphicsprocessingunit,图形处理器)能理解的形式。一般地,这种坐标就是瓦片坐标。使用瓦片坐标的优势是只需要创建这个瓦片一次,然后当平移、旋转、缩放地图的时候,只需要更新位置矩阵并传入着色器,就可以调用gpu去不断地绘制该瓦片的数据。一个瓦片有其自己的坐标系,即瓦片坐标系。

如图3所示,假设瓦片范围是8192,即行列均为8192,因此每个瓦片坐标有256/8192=0.03125pixel的坐标精度。则将世界坐标系转化为上述瓦片内部的坐标系的计算方式如下:

瓦片坐标系的瓦片坐标为(tc_x,tx_y),其中:

tc_x=|(c-|c|)×te|;

tx_y=|(r-|r|)×te|;这里双竖线“||”表示对双竖线内的数取整,te表示瓦片范围。

比如tc_x=(46.2223-46)×8192

tc_y=(95.4866-95)×8192

然后舍去小数位,即瓦片坐标为(1821,3986),表示地方坐标(37631945.11055844,3994519.8191189)位于第8层级下行号为95列号为46的瓦片内部的坐标(x:1821,y:3986)处。

步骤s3、通过着色器使用矩阵转换将瓦片坐标系转换成四维的图形库坐标系,即gl坐标系。

本步骤通过着色器实现,着色器用于实现图像渲染,用来替代固定渲染管线的可编程程序。包括顶点着色器(vertexshader)和片元着色器(fragmentshader)。顶点着色器处理顶点数据的变换操作,并最终将坐标变换为标准设备坐标。片元着色器负责颜色等的计算工作,处理的结果最终会显示在屏幕上。

顶点着色器会将瓦片坐标转换成四维的图形库坐标系glcoordinates,即gl坐标(x,y,z,w),其中x和y代表从左到右的轴上分离和从上到下的轴上分离,z代表一个与屏幕垂直的轴上分离,w表示深度值,表示绘制的场景有多深,是产生透视效果(远小近大)的关键因素,即更大的w值意味着绘制在屏幕上时显示会更小。

将瓦片坐标转化为gl坐标需要经过多次矩阵变换,首先是应用透视投影,然后将虚拟的相机移离地图,定位到地图的中心,应用旋转和倾斜操作,这些操作从数学上都是通过乘以一个矩阵实现,将这些矩阵可以利用矩阵乘法关系融合到一个融合矩阵当中,因此本步骤所述的使用矩阵转换将瓦片坐标系转换成四维的gl坐标系采用的是融合矩阵。

比如对瓦片坐标(x:1821,y:3986)进行矩阵变换,将该瓦片坐标扩展为四维坐标,其中z值为0,即高度为0,w值为1,即扩展后瓦片坐标为(x:1821,y:3986,z:0,w:1),可看做向量(1821,3986,0,1)。多次变换的融合矩阵为:

将向量(1821,3986,0,1)左乘该矩阵,则可求得出结果(保留小数点后四位)向量为(14.6406,-4.5000,1405.4802,1405.5000),即应用融合矩阵转换后为(x:14.6406,y:-4.5000,z:1405.4802,w:1405.5000)。

步骤s4、将gl坐标系转换成ndc(normalizeddevicecoordinates,标准设备坐标)坐标系,将ndc坐标系转换成屏幕坐标系,最后直接在屏幕上显示最终的坐标转换结果,实现在屏幕上加载显示地方坐标系地图。

着色器输出gl坐标后,opengl渲染管线会继续工作,即会将gl坐标最终转换成屏幕坐标,这样就可以在屏幕上进行显示了。gl坐标转换为ndc坐标,实现方式是将x,y,z分量除以w分量,这样x,y,z坐标即变换为[-1,1]之间的坐标,其中ndc坐标的原点是屏幕的中心,同时opengl渲染管线会将[-1,1]之外的坐标丢弃,以减少不必要的渲染。例如gl坐标(x:14.6406,y:-4.5000,z:1405.4802,w:1405.5000)转化为ndc坐标为(x:0.0104,y:0.0032,z:1.0000)。

将ndc坐标转换为屏幕坐标的实现方式是,屏幕坐标的原点在屏幕的左上角,向右为x轴,向下为y轴。转换后的屏幕坐标为(u,v),其中u=(ndc坐标的x分量+1)×屏幕宽度/2;v=(1-ndc坐标的y分量)×屏幕高度/2。即上述ndc坐标最终转化为屏幕坐标为(u:970,v:470)。则从地方坐标系坐标一直到正确显示在屏幕上的坐标转换结果如图4所示。

综上,由于地图是以瓦片的形式组织的,用户发布了地方坐标系的瓦片服务之后,如何正确的将之加载到mapbox地图引擎上是本发明重点解决的问题。本发明将地方坐标系转换成世界坐标系,通过计算地图图幅的范围和像素索引值很好的解决了坐标转换的问题,对支持地方坐标系提供了较好的解决方案,解决了较多行业尤其是国土行业的实际应用需求,具有非常大的现实意义。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1