“ 持续增长的矢量图层,后台应该采取怎样的方案来为web端、App端实时调用加载提供支撑?”
01 场景概述
从国土资源、规划、水利、建筑、林业、气象、遥感、测绘、环境……等领域总有些成果数据会以矢量数据(比如shapefile)的格式存在,当我们每天都有一些成果数据产生,并且需要将矢量数据同步在业务平台中展示(web、App等),展示空间图形及点击后查看属性信息,并且随着时间的推移,此类数据在持续增长。那么后台应该怎样支持大量的图层去展示与属性查询?
02 几种方案讨论
首先我们从两个维度去看待这个题目,第一是矢量图层的数量,比如说我有成千上万个shapefile数据;第二是单个的矢量图层的数据量,比方说,一个shapefile有100M。
经过咨询此方面有经验的大佬及自己测试,大致形成了几种方案,汇总如下:
方案一:采用通用数据库存储地理数据(比如postgresql+postgis),并通过自己写后台接口的方式去返回前端查询及需要展示的数据,此种方式据测试,能够在前端加载具有百万节点级别矢量数据,后端再用postgis去抽稀,前端有GPU渲染加持的话,还是能够轻松应对大多数场景;
缺点:支撑的数据量有上限,一旦数据量比较大的时候,前端渲染压力极大,后端抽稀过度的话容易造成图形失真!
方案二:采用ArcGIS Portal+ ArcGIS Server联合方案,将矢量数据发布成MapServer或者FeatureServer(非托管的要素服务),用来查询属性数据,同时发布矢量切片服务,用来在前端渲染展示图形,此种方式不需要自定义写接口,前端可以直接调用服务的URL;
优点:能够极大的提高数据量的上限,对于单个数据量超大的矢量文件也能够轻松应对;
缺点:MapServer或者FeatureServer服务都是靠ArcGIS Server的实例来支撑,每个实例占用内存大于120M附近,所以一台ArcGIS Server节点承载的服务量和内存息息相关,换句话说,单节点承载的矢量数据的个数是有限的;
升级应对策略:在10.7版本以上支持了共享实例,也就是说许多的服务可以共用实例,前提是必须通过ArcGIS Pro来发布的MapServer、FeatureServer、KML、WFS、WMS等服务,值得注意的是,若服务访问频次较高,也较为常用的情况下,建议使用专用实例。对此,ESRI官方也有相关的方案推荐,可查看链接:https://support.esri.com/zh-cn/technical-article/000012639
方案三:采用ArcGIS Portal + ArcGIS Server + ArcGIS Datastore联合方案,发布托管的FeatureServer用来查询属性数据,发布矢量切片服务用来支持前端大数据量的加载渲染,据实际测试,托管的要素服务不是靠实例来支撑服务,而是通过直连ArcGIS Datastore中关系数据库的方式,并且官方对此方案做过大量优化,不管是查询还是渲染,都能够基本满足碰到的所有场景。
优点:不管是从服务资源的占用量来讲还是单个矢量数据的数据量上来讲,这种方式基本能够解决以上两种维度上的问题。
注意:上述三种方案,当矢量图层的数量多到一定规模之后,均需增加服务器数量来承载更多数量的服务,这是毋庸置疑的。
以上,通过对比,当有条件使用方案三时,方案三无疑是最优解之一,当没有条件时,方案一可能需要花费自己相当的时间来优化,达到自己的使用需求。