基于GIS的海量点快速地理化呈现的优化方法

发表时间:2020/8/11   来源:《科学与技术》2020年第8期   作者:安新朝 贾殿卫
[导读] 为克服常用GIS系统加载海量地图数据较慢的问题,
        [内容摘要] 为克服常用GIS系统加载海量地图数据较慢的问题,文章介绍了基于GIS的海量数据快速地理化呈现的优化方法,优化了海量数据可视化效率低、用户交互操作延迟大的问题,使得海量数据的显示以及用户体验效果更好。
        [关键词] Gis;海量数据加载;可视化;效率优化
1 引言
        构建在地理信息系统(GIS)之上的移动网络数据地理化呈现系统,将无线网络覆盖数据以可视化图形的形式在地图上展示,为无线网络覆盖信息实时监控与分析以及快速调整提供有力支撑。移动网覆盖评估需求将大量MR(Measure Report)网络覆盖数据以栅格的方式实现地理化呈现,地图服务使用gis系统。由于总数据量较大(千万级~亿级),所以如何快速筛选出指定条件的数据并显示在地图上成为亟待解决的问题。
2快速地理化呈现的优化方法
2.1系统性能问题
        系统初始阶段,数据查询及地理化加载方式采用单线程的方式,且仅存储省内5条高铁线路的数据,数据量较少(一千万以内),数据的查询及加载效率尚可接受(10秒以内),但随着需求的增加,存储数据由5条高铁线路增加到7条高铁线路和16条高速线路以及省内12个地市的区域网络覆盖数据,数据每天的增长量约有五百万条左右,数据查询耗时较长(超过30秒),频繁出现页面卡顿甚至于响应超时。
        通过分析研究,影响性能的两大主要环节是数据库检索耗时和数据传输耗时。本文主要从这两方面入手,通过SQL语句优化、数据库表结构优化、数据查询方式的优化、数据前端显示的优化等方式提高数据地理化呈现的显示性能。
2.2 查询SQL优化
        1.增加合理的索引机制,同时调整查询SQL,使得每次查询都能使用上索引(如:日期、地市编号创建联合索引)
        2.WHERE子句顺序的调整,由于Oracle是采用自下而上的顺序解析WHERE子句的,根据这个原理,那些可以过滤掉最大数据量的条件必须写在WHERE子句的末尾。
        由下表可见SQL优化后的查询效率有了明显的提升

2.3数据库表结构优化
鉴于数据每天的增长量大,将数据库内原有的一张表拆分为线路覆盖表和区域覆盖表两张表,拆分后,数据量较之前减少了一半。数据表拆分前与拆分后对比结果见下表:

由上表可知:表拆分后线路覆盖的查询效率有所提升,但仍不够理想,区域覆盖由于查询加载的数据量相对大,查询耗时仍然较长。
        针对该问题,利用Oracle分区技术,将现有表合理分区(独立的segment),提升数据访问性能。将本文中涉及的两张表线路覆盖和区域覆盖表以时间字段创建主分区,以地市字段创建子分区。分区后,区域覆盖的检索效率有了明显提升(耗时减少了12秒)。
2.4数据查询方式优化
        采用Oracle存储过程调取数据,即将前期程序内单纯的SQL语句改为存储过程保存到数据库中,程序通过调用存储过程,以达到提升查询效率的目的。
        SQL语句检索数据与存储过程检索数据平均耗时情况如表4所示:由下表可知改为存储过程后检索耗时减少了5秒,网络传输耗时减少了3秒。
2.5数据并行查询
        上述方案中的数据查询及加载均是单线程执行,对于单次数据量多的查询,等待时间较长且偶尔会有内存溢出的情况发生,用户体验较差。为此修改为分段加载数据,根据自定义的查询数据类型(RSRP/RSRQ)及属性范围,分为6个区间加载,虽然总耗时没有明显变化,但因一次查询的数据量分为多次并行查询,每次查询耗时减少。在此分段提取数据理念的基础上,提出多线程异步数据加载的方法,利用Ajax的异步加载和tomcat的并发处理查询请求的功能,使每个分段同时发送请求,tomcat并行处理各个查询请求,每个分段渲染各自返回的数据。
        改为分段多线程加载后,最终耗时为各个分段中耗时最长的时间,分段越多,每段数据量越少,检索耗时相应减少,如下表所示:

        需要注意的是,实际查询分段数超过某一个数值后,由于线程数超过了线程池最大线程数,出现线程阻塞等待情况,耗时又会呈增加趋势。
2.6数据传输优化
        从异步数据加载分段结论可以看到,每个分段区间的数据分布不平均;随着每个分段查询到的数据量的增加,数据检索耗时和传输耗时均有明显增长。为避免个别分段数据量大导致整体数据查询加载效率低的问题,可将分段查询数据量均分,每次查询加载相同数据量的数据,使数据检索时间缩短,且使网络传输时长可控。
        为验证每个分页查询数据量的多少对性能的影响程度,以现有数据为例分别测试每页5000条、8000条、10000条数据的情况,发现每页5000条数据,在待查询数据量较多时,分页过多,导致线程数超出线程池最大线程数,性能降低。而对于每页10000条数据的情况,每页的数据检索时间相比每页8000条数据的检索时间要长,由此可以得到结论,现有数据为例每页8000条数据的分页相对更加合理。

2.7前端显示优化
        前端显示优化,主要考虑在可充分呈现无线网络覆盖情况的基础上,尽量减少查询加载的数据量,为此可主要通过以下3个途径进行优化:
1.根据地图不同比例尺,加载不同数量的数据。地图显示比例尺较大时,点的重叠严重,很难看清图层中被覆盖点的颜色,显示全部的点已经无意义。据于此,根据地图比例尺的变化进行优化,加载不同数量的典型数据。经验证地图各个比例尺下最多情况为4万个点左右,由此每页设置8000条可以最大限度的利用多线程且不会发生线程阻塞的情况。
2.根据地图边界获取数据。由于用户只能看到当前地图边界内的数据,所以每次加载只需要加载当前地图边界范围内的数据即可。获取到屏幕内地图最小、最大经纬度,以此为条件查询边界内的数据,每次拖动地图后清空图层并重新加载数据,进一步减少实时屏幕内地图加载数据量。
3.地图拖动后,计算出地图变化的区域,然后按照分页数据查询的方法进行查询,只加载、清除变化区域的数据,未变化的区域数据保持不变,这种方式不仅减少数据的检索时间,而且减少了数据吞吐量和数据传输时间,进一步增强了用户体验。


[参考文献]
[1]Oracle编程艺术 深入理解数据库体系结构:凯特Thomas Kyte
[2]Tomcat:The Definitive Guide,Second Edition:布里泰恩(Jason Brittain),达尔文(Ian F.Darwin)
[3]thinking in java:Bruce Eckel
[4]SQL优化核心思想:罗炳森,黄超,钟侥
[5]SQL优化最佳实践:构建高效率Oracle数据库的方法与技巧:韩锋
[6]Core Java Volume Ⅰ-Fundamentals(Eleventh Edition):凯·S.霍斯特曼(Cay S.Horstmann)

作者简介:
        安新朝  男,1981年生,中国电信河北分公司,工程师,主要研究方向为无线网络优化及无线运营智慧化。
        贾殿卫  男,1982年生,杭州东信网络技术有限公司,工程师,主要研究方向为无线网络优化及系统开发。
投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: