罗 鹏 ,许等平 ,任 怡
(1.中国林业科学研究院 资源信息研究所,北京 100091;2.国家林业局 调查规划设计院,北京 100714)
全国林地“一张图”的建设,是按着统一的标准规范汇集全国基础地理、遥感影像、地形、林地落界小班数据及各类专题的成果图。全国36个省级林业区划单位汇总之后约有7 000万林地落界小班[1];以及在此基础上生产了包括林地分布图、公益林、商品林分布图、林种分布图、林地权属分布图、林地保护等级分布图和森林资源分布图等多个专题业务地图数据,在线应用总数据量超过20 TB。作为林地和森林资源管理的基础数据需支撑多个业务,以往数据级别的共享难以支撑大量应用和广泛的访问需求[2]。WebGIS是Internet技术应用于地理信息系统开发的产物,特别是基于Web2.0的Ajax异步刷新、WebService和瓦片地图技术的WebGIS方案提出[3-6],不仅开拓了地理信息资源利用的新领域,而且为GIS信息的高度社会化共享提供了可能。地图作为空间信息可视化的一种载体,其性能是WebGIS建设成功的关键;瓦片技术通过地图预渲染、地图静态化和瓦片化[7],充分利用多线程技术将地图瓦片在客户端进行拼接浏览,从而提升地图服务的可用性。然而地图的瓦片化技术以“空间换时间”的策略,一方面带来了数据量的激增,往往是原始矢量数据的几倍或几十倍,许多学者对其存储方式[8-11]、服务化技术[11-12]开展了研究,但是面对海量瓦片数据的服务架构、并发访问、瓦片服务的高可用性方面开展研究较少;另一方面,静态化的地图瓦片提供高度聚合化的专题信息,在提升地图浏览性能的同时却丧失应用过程中的灵活性,难以支持子专题级别的图层控制。本文在林地“一张图”数据生产和应用特点基础上,基于“空间换时间”的原则,设计面向子专题特征级别的瓦片数据存储方案,将大专题拆分为多个子专题,减少瓦片构建阶段的原始数据量的同时提供应用级别面向子专题级别的图层控制能力;通过构建基于客户端、瓦片缓存集群服务、瓦片访问服务、瓦片数据服务等多级数据访问结构减少原始瓦片数据访问的IO的同时也降低网络负载压力;通过地图瓦片多级缓存与反向代理技术实现服务节点的横向扩展,在分散了磁盘IO压力的同时亦大大提高了地图服务的可用性。
林地落界小班调查因子包括管理因子、林地因子、林分因子、基础因子等共40余项因子数据[13-14],在管理和应用过程中重点需要解决“资源分布在哪”的问题,不仅需要解决森林资源分布、公益林、商品林等的分布,同时也需要快速直观地表达诸如针叶林、阔叶林、国家级公益林、重点商品林地、宜林地等子专题特征的分布情况;面对近7千万的林地小班数据难以通过实时查询、实时渲染来进行表达。通过对子专题特征分布分区域进行静态化和瓦片化处理,生成某一区域只包含单一子专题特征的瓦片区块数据,通过分布式索引和缓存聚合服务动态生成子专题分布图层,当用户在浏览专题分布图时,系统根据图层元数据从缓存服务中检索出相关的子专题分布图层瓦片数据进行整合生成专题图层瓦片数据,专题图层瓦片集的逻辑组成结构,见图1。
图1 专题瓦片集逻辑结构Fig.1 Structure of tiles
在综合散列文件、MBTiles[15]、RMaps、关系型数据库、NoSQL数据库[10-11]等多种存储方案和林地数据生产的特点,为便于瓦片地图数据的迁移、质量检查与更新管理,林地“一张图”瓦片数据存储以SQLite数据库[16]为专题地图瓦片生产过程成果数据载体,构建“一文件一库一(多)图层”的管理模式,见图2,使用一个表格存储一个子专题区块瓦片图层,用Blob字段存储瓦片图片数据,在提供迁移便捷性的同时减少了瓦片文件散列化带来的磁盘碎片化对IO性能的影响。
图2 子专题区块瓦片存储逻辑结构Fig.2 Structure of tile block
目前全国林地“一张图”统一采用西安80坐标系(EPSG:4610),结合我国地理纬度位置、应用需求、无缝拼接与二三维一体化应用的特点,同时为避免在投影坐标和地理坐标之间转换产生额外的计算开销,专题成果地图统一采用西安80地理坐标系;定义地图瓦片化缩放最大级别为15,从全球(-180.0,-90.0, 180.0, 90.0)范围来考虑,以(0,0)为瓦片编号起始点,瓦片大小设置为256×256像素,因而第0级像素分辨率为:90.0/256=0.351 562 5 degree per pixel。
第L级下像素分辨率与坐标点(x,y)瓦片序列号计算公式:
第L级别已知行列号(col, row)计算层块左下角点地理坐标计算公式:
全国林地“一张图”包括7个专题、40个子专题图层,共生成1 884个瓦片区块(不包括遥感底图)。为保证瓦片区块中的瓦片数据能被正确读取、归类至正确的专题,元数据至关重要;根据“一文件一库一(多)图层”的管理设计,在瓦片区块数据库中定义元数据表格管理该层块数据库中的子专题地图瓦片图层信息,元数据表格中一条记录对应于层块数据库中一个表格(瓦片图层)。定义元数据表格字段结构如表1。
表1 层块数据库元信息表格结构Table 1 Metadata table structure of tile block file (VTB)
对于元数据管理分为全局元数据和瓦片数据服务节点区块元数据的管理,全局元数据由各服务节点区块元数据和服务节点元数据组成,用于支撑专题图层和专题特征图层的生成。数据服务节点区块元数据则存储该服务器上发布的VTB瓦片区块的元数据。
索引可以提高数据查询和检索速度,现有的大部分瓦片存储系统采用级别、行列坐标多个字段建立复合索引进行检索,当数据量特别大时,如14、15及以上级别所包含的层块数据,该种索引方式查询效率较低,许虎[12]等在Z-ordering曲线基础上将由行、列构成的二维空间降维至一维空间,并映射成一个唯一整数;本文在此基础上进一步扩展将VTB中每一个层块记录的级别、行号、列号信息映射为一个64位整型的唯一编号,并在存储表格中将其定义为主键,从而将存储表格由 TX (INT)、TY (INT)、TL (INT)、TD (BLOB)四个维度降至TI (INT PK)、TD (BLOB)两个维度;在Sqlite3.8以上版本中定义为类型为整型的主键字段将作为表格的Rowid使用,采用B-Tree结构进行存储[16],获取一个层块或一定范围内的多个层块要比其他类型主键或索引速度快,同时也易于后期为提高负载能力将层块数据存储至NoSQL数据库中。
全国林地“一张图”瓦片地图服务由多台服务器组成,每台服务器承载多个的瓦片区块数据;在生成子专题分布图层和专题分布图时聚合服务根据层块编号从全局元数据中检索出服务节点,按专题规则进行合并生成新的瓦片数据,并按专题和年度保存在专题层块数据存储系统中便于再次调用。
图3 瓦片聚合与专题图层生成流程Fig.3 Generating process of tiles and thematic maps
全国林地“一张图”建设采用面向服务架构(SOA),对各模块进行功能分区,每一个功能分区由面向业务应用的服务和服务器硬件组成;该功能分区既可服务于总体业务系统也可作为子系统独立运行。林地“一张图”地图瓦片服务子系统由基础设施层,包括网络环境和服务器,瓦片数据服务层,负载均衡层和应用层组成。
图4 分布式林地“一张图”瓦片地图服务架构Fig.4 Tile map service architecture of national forest “One Map”
随着用户量的增加,网络拥塞与服务器超载是WebGIS应用系统的普遍问题,此类问题加剧了服务提供方的资源消耗并严重影响着用户的使用体验。为WebGIS系统增加缓存机制是解决这一问题的重要方法之一。根据数据访问流程与层次关系,瓦片缓存按数据流节点划分为客户端浏览器缓存、负载均衡层缓存和瓦片服务级缓存。在完成地图瓦片服务化后,通过URI为每一个层块定义了一个唯一标识;以该URI为Key在客户端浏览器和负载均衡层进行数据缓存,而地图瓦片服务端则仍采用层块编号(TI)为Key进行瓦片数据查找。
缓存的构建只是从数据流的角度进行了优化,然而面对多用户超高并发的地图浏览则需要构建面向多服务器的负载均衡,将访问并发按一定的规则分配至多个服务器上。实现负载均衡的方式有很多种:DNS、反向代理、LVS负载均衡器、F5等;基于林地“一张图”的架构和内网应用特点本方案采用基于Nginx的反向代理机制来实现负载均衡。
根据服务器的性能,通过设置权重,分配服务器的使用机率,当某台服务器返回超时或者超负载而不响应时,基于max_fails机制,代理服务器不再将地图浏览请求分配到该地图瓦片服务器;这样比基于DNS的服务器随机分配负载方式,可靠性和利用率大大提高。
图5 地图瓦片缓存体系与更新流程Fig.5 Tile map cache system and updating process
图6 基于Nginx反向代理负载的地图服务网络结构Fig.6 Network structure of tile map service based on Nginx reverse proxy
服务系统基于B/S架构,服务端采用Java语言开发,前端采用ExtJS3.0、Flex4.0开发,ExtJS框架负责前端页面布局和用户输入界面、Flex实现多层、多专题地图的浏览。
3.2.1 实验环境的软件与数据配置
实验环境分为客户端和服务器端,客户端配置为CPU: Intel Core2 P8800,内存:6.0 GB,硬盘:Samsung SSD 840 PRO Series,Windows 7旗舰版。服务器端CPU:Intel Xeon E5-2609,内存:24.0 GB,硬盘,软件采用RH AS 6、Java 1.6、Tomcat 6.45的64位版本;数据采用西安80坐标系(EPSG:4610),范围为BBOX(73.6600, 18.0400,134.8500, 53.5900),从第0到第14级近一亿个层块约2.6 TB的全国林地分布图。
图7 瓦片地图服务主界面Fig.7 Main interface of tile map service
图8 层块元数据管理Fig.8 VTB metadata manager
3.2.2 测试结果分析
通过对服务进行测试,比较单一服务器和分布式服务器集群以及Nginx支持下的负载均衡的地图浏览的性能。针对Tomcat结合本地LevelDB、单一Tomcat结合Mongo集群和本文方案,使用Apache Jmeter2.11测试10个并发、100个并发、1 000个并发、1 500个并发分别测试100次,取响应时间的平均值,结果如下。
图9 3种方案测试结果Fig.9 Three scenarios test results
测试结果表明本文提供的基于Nginx负载均衡的分布式瓦片地图服务在多级缓存体系的支撑下面对多个并发访问时具有较高的性能,满足林地“一张图”政务服务平台建设管理和应用的需要。
本研究围绕林地“一张图”专题地图管理和政务服务的需求,从地图层块数据存储、分布式网络服务、多级缓存结构和负载均衡四个方面进行了设计,开发了一套面向服务的分布式专题地图管理与应用系统,在国家级林地“一张图”政务服务平台中得到应用与验证,结果表明系统设计合理,运行高效,满足当前林地政务管理工作中对地图服务的实际需要。但由于静态化的地图瓦片数据量大、生产周期长,难以满足部分对地图数据时效性要求较高的应用需求,因此今后需要在本服务系统的基础上结合高性能动态地图渲染技术构建“动静相宜”的“一张图”专题地图服务模式,在缩短专题地图服务数据生产周期的同时,提高地图服务数据的时效性,为今后构建在线式的数据更新与公众服务提供基础平台。
[1]许等平,罗 鹏,党永峰,等.基于 SOA 的国家级森林资源信息服务平台建设研究[J].林业资源管理,2013(3):94-100.
[2]聂 雄,石军南,罗 鹏,等.县级林地年度协同变更的研究[J].中南林业科技大学学报, 2015,35(8):53-58.
[3]周 涛.WebGIS 技术的发展趋势[J].科技情报开发与经济,2003,13(1):74-76.
[4]徐立钧.基于WEB2.0的网络地理信息系统 (WebGIS) 的研究与应用[D].贵阳:贵州大学, 2008.
[5]陈 谦,佘江峰,潘 森,等.基于RIA方式的WebGIS构建[J].遥感信息,2009(4):89-94.
[6]周 牧,谈晓军,左 翔,等.基于AJAX和XML的WebGIS系统研究[J].计算机工程, 2009,35(13):271-273.
[7]阳德志,林 辉,臧 卓.基于Android平台和GDAL的遥感影像加载方法[J].中南林业科技大学学报, 2014,34(11):124-129.
[8]陈 超,王 亮,闫浩文,等.一种基于NoSQL的地图瓦片数据存储技术[J].测绘科学,2013 38(1): 3.
[9]罗智勇,黎小东.基于数据库存储方案的高性能瓦片地图服务研究[J].地理与地理信息科学,2013,29(3):48-51.
[10]万 波 ,党 琦,杨 林.基于HDFS管理MapGISK9瓦片地图集的研究与实现[J].计算机应用与软件, 2013, 30(12):232-235.
[11]陈崇成,林剑峰,吴小竹,等.基于NoSQL 的海量空间数据云存储与服务方法 [J].地球信息科学学报, 2013,15(2):166-174.
[12]许 虎,聂云峰,舒 坚.基于中间件的瓦片地图服务设计与实现[J].地球信息科学学报, 2010,12(4): 562-567.
[13]国家林业局.林地保护利用规划林地落界技术规程[R].2011.
[14]许等平,李 晖,庞丽杰,等.全国林地“一张图”数据库建设及扩展应用[J].林业资源管理, 2015(5):36-43.
[15]MACWRIGHT T, WHITE W, KAEFER K,et al.MBTiles Specification [J/OL].2012 https://github.com/mapbox/mbtilesspec.
[16]SQLITE.ORG.SQL As Understood By SQLite [J/OL].2014(http://www.sqlite.org/lang_createtable.html).