基于Cesium的空间数据展示与查询关键技术研究
2021-07-12魏世轩
魏世轩
(1.重庆市勘测院,重庆 401121; 2.重庆市地理国情监测工程技术研究中心,重庆 401121)
1 引 言
伴随着计算机、互联网的发展,传统二维WebGIS技术已趋于成熟,基于其开发的数据展示与查询系统也多种多样,精彩纷呈。目前,市面上比较常用的二维WebGIS类库有Esri公司开发的ArcGIS API for JavaScrip、开源的OpenLayers等。但随着三维技术的发展,其更好地虚拟描述现实世界的功能,更好的可视化展示效果,激发了人们对基于三维WebGIS开发地理信息系统的需求,并且三维环境下能展示的数据远远多余二维环境,比如地形数据、三维实景模型等,且三维WebGIS的可拓展性和应用前景也优于二维WebGIS[1]。本文研究如何基于Cesium建设三维模式的空间数据展示与查询系统(图1),并对其中的关键技术进行阐述。
图1 系统主界面
2 Cesium简介
目前,市面上较流行的三维WebGIS类库有ArcGIS API for JavaScript 4.x系列、Cesium等。ArcGIS API for JavaScript 4.x系列为Esri公司基于WebGL与HTML5技术开发,但其调用的三维场景资源数据格式小众,需借助ArcGIS Pro发布,且为付费软件。Cesium是AGI公司开发的一款面向三维地球和地图的世界级的JavaScript开源产品,具有成本低、开发简单、支持多种地图格式等特性[2],用户可快速搭建一款零插件的虚拟地球Web应用,可免费用于商业和非商业用途。
Cesium支持调用WMS、WMTS、TMS、Bing Maps、ArcGIS等多种地图服务图层,也可以用简单的图片作为地图源。同时,Cesium也支持许多数据格式,如JSON、GeoJSON、XML等。在三维球体上能方便地创建点、线、面、体等实体,加载地形数据、3D Tiles格式的三维实景模型数据等[3]。
3 基础底图设计
本文设计研发的空间数据展示与查询系统运行于局域网环境下,需搭建私有的系统运行基础底图,包括覆盖全球的低分辨率影像、覆盖全重庆的影像、覆盖全重庆的路网地名数据、覆盖全重庆的地形数据、界线数据等。
对于覆盖全球的低分辨率影像、覆盖全重庆的影像数据,可采用ArcGIS Server发布成瓦片服务。Cesium默认只支持WGS84地理坐标系和Web墨卡托投影下的瓦片地图,且对切片比例有要求,对于发布Web墨卡托投影的瓦片地图,需裁切南北85.051129°纬度以上的地区,保证整个投影是正方形,如图2所示。出于方便好操作,本文中的全球低分辨率的影像、覆盖重庆的影像数据统一采用WGS84地理坐标系,切片时原点需设置为X:-180.0,Y:90.0,切片的0级比例尺需设置为1∶295497593.05875003,然后依次放大2倍,最后借助Cesium的ArcGIS Map Server Imagery Provider进行加载显示[4,5],如图3所示。
图2 Web墨卡托投影下前两级瓦片
图3 WGS84地理坐标系下前两级瓦片
对于路网地名数据,可下载天地图的TMS形式的瓦片数据,放置web容器内,然后借助Cesium的UrlTemplate Imagery Provider进行加载显示。
对于地形数据,可借助工具将DEM切成Cesium识别的地形瓦片文件,然后发布到web容器内,然后借助Cesium Terrain Provider进行加载,如图4所示。
图4 地形瓦片数据目录结构
对于界线数据,本文采用发布成图层服务的方式进行加载显示,如图5所示。
图5 系统基础底图
4 空间数据存储
本文涉及的空间数据包括原始卫星影像、纠正后卫星影像、分幅正射影像、影像控制点数据等。
对于影像类型的空间数据,在数据入库客户端入库时按其所属子类别、影像的获取时间、卫星类型等入库到服务器的对应目录,同时提取每个影像到数据范围和缩略图。为便于进行空间查询,影像的数据范围应是去除黑边后的有效覆盖范围。由于Cesium按实际位置加载缩略图时需指定西南角、东北角的坐标,所以为了方便浏览缩略图,建议在生成缩略图时,将缩略图的长宽像素值写入已记录有左上角坐标、横竖分辨率的xml文件,便于浏览时计算西南角、东北角的坐标。
对于影像控制点数据,在数据入库时将每个点位的坐标文本信息转换为空间矢量点存入数据库中的空间表,点位的高程、所属项目、地方坐标系坐标等信息存入相应字段,点位的现场照片、刺点影像、相关文档亦可存入数据库或以文件的形式存放在磁盘。
5 空间数据展示
对于影像数据,将影像的空间覆盖范围数据配置好填充色及边框色后借助ArcGIS Server发布成动态服务图层,Cesium环境下采用ArcGIS Map Server Imagery Provider进行加载显示(图6)。具体查看某一幅影像时,再借助Single Tile Imagery Provider加载显示其缩略图,需指定缩略图的西南角、东北角坐标。
图6 影像数据展示效果
对于影像控制点数据,将点图层按像控点类型配置好颜色借助ArcGIS Server统一发布成一个点要素的动态服务图层,Cesium环境下采用ArcGIS Map Server Imagery Provider进行加载显示(图7)。具体查看某一个点的相关信息时再加载其信息及附件。
图7 影像控制点数据展示效果
6 空间数据查询
本文实现的查询功能包括属性查询、空间查询(包括导入shp数据查询)及两者组合查询。前端与后端的查询条件及查询结果的数据交互采用JSON格式(图8),考虑到数据量大,后端分页返回查询结果及总量。
图8 JSON格式的查询条件
对于属性查询,根据不同的数据类型设置不同的查询条件,包括所属卫星、分辨率、获取时间等。由于后台数据库存储了每类数据的元数据信息,所以属性查询实现起来较为容易。
对于空间查询,支持手绘矩形、手绘多边形、导入shp数据查询,手绘图形借助ScreenSpaceEventHandler、ScreenSpaceEventType.LEFT_DOWN/MOUSE_MOVE/RIGHT_CLICK等实现鼠标左键点击、滑动、右键点击事件的监听,从而实现矩形、多边形的实时绘制。对于导入shp数据进行空间查询,本文只支持面图层,取第一条要素进行空间查询,需考虑其可能有空洞、多部件的情况。shp数据借助开源ShpFile库进行读取,record.shapeType为SHAPE_POLYGON、SHAPE_POLYGONM、SHAPE_POLYGONZ表示为面要素。在与后台数据库进行数据通讯时,手绘的矩形、多边形转换成st_geometry形式的文本数据进行交互。对于shp数据,在实际使用中发现shp数据可能存在大量的坐标点,导致最后查询数据库的sql语句超长,因此本文推荐将shp数据存入一个动态服务图层,利用其图斑编号进行空间查询。
数据查询完后,在数据列表里显示查询的结果,列出每条数据的相关信息,在地图窗口内显示对应的数据范围落图等,如图9所示。本文的图层服务多采用ArcGIS Server发布的服务,对于动态服务图层,需修改Cesiun的源码增加ArcGisMapServerImageryProvider设置layerDefs的功能,实现图层的过滤显示,其中的空间范围过滤采用st_intersects或st_contains。对于查询后数据列表每一行数据的单击定位,采用viewer.flyTo实现[8]。
定位的实现代码:
viewer.flyTo(selectEntity,{
duration:0.5,
offset:{
heading:Cesium.Math.toRadians(0.0),
pitch:Cesium.Math.toRadians(-90),
range:Math.ceil(viewer.camera.positionCartographic.height)
}
});
图9 查询结果列表及地图界面
7 其他相关功能
7.1 三维实景数据加载
Cesium支持加载3D Tiles格式的三维实景数据,只需将数据放置在Web服务器内,然后通过Cesium3Dtileset连接加载即可。
7.2 地名查询
本文实现了地名查询辅助数据查询,输入地名,查询后台数据库中的地名POI,分页返回与之匹配的地名数据集。地名点在地图上采用Cesium的billboard进行标注,点击地名列表里的每一行地图自动定位至其所在位置,标注颜色由红色改为蓝色,如图10所示。
图10 地名查询界面
7.3 图层控制
对于加载到地图容器里的图层数据,可通过layer的属性show、alpha控制其是否显示及图层的透明度。
8 结 语
本文研究了Cesium对加载的瓦片数据、地形数据的格式等要求,在局域网环境下,搭建了Cesium框架下的基础底图,并研究了在Cesium环境下如何展示和查询空间数据。数据的展示主要采用发布动态地图服务的方式,在数据查询方面研究了属性查询、空间查询及两者组合查询,并对数据查询中的关键技术进行了阐述。研究表明,开源三维web库Cesium可替代传统的ArcGIS API for JavaScrip、OpenLayers等,实现web端的空间数据的展示与查询,构建三维模式下的WebGIS系统。