文章快速检索     高级检索
  浙江大学学报(理学版)  2017, Vol. 44 Issue (5): 584-590  DOI:10.3785/j.issn.1008-9497.2017.05.014
0

引用本文 [复制中英文]

王叶晨梓, 杜震洪, 张丰, 刘仁义. 面向分片地图的多分辨率格点数据统一存取方法[J]. 浙江大学学报(理学版), 2017, 44(5): 584-590. DOI: 10.3785/j.issn.1008-9497.2017.05.014.
[复制中文]
WANG Yechenzi, DU Zhenhong, ZHANG Feng, LIU Renyi. A unified accessing method of multi-resolution grid point data for tiled map services[J]. Journal of Zhejiang University(Science Edition), 2017, 44(5): 584-590. DOI: 10.3785/j.issn.1008-9497.2017.05.014.
[复制英文]

基金项目

国家自然科学基金资助项目(41471313);国家科技基础性工作专项(2012FY112300);海洋公益性行业科研专项经费资助(201505003,201305012);浙江省科技攻关项目(2015C33021);中央高校基本科研业务费专项(2016XZZX004-02,2016QNA3015)

作者简介

王叶晨梓(1991-), ORCID:http://orcid.org/0000-0003-4310-2691, 男, 硕士研究生, 主要从事时空数据管理及可视化等相关技术研究

通信作者

杜震洪, ORCID:http://orcid.org/0000-0001-9449-0415, E-mail:duzhenhong@zju.edu.cn

文章历史

收稿日期:2016-06-17
面向分片地图的多分辨率格点数据统一存取方法
王叶晨梓1,2 , 杜震洪1,2 , 张丰1,2 , 刘仁义1,2     
1. 浙江大学 浙江省资源与环境信息系统重点实验室, 浙江 杭州 310028;
2. 浙江大学 地理信息科学研究所, 浙江 杭州 310027
摘要: 不同的海洋环境要素对象、数据文件格式及数据分辨率使得对异构且离散的场数据访问和应用受到了限制.设计了面向分片地图的统一数据多级存储组织架构,定义了适用于不同分片地图对象的海洋场数据组织方式,提出了多分辨率格点场数据分层和分块方法,并通过建立索引编码,实现将多要素、多时次、多深度、多高度的海洋环境场数据按统一维度的小区块存储并管理于多级组织架构中.该方法在海洋环境预报综合信息服务平台的应用中有效支持了异构场数据的整合、时空统计分析及可视化表达等.
关键词: 海洋环境    场数据    分片地图    统一架构    分层    分块    
A unified accessing method of multi-resolution grid point data for tiled map services
WANG Yechenzi1,2 , DU Zhenhong1,2 , ZHANG Feng1,2 , LIU Renyi1,2     
1. Zhejiang Provincial Key Lab of GIS, Zhejiang University, Hangzhou 310028, China;
2. Department of Geographic Information Science, Zhejiang University, Hangzhou 310027, China
Abstract: The wide variety of marine environmental objects and multi-resolution scientific data bring challenges to the current approaches of data storage and processing. This paper proposes a unified architecture of marine environmental field data storage and organization for tiled map. The diversified multi-resolution field data can be organized into multiple blocks with the unified dimensions after stratification and partitioning. These blocks can be stored and managed in the architecture by index encoding. Its application to the service platform for marine environmental forecasting information shows that the proposed method supports efficiently the heterogeneous data integration, temporal-spatial statistical analysis and visualization.
Key words: marine environment    field data    tiled map    unified architecture    stratification    partitioning    
0 引言

快速发展的立体海洋环境监测技术催生了空间覆盖范围广、时空分辨率高、更新频率快的超海量观测数据,涵盖了海洋表面及其表层以上大气环境和以下水体环境.同时,基于获取的多时空分辨率、点线面结合的实时观测数据,可运用多种有效的预报方法进行不同模式下的数值模拟及反演,得到准实时的多要素、多时次、多深度、多高度的海洋环境预报数据.

海量异构多维时空场数据的复杂性与多样性,对海洋数据本身的综合应用提出了更高的要求和挑战.为确保信息的完整性以及数据存储和传输效率,原始的海洋环境时空场数据基本以规则或非规则格点数值形式进行组织.因此,如何对不同的描述对象、科学数据文件格式及数据分辨率的异构离散数据进行有效整合,并构建统一的数据模型以实现异构数据的统一存取是关键所在.中国科学院海洋环境研究所研发的“SDG”新型格网数据格式,在结构层面上整合了数十家研究机构的异构数据资源,构建了跨数据库的海洋监测数据统一访问平台[1].张志远等[2]提出了以网络通用数据格式(简称NetCDF)为核心的数据访问和存储策略,将其他格式数据转换成NetCDF标准格式后在不同模式间进行通信,并利用数据切分算法实现并行读写,最终生成结果文件用于存储.NetCDF Operators[3]可实现对NetCDF格式文件内容的常用查询,为支持时空监测数据的组织和在线综合分析服务,SWAMP项目[4]则在多计算节点内实现NetCDF Operators的并行查询.ZHAO等[5]将NetCDF等文件格式转换成通用描述语言(CDL)格式,并将大规模CDL文件存放在Hadoop分布式文件系统(HDFS)中.但从某种意义上说,转换后的数据块在频繁访问原始数据时其相互间关联性维持、解析应用效率及可扩展性并不优于直接使用NetCDF接口函数库[6].

本文着眼于异构数据的一体化高效存储和组织,提出了一种面向分片地图服务的多分辨率格点数据统一存取方法,实现多分辨率格点场数据的统一分层、分块、编码管理,以打通跨数据文件和多数据块的综合应用,有效支持分片地图的相关数据服务和计算服务.

1 面向分片地图的统一数据多级存储组织架构

NetCDF、HDF(hierarchical data file)等是多时空分辨率格点场数据的主要文件存储格式,均基于多维数组模型,虽可通过标识在文件内部的索引号对不同数据块进行快速定位[7],但难以实现数据的有效压缩、可扩展存储及高效传输[8].另一方面,部分数据分析及综合应用须提取或合并若干个场数据文件中的相关逻辑单元.当前大多采用跨原始场数据文件访问多个数据块的方式实现按需实时调取数据,该过程须重复调用异构文件数据访问接口,且无法真正克服数据分散、应用割离、管理成本高等瓶颈问题.

当前海洋环境场数据的常用可视化表达形式大多采用单幅图片格式的专题图,因此缺少完整的地理空间信息,空间分析能力及应用受到限制.运用GIS技术可直观描述多尺度多维度对象的空间分布特征和时间变化趋势.分片地图技术在WebGIS及桌面端GIS中的应用已十分广泛,充分提高了地图绘制和传输效率[9].为进一步丰富地图服务内容,设计面向分片地图服务的数据多级存储架构,可统一将多源异构的海量场数据有机组织成与分片地图相适应的管理模式,并建立各场数据块间的索引,高效支持海洋环境多要素间的时空关联查询分析和应用服务.

面向分片地图服务的统一数据多级存储组织架构采用与地图切片相似的组织方式,按照与目标分片地图相一致的空间分辨率进行分级,各级别由若干行和列的小区块容器构成相同的完整区域.各层级容器包含的各小区块容器具有既定的相同数据分辨率,且小区块容器间符合一定的命名规则和组织顺序,各级共同组成多分辨率层次的类分片金字塔模型容器,用于映射和存放一定空间范围内不同海洋环境要素和不同分辨率的数据,从容器的底层到顶层,分辨率逐渐降低,而所覆盖的空间范围不变.

谷歌地图、百度地图、天地图等均采用分片地图技术进行发布,虽然采用的缩放级别(包含各级分辨率)及索引方法各异,但是以上分片数据的地理空间覆盖面广,各类分片均遵循TMS标准、WMTS标准或者经简单变化后进行组织.因此它们作为地理底图被广泛应用于桌面端GIS和WebGIS.类分片金字塔模型容器具备无缝、多尺度层级结构特征,具有与目标地理底图相同的数据切分方法、坐标原点、坐标系统、层级关系及各层切片分辨率等组织形式,搭建架构须定义以下内容.

(1) 完整模型容器的坐标原点及全覆盖的投影坐标范围[x1, y1, x2, y2],其中,x1x2分别为经向最小、最大投影坐标值,y1y2分别为纬向最小、最大投影坐标值.以Google切片地图作为目标地理底图为例,将容器在Web Mercator投影下经纬度均为0°的方位点定义为坐标原点(0, 0);完整容器具有完整经纬度地理空间,范围为[-85.05, -180.00, 85.05, 180.00],对应Web Mercator投影下的坐标范围为[-20 037 508.34, -20 037 508.34, 20 037 508.34, 20 037 508.34].

(2) 各层级的所有小区块容器默认具有统一的像素分辨率px*py,单个像素代表的实际空间范围为d*d,且满足下列条件:

$ \mathit{d}{\rm{ = }}\frac{{{\mathit{x}_{\rm{2}}}{\rm{ - }}{\mathit{x}_{\rm{1}}}}}{{{\mathit{p}_\mathit{x}}}}{\rm{ = }}\frac{{{\mathit{y}_{\rm{2}}}{\rm{ - }}{\mathit{y}_{\rm{1}}}}}{{{\mathit{p}_\mathit{y}}}}. $ (1)

以Google切片地图作为目标地理底图为例,默认容器中各小区块容器均为正方形,其像素分辨率均为256pixel*256pixel;单像素代表的实际距离为156 543.033 9 m.

(3) 完整模型容器的层级数、层级编号及层级间关系.一般对仅包含完整区域范围的单个小区块容器所在层级进行初始编号,随着空间分辨率的增大,层级号依次增加.确定层级间关系即是对各层级容器的空间分辨率进行定义.以Google切片地图作为目标地理底图为例,模型容器分为20个层级,且在相同区域范围内第L级正方形小区块容器经向与纬向的空间分辨率分别是第(L-1) 级的2倍.

(4) 小区块容器间索引机制按照行列顺序对各层级小区块容器进行递增编码.以Google切片地图作为目标地理底图为例,各层分别以左上角的第1个小正方形作为起始区块,起始块编码为(0, 0),则经向第m列、纬向第n行的小区块可编码为(m-1, n-1).图 1所示为类金字塔模型的数据多级存储组织架构示意图.

图 1 数据多级存储组织架构 Fig. 1 The multi-level architecture of data storing and organizing
2 多分辨率格点数据分层分块方法

结合分片地图的具体应用,建立统一的数据多级存储组织架构后,地理空间范围和数据分辨率各异的多时次、多高度、多深度、多环境要素格点场数据可有机整合至该统一架构中.图 2为对任意分辨率格点数据进行分层分块处理的流程图.

图 2 格点数据分层分块处理方法 Fig. 2 The method of stratification and partitioning for grid point data

对任意空间分辨率的格点数据,首先,获取数据所覆盖的地理空间范围,然后,在不缺失原始格点数据精度的基础上,计算最小分辨率层级作为格点数据块在统一数据存储组织架构中的存放层级,确定该层级下存放数据块内容的小区块容器编号范围,最后,在相同空间范围内将插值和缺省值填充后的数据矩阵按照统一分辨率的小区块容器边界划分进行组织和存储.该多分辨率格点数据分层分块方法实现了不同分辨率格点数据的统一分层、分块、编码管理,以支持多源数据的快速检索、复杂分析及并行处理.

3 最小分辨率层级下的覆盖范围计算

获取任意空间分辨率的格点数据经纬度范围,将经纬度坐标转换为目标分片地图所使用的投影坐标,并计算格点数据所覆盖空间区域在最小分辨率层级容器上包含的像素范围.

假设获取任意一个空间分辨率为nm列的规则格点数据,该数据的经度范围为[Lonmin, Lonmax],纬度范围为[Latmin, Latmax].以Google切片地图作为目标地理底图为例,将元数据中描述的WGS84地理坐标转换为Web Mercator投影坐标,坐标范围分别为[wLonmin, wLonmax]及[wLatmin, wLatmax].利用公式(1)~(3) 计算格点数据所覆盖空间区域在最小分辨率层级容器上包含的像素范围.

$ \mathit{p}{\rm{ = }}\frac{{\mathit{w}{\rm{Lo}}{{\rm{n}}_{{\rm{max}}}}{\rm{ - }}\mathit{w}{\rm{Lo}}{{\rm{n}}_{{\rm{min}}}}}}{\mathit{d}}, $ (2)
$ \mathit{q}{\rm{ = }}\frac{{\mathit{w}{\rm{La}}{{\rm{t}}_{{\rm{max}}}}{\rm{ - }}\mathit{w}{\rm{La}}{{\rm{t}}_{{\rm{min}}}}}}{\mathit{d}}, $ (3)

p代表该格点数据在最小分辨率层级容器经向的像素列数,q代表数据在最小分辨率层级容器纬向的像素行数,对pq暂不进行取整操作.

4 基于精度维持的数据块存放层级及分块集合核定

根据统一存储组织架构的层级关系,从最小分辨率层级起依次计算在不同层级容器上覆盖的像素范围,直至经向及纬向的像素分辨率均不小于原始格点数据的分辨率.满足以上条件时将所对应的层级作为格点数据块存放层级,同时应确保不缺失原始数据精度.以Google切片地图作为目标地理底图为例,相同区域范围内第L级正方形小区块容器经向与纬向的空间分辨率分别是第(L-1) 级的2倍.通过计算格点数据所覆盖空间区域在最小分辨率层级容器上包含的像素范围得到pq,并取最小整数level的值作为数据块存放层级号,当且仅当同时满足式(4) 和(5):

$ \mathit{p}{\rm{*Pow(2, level)}} \not < \mathit{m}, $ (4)
$ \mathit{q}{\rm{*Pow(2, level)}} \not < \mathit{n}{\rm{.}} $ (5)

根据格点数据地理空间范围及数据块存放层级,确定在level层级下涵盖原始数据范围的所有小区块容器编码集合.利用式(6)~(9) 计算该层级下小区块容器编码最值,以快速定位边界小区块的相对位置.

$ {\mathit{y}_{{\rm{min}}}}{\rm{ = Floor}}\left( {\frac{{{\mathit{y}_{\rm{2}}}{\rm{ - }}\mathit{w}{\rm{La}}{{\rm{t}}_{{\rm{max}}}}}}{{{\rm{(}}{\mathit{y}_{\rm{2}}}{\rm{ - }}{\mathit{y}_{\rm{1}}}{\rm{)*Pow(2, level)}}}}} \right), $ (6)
$ {\mathit{y}_{{\rm{max}}}}{\rm{ = Floor}}\left( {\frac{{{\mathit{y}_{\rm{2}}}{\rm{ - }}\mathit{w}{\rm{La}}{{\rm{t}}_{{\rm{min}}}}}}{{{\rm{(}}{\mathit{y}_{\rm{2}}}{\rm{ - }}{\mathit{y}_{\rm{1}}}{\rm{)*Pow(2, level)}}}}} \right), $ (7)
$ {\mathit{x}_{{\rm{min}}}}{\rm{ = Floor}}\left( {\frac{{\mathit{w}{\rm{Lo}}{{\rm{n}}_{{\rm{min}}}}{\rm{ - }}{\mathit{x}_{\rm{1}}}}}{{{\rm{(}}{\mathit{x}_{\rm{2}}}{\rm{ - }}{\mathit{x}_{\rm{1}}}{\rm{)*Pow(2, level)}}}}} \right), $ (8)
$ {\mathit{x}_{{\rm{max}}}}{\rm{ = Floor}}\left( {\frac{{\mathit{w}{\rm{Lo}}{{\rm{n}}_{{\rm{max}}}}{\rm{ - }}{\mathit{x}_{\rm{1}}}}}{{{\rm{(}}{\mathit{x}_{\rm{2}}}{\rm{ - }}{\mathit{x}_{\rm{1}}}{\rm{)*Pow(2, level)}}}}} \right), $ (9)

其中,ymin为所有小区块容器中最小行编号,ymax为小区块容器中最大行编号,xmin为小区块容器中最小列编号,xmax为小区块容器中最大列编号;Floor(x)为向下取整函数.则涵盖原始数据空间范围的所有小区块容器编号分别为(xmin, ymin),(xmin+1, ymin),…,(xmax, ymin),(xmin, ymin+1),…,(xmax, ymin+1),…,(xmin, ymax),…,(xmax, ymax),即由(xmax-xmin+1)*(ymax-ymin+1) 个连续且无缝的小区域分块组成规则大数据块[xmin, ymin, xmax, ymax].

5 可存取的统一分辨率数据切片构造

由于各格点数据的原始数据精度存在差异,为实现数据的统一整合及存放,基于相同地理空间范围,将原始格点数据空间插值成与统一数据多级存储组织架构相一致的数据矩阵.

通过运用上述分层分块方法,可得到不小于数据块实际空间覆盖范围的小区块容器集合,且各小区块容器具有统一的数据存储维度和容量.以Google切片地图作为目标地理底图为例,可选用不同的空间插值方式,在相同空间范围内将nm列的原始格点数据插值成(q*2level)行(p*2level)列的数据矩阵.

依照各小区块容器的地理区位及边界,将插值后得到的数据矩阵分割成若干邻接的数据分块,对应存放在各小区块容器中.并且在各小区块容器中剩余的无值区域使用缺省值进行填充,使得包含数据的小区块容器均按照统一分辨率的数据矩阵进行组织和存储.以Google切片地图作为目标地理底图为例,所有数据切片通过插值和缺省值填充后均为256*256的数据矩阵.经切片分割后的相邻切片边界过渡自然,保持了良好的数值稳定性[10].

最终,以提取时间、高度/深度、环境要素、层级、列号、行号等作为编码信息建立数据切片间的索引机制.由于与目标分片地图的组织方式相似,构造的数据切片无须再经预处理即可支持基于多级比例尺地图的多关键字检索、跨数据块的时空分析、并行化高效处理以及多维多尺度可视化表达.图 3为数据切片构造效果示意图.

图 3 数据切片构造过程 Fig. 3 The construction process of data slices
6 应用实例

基于面向分片地图服务的多分辨率格点数据统一存取方法已应用于中国近海海洋环境预报综合信息服务平台.海洋环境数值预报对象各异、参数繁多、预报更新速度快,平台基于Google分片地图,运用HBase分布式数据库建立预报对象元信息表(MEF_OBJ_CLASS)用于存储各类数值预报数据元信息;建立预报数据元信息表(MEF_FILE_LRYSET)用于记录各类预报数据块存储及预报产品制作情况;以不同的目标预报对象为独立单位动态建立预报对象数据表(MEF_OBJ_VAR),分别用于记录各类数据多个预报对象参数的数据切片内容及产品访问路径.此表结构可一体化存储海洋环境预报数据的元数据信息及具体数据块内容,具体表结构和相互间的逻辑关系如图 4所示.

图 4 数据库表结构及逻辑关系 Fig. 4 The structure and logical relationship of tables in database

该平台中分别存储和整合了4类不同经纬度范围及不同数据分辨率的海洋气象数值预报格点数据,涵盖了我国周边海域、印度洋北部海域等地区不同海面高度的风速风向及不同水深的流速流向信息,表 1所示为4类海洋气象预报数据基本信息.分别将4类数据的WGS84地理坐标转换为Web Mercator投影坐标,计算数据各自所包含的空间区域在第0级分片地图上覆盖的像素范围,直至经向及纬向的像素分辨率均大于原始格点数据的分辨率,确定所对应的数据块存放层级,以及涵盖原始数据空间范围的小区块容器集合,最终构造数据切片存储至分布式数据库中.如第1类数据块存放在第3级,其小区块集合内编号分别是(6, 2)、(6, 3)、(6, 4)、(7, 2)、(7, 3)、(7, 4).

表 1 4类海洋气象预报数据相关参数信息 Table 1 The parameters of the four kinds of marine meteorological forecasting data

在统一的数据多级存取架构下,平台客户端可快速检索不同地理范围海域和数据分辨率的数值预报产品,实现了多源数据的综合应用和一体化信息服务.图 56分别为第1类和第3类海洋环境气象预报数据在某预报时次下海面10 m高处的风向标产品及大风区域产品的叠加可视化表达效果.

图 5 第1类风场数据检索及可视化表达 Fig. 5 The retrieve and visualization of the first type of wind field data
图 6 第3类风场数据检索及可视化表达 Fig. 6 The retrieve and visualization of the third type of wind field data

另一方面,数据统一存储架构同样可灵活支持基于地图的交互式、跨数据块时空检索分析.例如,基于起报时间和空间位置信息,按需获取或通过空间插值计算得到目标预报参数在多目标层次下的预报信息,并以统计图表的形式展示该地理位置的相关预报参数在不同层次下随预报时间的变化情况.图 7为中国近海地区某方位点水体在不同深度时的海流流速及流向预报时序图.

图 7 跨多时次、多深度场数据检索及统计分析 Fig. 7 The retrieve and statistical analysis of multi-time and multi-depth field data
7 结语

针对多源异构数据难以整合的问题,提出了一种面向分片地图服务的多分辨率格点数据统一存取方法,通过多分辨率格点数据的分层、分块、编码管理,实现将异构多分辨率场数据融合至统一数据存取模型中,以更灵活的方式支持时空统计分析及复杂应用处理,有效解决了在存储和处理海量异构场数据方面的局限性.该方法所建立的统一场数据存取模型适用于不同分片地图,根据分片地图对象可相应调整和确定模型的组织方式.下一步,笔者将在此基础上着手研究并优化海量场数据块检索策略[11],进一步扩展数据的高性能处理和场数据动态可视化[12]应用.

参考文献
[1] 邵党国. 网格数据库系统的设计及应用研究[D]. 成都: 四川大学, 2006.
SHAO D Y. Grid Database System Design and Applied Research[D].Chengdu:Sichuan University, 2006. http://cdmd.cnki.com.cn/Article/CDMD-10610-2007224902.htm
[2] 张志远, 张翔, 张权, 等. 面向海洋环境数值预报的支撑平台框架设计与实现[J]. 计算机工程与科学, 2014(12): 2251–2256.
ZHANG Z Y, ZHANG X, ZHANG Q, et al. Design and implementation of supporting platform construction oriented to numerical marine environment forecast[J]. Computer Engineering and Science, 2014(12): 2251–2256. DOI:10.3969/j.issn.1007-130X.2014.12.003
[3] SEO S, YOON E J, KIM J, et al.HAMA:An efficient matrix computation with the MapReduce framework[C]//Cloud Computing, Second International Conference-CloudCom 2010. Indiana:IEEE Computer Society, 2010:721-726.
[4] WANG D L, ZENDER C S, JENKS S F.Clustered workflow execution of retargeted data analysis scripts[C]//IEEE International Symposium on CLUSTER Computing and the Grid.Lyon:IEEE, 2008:449-458.
[5] ZHAO H, AI S Y, LYU Z H, et al.Parallel accessing massive NetCDF data based on MapReduce[C]//Web Information Systems and Mining.Berlin/Heidelberg:Springer, 2010:425-431.
[6] GENG Y, HUANG X, ZHU M, et al.SciHive:Array-based query processing with HiveQL[C]//201312th IEEE International Conference on Trust, Security and Privacy in Computing and Communications.Melbourne:IEEE Computer Society, 2013:887-894.
[7] 胡勇, 罗文, 俞肇元, 等. 多维时空场数据的多模式张量表达模型[J]. 武汉大学学报:信息科学版, 2015, 40(7): 977–982.
HU Y, LUO W, YU Z Y, et al. Multi-mode tensor expression model of multidimensional spatio-temporal field data[J]. Geomatics and Information Science of Wuhan University, 2015, 40(7): 977–982.
[8] 徐胜华, 刘纪平, 王想红, 等. 基于三维GIS的海洋标量场数据动态可视化[J]. 测绘通报, 2014(10): 50–53.
XU S H, LIU J P, WANG X H, et al. Three dimensional dynamic visualization for marine scalar field data based on 3D GIS[J]. Bulletin of Surveying and Mapping, 2014(10): 50–53.
[9] 黄梦龙. 瓦片地图技术在桌面端GIS中的应用[J]. 地理空间信息, 2011(4): 149–151.
HUANG M L. Application of tile map technology in desktop GIS[J]. Geospatial Information, 2011(4): 149–151.
[10] 李将云, 杨勋年, 汪国昭. 分割图像插值的一种局部算法[J]. 浙江大学学报:理学版, 2002, 29(1): 55–62.
LI J Y, YANG X N, WANG G Z. Local algorithm for segmented image interpolation[J]. Journal of Zhejiang University:Science Edition, 2002, 29(1): 55–62.
[11] ELDAWY A, MOKBEL M F, ALHARTHI S, et al.SHAHED:A MapReduce-based system for querying and visualizing spatio-temporal satellite data[C]//IEEE International Conference on Data Engineering. Seoul:IEEE, 2015:1585-1596.
[12] DU Z, FANG L, BAI Y, et al. Spatio-temporal visualization of air-sea CO2, flux and carbon budget using volume rendering[J]. Computers & Geosciences, 2015, 77: 77–86.