安卓平台背景下三维实景展示动态缓存技术研究

2022-05-31 23:09王浩翔王春宋宏利赵昕
河南科技 2022年9期

王浩翔 王春 宋宏利 赵昕

摘 要:随着移动设备的普及,实景三维技术在移动端的应用场景愈加丰富的同时,也因内存与网络的限制带来了一些问题。因此,探寻移动端加载大规模实景数据的方法至关重要。本研究选取安徽省滁州市某一地区的实景三维模型,该区域面积为9.14 km2,使用ArcGIS Pro软件将OSGB倾斜摄影数据转换为SLPK格式,以适配移动端,并构建相关APP,在此基础上采用视锥体计算、空间索引等方法,对大体量实景数据在移动设备上的调度进行优化,通过监听摄像机在场景中的空间位置,对当前屏幕可视域内外的模型数据进行动态缓存与释放,以此实现加载大规模实景数据的目的。经试验测试,能够在华为平板上流畅调度近30 GB的模型数据并显示。

关键词:实景三维;视锥体;空间索引;动态缓存

中图分类号:P208;TP391.41    文献标志码:A   文章编号:1003-5168(2022)9-0007-07

DOI:10.19968/j.cnki.hnkj.1003-5168.2022.09.001

Research on Dynamic Cache Technology for 3D Real Scene Display on Android Platform

WANG Haoxiang1    WANG Chun1,2    SONG Hongli1    ZHAO Xin1

(1.School of Earth Science and Engineering,Hebei University of Engineering,Handan 056038,China;

2.College of Geographic Information and Tourism,Chuzhou University,Chuzhou 239000,China)

Abstract: With the popularity of mobile devices,the application scenario of 3D Real Scene in the mobile terminal is becoming more and more abundant.At the same time, it also brings some problems due to the restriction of memory and network.Therefore,it is very important to explore the method of loading large-scale real scene data on the mobile terminal.The article selects the real scene data of a certain area in Chuzhou City,Anhui Province,the constituency covers an area of 9.14 square kilometers,uses ArcGIS Pro to convert its type to SLPK to adapt to the mobile terminal.Uses frustum calculation,spatial index,and other methods to optimize the scheduling of large-scale real scene data on mobile devices.By monitoring the spatial position of the camera in the scene,the model data inside and outside the current screen's visual field is dynamically cached and released,achieve the purpose of loading large-scale real scene data.After testing,it can smoothly schedule and display nearly 30 GB model data on the Huawei tablet.

Keywords:3D real scene;view frustum;spatial index;dynamic cache

0 引言

實景三维(3D Real Scene)是对人类生产、生活和生态空间进行真实、立体、时序化反映和表达的数字化虚拟空间,为经济社会发展和各部门信息化建设提供统一的空间基底。

在移动终端领域,实景三维的应用场景越来越多[1]。国内外GIS企业纷纷推出了适应于不同应用场景的移动端应用程序编程接口(API),如Esri公司的ArcGIS Runtime SDK for Android、北京超图的SuperMap iMoble for Android等,使开发人员能够在移动终端对实景三维模型和GIS数据进行访问、展示、分析与管理。在应用方面,谷歌公司于2007年在谷歌地图的基础上推出了谷歌街景,通过街景车拍摄的不同方向上的照片,为使用者提供实地景象[2],实现实景漫游功能,率先将“实景”这一概念通过移动终端呈现给广大用户。

随着移动设备硬件性能的提升,移动互联时代对GIS的应用要求越来越高[3],信息来源从单一到全信息要素结合,视角从传统实景漫游的固定位置视角到基于球面场景的自由视角,对三维模型的精细程度、操作自由度、地理数据丰富度有了更高的要求。但越精细的模型对设备性能的要求就越高,而如何有效地解决移动设备缓存大体量的实景三维数据具有重要意义。罗安平等[4]利用金字塔模型分层分块管理影像、高程、地形数据,采用OSGearth 引擎构建出三维场景,并成功移植到Android平台,实现地理信息的三维显示。路广[5]利用金字塔模型对三维校园地图瓦片进行存储,从而提高了瓦片的渲染效率。

目前,对移动设备的三维应用研究存在三维模型精细程度有限,视角操作多局限于平移、旋转、缩放基础操作等问题。对此,本研究提出一种基于自由视角的实景模型缓存方法,在原有视角操作的基础上增加环绕目标点的选项,根据当前摄像机的位置,对视野内外的实景模型瓦片动态进行缓存与释放,避免内存占用量过高,从而实现动态缓存大规模实景数据的目的,并支撑基于多源数据聚合的全信息实景地理环境安卓服务平台的建设。

1 大规模实景数据动态缓存与释放的设计思路

由于受内存与网络的限制,移动端无法实现加载大规模实景三维数据,本研究在索引法的基础上,通过改进客户端索引法,配合移动端进行实时监听接口,监控相机位置与屏幕可视域,只缓存可视域及缓冲区内的实景模型数据,对可视域外的实景数据进行动态释放,避免一次性载入过量数据导致系统崩溃。综上所述,本研究设计一种大规模实景数据缓存实现思路(见图1),具体实现步骤如下所示。

①动态获取当前摄像机的视线方向。

②获取移动设备的屏幕参数。

③根据视线方向与屏幕参数计算出视野范围。

④计算出视野范围的最小外接矩形(矩形边与经纬线平行)。

⑤计算出最小外接矩形在地图网格中的位置与矩形包含的地图瓦片集合。

⑥计算矩形瓦片集合内每个瓦片与视野范围的空间关系,得到视野内瓦片的集合。

⑦将瓦片集合内的位置编号与模型文件名进行匹配。

⑧缓存(释放)视野内(外)的模型文件。

2 相关技术

2.1 ArcGIS Runtime SDK for Android

ArcGIS Runtime SDK for Android包括一个用于Android Studio的lib-project和用于eclipse等环境的jar函数库,其提供了丰富的工具、文档和示例,用户能够使用Java语言构建移动应用程序,这些应用程序可运用ArcGIS for Server提供的制图、地理编码、地理处理和自定义功能,并可将其部署到基于Android系统的智能手机和平板上[6-7]。

在三维数据显示上,ArcGIS Runtime SDK for Android提供场景(Scene)、场景视图(SceneView)以三维方式显示的地理内容,分别负责控制逻辑与处理视图。场景包含多个来源于在线或本地的数据图层,可通过底图图层(BasemapLayer)构建一个基础地理环境。场景同时支持二维图层与三维图层,二维图层按照添加顺序来显示,对于要显示的数据类型需要创建图层,如Feature类数据的要素图层FeatureLayer;三维图层则通过图层的高程信息来显示。ArcGIS Runtime SDK for Android还可通过Portal API访问ArcGIS Online和Portal for ArcGIS上的资源,即可与云端建立密切的联系,被多数用户和开发者所关注。

2.2 ArcGIS Pro

ArcGIS Pro可将OSGB倾斜摄影模型转换为ArcGIS Runtime SDK for Android支持的三维数据类型SLPK,可通过Create Intergrated Mesh Scene Layer Package工具对数据进行转换。SLPK(SceneLayer Package)是Esri发起的I3S标准规范的三维数据格式,已被OGC采纳为新的国际三维标准,在移动端可通过场景图层直接实例化SLPK三维场景文件路径指向的对象,从而达到显示实景三维模型的目的。

3 倾斜视角下的实景模型缓存

3.1 倾斜视角下的视野中心

在实景三维应用中,由于相机的视角是不固定的,多数情况下为倾斜视角,倾斜视角下的参数除摄像机所在位置的经度X、维度Y和高度Z之外,还包含摄像机朝向Heading、倾角Pitch和横滚Roll等参数。其中,朝向Heading表示水平方向上摄像机朝向与以正北方向为起始轴的夹角,范围为0°~360°;倾角Pitch表示垂直方向上摄像机朝向与垂直地面朝向地心的起始射线的夹角,范围为0°~180°,0°表示朝向地心,180°表示背向地心;横滚Roll表示模型与场景视角固定的情况下,设备视窗与水平方向的夹角,实际应用情况下多数为0°,可暂不考虑。

在获取X、Y、Z、Heading、Pitch以及设备屏幕大小等参数后,可获取设备可视域内模型信息。首先要获取当前摄像机视野中心在模型上的位置,即摄像机视线与地面模型相交的核心点。核心点的计算方法如下。

核心点与摄像机正射投影点之间的距离为distance。

[distance=Z×tan(Pitch)]    (1)

經度圈上1°对应长Dlang为:

[Dlang=CE/360=111 000 m]   (2)

则经度变化量[ΔY]为:

[ΔY=distance×cos(Heading)/Dlang] (3)

纬度圈上1°对应长Dla与所在的纬度圈相关:

[Dla=(2π×RE×cosX)/360]    (4)

则经度变化量[Δ]X:

[ΔX=distance×sin(Heading)/Dla]  (5)

得出中心点经纬度坐标:

[(CenterX,CenterY)=(X+ΔX,Y+ΔY)]  (6)

其中,CenterX为核心点的纬度;CenterY为核心点的经度;RE为地球半径;CE为地球周长。

3.2 视锥、视野和缩放

视锥体是相机可能看到的空间体积,其形状类似于被剪掉了尖端的金字塔(见图2),根据中心视线向外延展出最大距离的固定视锥体,视锥体与地图瓦片层的切面即为相机可视域,视锥大小可根据移动设备的型号进行动态调整,以获取不同方向上的视野参数。

视野(Field of View,FOV)是视锥体的截取角度。由于视锥体是由6个面组成的三维体,故所需的视野参数由垂直视野和水平视野组成,分别对应水平与垂直方向上的视锥体横截面。

缩放(Zoom)测量的是对象的表现相对于90°视野的比率,即缩放值为α时,对象在屏幕上显示的大小是90°视野下的α倍。

视野与缩放的几何解释如图3所示,通过三角函数换算得到视野fov和缩放zoom之间的关系为式(7)。

[zoom=1tan(fov2)]      (7)

从式(7)可以看出缩放与视野呈反比关系,与视野有水平垂直之分类似,缩放也有垂直水平之分。对于不同型号的移动设备,受分辨率、屏幕大小、窗口占比等因素的影响,水平与垂直方向上的缩放也有不同,其比值为式(8)。

[zoomyzoomx=winPhysxwinPhysy=winResxwinResy×devPhysxdevPhysy×devResydevResx]

(8)

式中,winPhys指应用窗口的物理大小;winRes指应用窗口的分辨率;devPhys指输出设备的物理尺寸;devRes指输出设备的分辨率。在应用窗口占据整个设备屏幕的情况下,窗口分辨率与设备分辨率比例相同,则缩放比例等同于设备物理尺寸比例,在公式(7)的基础上可得到横向视野[fovx]、纵向视野[fovy]及其关系为式(9)。

[fovx=2arctan(tanfovy2×devPhysxdevPhysy)]   (9)

由于本研究只需要横纵方向上视野的比例,可设[fovy]为[π2],结合公式(9),得到视野比例[fov_scale]为式(10)。

[fov_scale=fovyfovx=π4arctandevPhysxdevPhysy] (10)

在获取到视野比例后,可通过SceneView.getFieldOfView()方法来获取设备当前视角下视锥的水平视野,并通过式(10)计算出视锥的垂直视野,同时可通过设置maxDistance来确定视锥的最远范围,即远截面至相机的距离,避免因视线趋向水平时视野太大导致缓存过量。

经此即可获得基于不同型号移动设备的自适应性视野范围。图4为两种不同设备型号移动设备(智能手机和平板电脑)在同一位置朝向正北方向,且与地心射线夹角为30°状态下的视野。该图中视锥体与地面截面覆盖部分即为设备屏幕可见区域,相关比例参数见表1。

3.3 视野包围

经过前文的计算,可以得到当前设备的视野中心在地图上的坐标(CenterX,CenterY)(视线方向)、视锥倾角(视野),根据这些参数计算出可视域,即视锥与地面的截面,获取该截面四个角的坐标信息,以确定被包含在视野内的模型瓦片情况。

视锥与地面的截面可视作由四个点组成的凸四边形,模型瓦片所在的位置可由瓦片中心点的坐标来表示,即判断某个点与多边形的拓扑关系,可用的方法有矢量叉积法、射线交点法、面积判断法等[8-9]。其中,矢量叉积法的原理为:凸多边形内任一点都在边向量的同一侧(边向量同为顺时针或逆时针),则连接各角与内部点的矢量均处在与其具有相同起点的边矢量的同一侧。对于矢量与位置的关系,若有矢量P和Q,且P×Q>0,则P在Q的顺时针方向,反之则在逆时针方向。以图5为例,若点M在多边形ABCD内部,则有如下关系。

[AB×AM>0],[BC][×BM>0],[DA×DM>0]

其中,[AB×AM=x-x1   y-y1x2-x1   y2-y1=(x-x1)(y2-y1)-(x2-x1)(y-y1)] 。同理可得到其余的矢量叉积,若以下叉积同号,则表达如下。

[(x-x1)(y2-y1)-(x2-x1)(y-y1)(x-x2)(y3-y2)-(x3-x2)(y-y2)(x-x3)(y4-y3)-(x4-x3)(y-y3)(x-x4)(y1-y4)-(x1-x4)(y-y4)]

则说明点M(x,y)在凸四边形ABCD内部,将此算法封装至isPointInPolygon(List<Point> pointList,Point targetPoint)方法内,传入参数即可返回得到目标点targetPoint与pointList四个点组成的凸四边形的包含关系。

3.4 空间索引

空间索引是指根据空间对象的位置和形状或空间对象之间的某种空间关系按一定的顺序排列的一种数据结构[10],其中包含空间对象的概要信息,如对象的标识、外接矩形及指向空间对象实体的指针。目前,国内外对空间数据库的索引结构大多采用网格空间索引、四叉树空间索引、R树系列空间索引。

在确定好视野范围后(图6所示的视锥体与地面截面覆盖部分),需要通过空间索引来确定被包含在视野范围内的地图瓦片,从而实现动态缓存。试验用的三维实景模型为OSGB格式的数据,处理后分为283块模型瓦片,由于各瓦片之间权重值一致,适用于网格空间索引。

在直接计算视野内包含的瓦片数量前,先通过计算视野中最小外接矩形来缩小检索范围,避免计算量过大,空间索引网格如图7所示。

图7中每个小正方形代表一个模型瓦片,其长、宽分别为Tile_X与Tile_Y。图7中梯形表示视野范围,梯形外的矩形rangleLT-rangleRT-rangleRB-rangleLB表示视野最小的外接矩形。在获取到外接矩形四角坐标的情况下,即可得到被该外接矩形包含的完整瓦片集,该瓦片集在网格空间中的相对位置可根据其主对角线两端的瓦片位置来确定,即target LT、target RT、target RB與target LB,其计算关系如下所示。

targetL=

Math.ceil[(rangleLT.getX-gridLT.getX)/Tile_X]

targetR=

Math.floor[(rangleRT.getX-gridLT.getX)/Tile_X]

targetT=

Math.ceil[(rangleLT.getY-gridLT.getY)/Tile_Y]

targetB=

Math.floor[(rangleLB.getY-gridLT.getY)/Tile_Y]

(11)

其中,Math.ceil与Math.floor分别表示向上取整与向下取整,通过取得targetL与targetR、targetT与targetB之间的整数集,并对其进行排列组合,即可检索得到外接矩形内所有瓦片的位置与文件名,将这些瓦片位置通过isPointInPolygon方法与视野范围对包含关系进行判断,即可得到视野内的所有模型瓦片。

4 动态监听

要想实现实时获取用户操作对实景三维模型进行动态释放与缓存的目的,须通过ArcGIS Runtime SDK的SceneView.setOnTouchListener()方法对用户在移动设备屏幕上的触摸操作进行监听,Android.view.MotionEvent定义了用户手指在屏幕上滑动时产生的一系列事件。其中,ACTION_DOWN、ACTION_MOVE、ACTION_UP分别代表手指在屏幕上按下、按住滑动、抬起动作,当用户在屏幕上做出相应动作时,系统会调用为该动作设置的方法,从而实现通过监听用户手势来达到动态缓存与释放模型的目的,相关代码如下。

ACTION_DOWN:

this.lastInVisionPoint = inVisionPoint;

/*获取上一次抬起手势时缓存的模型列表*/

ACTION_MOVE:

SceneView.getCurrentViewpointCamera();

/*实时获取当前摄像机的位置*/

List<Point> targetPoint =getTargetModelCenterPoint(getTargetRange(pointList));

/*实时获取视野外接矩形内所有模型瓦片的中心点位置*/

ACTION_UP:

for (Point point : targetPoint){

Boolean isInVision  = ToolUtils.isPointInPolygon(pointList, point) ;

If(isInVision) inVisionPoint.add(point);}

/*循环遍历瓦片中心点列表,判断中心点是否在视野内,是则使其加入缓存列表*/

clearModelNumber = ModelUtils.getClearModel(lastInVisionPoint, inVisionPoint);

for(Integer i: clearModelNumber)

scene.getOperationalLayers().get(i).cancelLoad();

inVisionPoint = ModelUtils.getNonExistentModel(lastInVisionPoint, inVisionPoint);

/*与上一次缓存的模型列表进行对比,删除不在视野内的模型,在此次缓存列表中只保留上一次缓存列表未缓存过的模型*/

for(Point point : inVisionPoint){

String name = FileUtils.getModelFileName();

ArcGISSceneLayer sceneLayer = new ArcGISSceneLayer

(FileUtils.getMobileFilePath(this,“slpks”+File.separator + name));

scene.getOperationalLayers().add(sceneLayer);}

/*循环遍历缓存列表,缓存列表中的模型*/

5 系统界面

本研究设计的APP是基于华为Matepad Pro安卓平板开发设计的,且運行流畅。图8为基于三维实景动态缓存技术开发的全信息实景地理平台界面,在三维实景的基础上,结合多源数据在移动端进行丰富的地理信息表达。

图9为APP在运行过程中,由Android Studio提供的监控工具Android Profiler显示的内存占用情况,上方圆点与圆点的滞留线分别表示用户在屏幕上进行单点与持续触碰的手势操作,其下为APP各模块占用内存情况。平板设备总内存为8 GB,APP占用总内存为600~700 MB,多数用于处理图形,程序运行情况流畅稳定。

6 结语

实景三维的应用建设对地理信息表达能力的提升具有重要意义。本研究提出了一种在移动端对实景模型瓦片进行优化调度的方法,实现了在移动设备上动态缓存并可显示大规模的实景数据,解决了大体量精细模型在移动端应用时由内存等条件限制带来的一系列问题,将程序占用内存带来的问题限制在一定范围内,保障程序运行流畅稳定。基于三维实景动态缓存技术,能够以实景三维为基础,结合遥感影像、土地利用、房地一体等多源数据,完善全信息实景地理环境服务平台建设,为实景三维在移动端上的应用提供有力的技术支持。

参考文献:

[1] 周烽松,敖敏思,楚彬,等.融合CORS的自然资源移动调绘系统设计与实现[J].测绘地理信息,2021(6):142-145.

[2] 孟庆岩,汪雪淼,孙云晓,等.基于街景数据的绿视率模型构建及其影响因子研究[J].生态科学,2020(1):146-155.

[3] 刘先林.移动互联时代的GIS[J].遥感信息,2017(1):1-4.

[4] 罗安平,魏斌,杨春成,等.Android平台的多尺度地理信息三维显示技术[J].测绘科学技术学报,2014(1):107-110.

[5] 路广.基于移动端的三维虚拟校园系统的设计与实现[D].廊坊:北华航天工业学院,2018.

[6] 杨阳,曲平,杨爱玲,等.基于Android平台的基础测绘外业调绘核查系统的研究与开发[J].测绘与空间地理信息,2016(12):122-123,126.

[7] 任思思,张禹,郑磊,等.基于ArcGIS Runtime SDK for Android离线编辑关键技术应用研究[J].测绘与空间地理信息,2017(7):123-125.

[8] 王燕平,刘永和.射线法判断平面中的点在多边形内外的算法[J].山西建筑,2007(33):364-365.

[9] 王群,王恒升.平面内判断点与封闭区域关系的快速算法[J].数学的实践与认识,2021(6):137-143.

[10] 孙卓成.GIS中几种空间数据索引方法探究[J].科协论坛(下半月),2008(2):97-98.