陈宾宾,李雪松,李子扬,苑馨方
(1. 中国科学院空天信息创新研究院中国科学院定量遥感信息技术重点实验室,北京 100094)
我国草地资源丰富,拥有天然草原4 亿hm2,占国土面积的41%,是我国耕地面积的3 倍,森林面积的1.9倍,约占全球草原面积的12%[1]。由于人为和气候干扰因素,尤其是不合理的畜牧业发展方式,我国部分牧区存在草畜失衡、草地水土流失、生物多样性下降等现象,进一步加剧了草原生态系统对气候变化的敏感性,牧区草地生态功能日益衰减,虫鼠害、沙尘暴等自然灾害频繁发生[2-3]。然而,牧区草地过载仍无法解决我国饲草料和畜产品严重依赖国际进口的问题,部分牧区甚至因为草畜失衡导致产能进一步萎缩,严重制约了牧区经济的可持续发展以及和谐社会的稳步构建[4-7]。因此,在牧区草畜平衡动态机制制约下,如何准确分析和预判放牧管理、草畜调配、草地管理、旅游规划与开发等人为干扰,以及干旱、霜冻、低温、沙尘暴等气候和灾害事件对牧区草畜资源分布的干预与制约作用,揭示草畜动态平衡和牧区管理之间的相互作用和反馈模式,是当前牧区草畜资源规划亟待解决的重要难题。构建基于三维数字地球的牧区草畜资源动态演变可视化系统,有助于实现在气候变化、社会活动、经济政策等制约下的牧区草原放牧密度和草地生产力信息的预报预测以及4D 动态展示,为地方草牧业决策提供支持。
牧区草畜资源动态演变可视化系统利用星空地一体化多源草畜资源、自然条件和社会经济等多维信息,实现典型干扰情景约束下的草畜动态平衡模拟的预测推演,并多维度展示资源动态演变,在线分析人为干扰、气候事件与灾害现象对草原生态系统和功能变化的影响,为草原管理和农业产业结构调整提供决策支持。
B/S 架构将系统功能实现的核心部分集成到服务器上,简化了系统的开发、维护和使用。牧区草畜资源动态演变可视化系统采用B/S 架构设计(图1),包括两个主体功能:草畜平衡预测预报,针对示范实验区的草畜平衡干预情景,开展干扰因子对草畜资源影响的预测推演以及情景应对措施的决策辅助,提供在数据分析线服务;草畜资源动态演变可视化,基于地理空间信息平台,对示范实验区的草畜资源和预测推演过程进行4D时空数据展示。
图1 平台软件体系结构图
Node.js 是2009 年5 月发布的基于Chrome V8 引擎的开源Javascript 运行环境,打破了过去Javascript 只能在浏览器中运行的局面。前后端编程环境统一,可大大降低开发成本。Node.js的优点为[8-12]:
1)运用事件驱动模型。Node.js 主要包括应用层、V8引擎层、NodeAPI层和Libuv层。Libuv层维护了一个Event Queue的事件队列,收到请求后,通过应用层和NodeAPI 层将请求作为一个事件放到Event Queue 事件队列中,并设置回调事件函数,再继续接收新的请求。在Libuv 层的Event Loop 事件循环读取Event Queue中的事件,若遇到非阻塞事件,则自行处理,并在处理完后调用回调函数向上一层返回结果;若遇到阻塞事件,则委托给后台线程池来处理,阻塞操作完成后,执行结果与提供的回调函数一起再被放入事件队列中,这样可通过异步编程实现高吞吐量和高性能。
2)运用异步、非阻塞式I/O 模型。每个I/O 操作均通过高度嵌套的回调函数处理,这是Node.js异步交互原则的规定[13-15]。当执行过程中遇到I/O阻塞(查询数据库、访问远程服务等)时,事件循环线程不会停下等待输出结果,而会继续执行队列中的下一个任务。在函数执行时,Node.js在事件队列中放置回调函数,根据函数的完成快慢顺序调用。
3)跨平台支持,非浏览器环境下运行性能好。V8引擎本身使用了一些最新的编译技术,可极大提升Javascript脚本语言编写的代码的运行速度。Node.js不仅对Chrome V8 引擎进行了封装,还针对一些特殊用例进行了优化,提供了替代的API,使V8引擎在非浏览器环境下运行更好,执行Javascript的速度得到了提升、性能更好[16-17]。
4)易于扩展网络应用。Node.js是基于Chrome V8引擎构建的,因此它的模型与浏览器是类似的,运行在单个进程的单个线程上,但其仍可利用CPU的多个核心。Node.js通过child_process.fork()API来生成子进程,以实现多核CPU的利用。另外,建立在同一个接口上的Cluster模块允许在进程之间共享套接字(sockets),以实现核心的负载均衡。
牧区草畜资源动态演变可视化系统的中间件软件体系结构拓扑图见图2。中间件连接草畜平衡预测预报系统、草畜资源动态演变可视化系统和地图服务系统。草畜平衡预测预报系统主要负责示范实验区典型干扰情景设置(参数输入)、草畜平衡预测推演,界面基于Web开发;地图服务系统主要负责草畜平衡预测推演结果的数据发布,采用GeoServer地图服务器进行地图发布;草畜资源动态演变可视化系统主要负责动态展示草畜平衡预测推演全过程,基于Cesium三维开源地图引擎实现。Cesium是一个用于构建三维场景和地图的开源三维渲染引擎,采用B/S 架构且遵循WebGL三维绘图标准,基于Javascript编写[18]。草畜平衡预测与动态展示数据交互中间件采用Node.js,主要负责用户操作监控、输入参数转发、推演结果发布、可视化系统控制和数据推送;此外,还包含一个全局的进程守护程序,负责解决Node.js 可能出现的异常,防止崩溃,包括回调函数发生的异常,保证中间件的可靠运行。
图2 体系结构拓扑图
中间件接口采用一种面向资源的设计,所有操作与URI 绑定,借助http 请求方法获取服务需要的资源,暴露在网络中的是面向资源的服务。中间件包括两个独立进程:①基于GeoServer 的数据存储发布服务,提供中间服务;②基于Cesiume 的三维展示前端,提供交互服务。系统基于Ajax函数库进行二次封装,实现了Client 类,包含GET、POST 等6 种请求方法,可方便地使用其处理RESTful请求。REST风格的Web 服务能将网络上的事物抽象为资源,并通过URI标识。中间件的接口引擎引入该方式,将前端所需数据以及对数据操作的组合看作资源。URL的基本格式包括:①协议,通常为http或https;②服务器主机地址和端口号,主机地址可以是域名、主机名或IP 地址,默认端口号可省略;③资源相对路径,通常用“/”隔开;④请求参数,由问号开始用等号隔开的键值对对应的参数组成,多个参数间用“&”分隔。在符合URI设计标准的前提下,采用“项目编码/分类编码/资源编码”的格式定义资源相对路径,各编码由前端开发人员通过数据接口定制工具自行定制服务接口地址。中间件主要包括情景监听订单输入接口、情景监听输出接口、情景列表获取接口、查询情景数据接口、显示配置文件接口、情景预测输出接口、地图服务图层更新接口等。
进程一主业务接口通过RESTful 接口监听人为情景草畜平衡预测结果,主要包括请求的任务ID、预测开始的时间、预测的年份、牲畜类型以及人为情景草畜平衡时间序列矩阵。成功获取预测结果后动态更新GeoServer 图层,为用户后续请求提供响应。输入参数、类型属性、牛和羊属性、输出参数见表1~4。进程二主业务接口通过RESTful 接口提交订单任务ID,查询进程一状态,若录入成功,则通过Cesium 提供基于时间序列的三维交互响应;若未成功,由可视化插件显示未成功响应结果。输入、输出参数见表5、6。
表1 进程一输入参数
表2 类型属性
表3 牛和羊属性
表4 进程一输出参数
表5 进程二输入参数
表6 进程二输出参数
在Windows 10 平台,通过Chrome 浏览器启动草畜平衡预测预报系统,输入草畜平衡模型计算参数,中间件实时接收输入参数,启动数据中转服务;等待模型计算完成,将计算图像结果通过GeoServer进行服务发布;完成地图服务发布后,进行草畜资源动态演变可视化系统的参数配置,并打开可视化系统实现草原NPP、GPP、生物量等情景关键参数以及草原载畜量变化的时空动态展示。测试效果见图3,用户设置预测起始年为2017年、预测3年的草畜平衡,进程一得到计算结果后,由进程二提供连续3 年的预测结果,并进行动态交互展示。
图3 系统效果图
本文基于Node.js设计了草畜平衡数据中间件,并在开源Cesium JS 平台上进行了验证。结果表明,中间件实现了情景驱动的草畜资源演变过程的动态展示功能,包括情景关键参数展示,草原NPP、GPP、生物量等演变过程时空动态展示,草原载畜量变化过程时空动态展示等。中间件基于Node.js 开发,使得前、后端共用一部分代码和逻辑,有效保证了最高的效率和最低的维护成本,提高了系统的可复用性。同时,由于Node.js 采用事件驱动、非堵塞I/O 模型,保证了中间件的轻量化,有利于系统部署与安装。草畜平衡数据中间件下一步的研究方向为提高中间件的并发处理能力,包括将服务器改进为多核Node服务器、引入Redis 高性能缓存、消息队列机制等,使中间件具有更加优异的并发处理能力。