说一说新出的ArcGIS Runtime SDK v100.0

11月21日,ESRI在官博上发布了题为“ArcGIS Runtime SDK 100.0 has arrived!”的博文,这个100.0足够吸引了眼球,其实回头算算,quartz beta已经太久太久了,而这个100.0,本质上就是quartz release。

以下只是一些吐槽,以及从地图结构的变化角度,来看看ESRI的思路。

关于Desktop Development

ESRI的Runtime产品线在不断壮大,其中单个开发语言中的具体选型,也看出了跨平台的思路。Android、iOS、macOS三者不说,都是运行在特定平台之上,而似乎有不能被忽略的。而Java(Windows/Linux/macOS)、.NET(Windows/iOS/Android)、Qt(Windows/Linux/Android/iOS)三者,无一不是看起来牛气冲天。但是冷静思考下来,其核心竞争力还是很难讲,毕竟在跨平台这个层面,Qt受众较小;.NET独大,但app开发者中,没有足够多的Xamarin用户;Java本该是一枝独秀,无奈Oracle强取豪夺之下,发展堪忧,其客户端开发技术更是令人无所适从,在这种情况下,ESRI此次的v100居然选择了JavaFX这个看似时髦(2008年才推出)却又实际上后劲不足的语言实现。按我建议,更倾向于继续使用swing来保留住传统意义的Java开发者。不过值得推崇的是,此次的Java SDK已经扩展到了macOS(除了Local Server之类无法支持)。相比之下,macOS在ArcGIS的用户(尤其是中国用户)中也属于相对小众,但是单看Swift和Objc的双重策略,也该为ESRI点赞。毕竟在“语系”上,macOS的开发技术与iOS/watchOS系出同门。

关于授权方式

这个可能吐槽居多,Runtime SDK的开发授权分了很多挡,Lite、Basic、Standard、Advanced。老实说,这种差异化收费,只会逼迫开发者更多使用后端技术来实现更为复杂的功能需求,毕竟,1、GP啥啥的Service本来就相当地慢;2、这几档开发授权的划分,并不吸引人,相比于其他软件商的SDK,开发者应当是第一个被拉拢的对象,其所需的工具自然也是免费提供的居多。另外,授权需要以LicenseKey或者授权用户的形式写入前端代码,也是坑之又坑。综上来看,在目前的市场环境下,这种方式带来的公众市场开发者流失,应该是会比较惨痛的。

AGSMap与三类图层

ESRI终于将基础图层、操作图层、参考图层这三个概念在逻辑实现上作了区分。
一个basemap对象可以由多个基础图层和参考图层组成。基础底图不用说了,是用作可识别的背景,通常是用来看的,很少直接对其进行操作,例如影像,或者城市道路图等,至于应用中的操作图层,例如对专题数据或图层进行编辑或处理,则是在这些背景基础之上进行操作。参考图层通常是文字注记,例如城市级别的话,常有街道、水系的名称,甚至更细致的小区、兴趣点等地名。

按照ESRI的观点,基础图层、操作图层、参考图层的叠放顺序,是基础图层在最底下,操作图层在中间,参考图层位于最上层。不过,说到图层叠加,参考系还是应当特别注意的,复杂的说法不扯了,关键问题是,不同参考系的图层放到一起,会无法渲染。如果AGSMap没有定义参考系,则以照首先被加入到AGSMap中的图层的参考系为准,怎么判断先后呢?就是按照上述的三类图层的加载顺序。

基础图层,最常使用的是切片地图(以往总是考虑不常更新,但其实现在行业内最流行的矢量切片也许已经成为不成文的标准)。

ESRI官方预定义了一些basemap,例如全球的Streets、Topographic、Imagery with Labels等地图服务,这个ArcGIS Online上官方介绍已经很多,不多说了。只是补充一下,全球站点上中国区域的数据很糙,而国内站点arcgisonline.cn上提供的底图数据相对来说要好一些,只是有的图对坐标加了一些刻意的偏移量(其实觉得没有多少必要)。

ArcGIS服务

ArcGIS Server服务,这个概念没有变化:常规包含tiled和dynamic两种服务类型。
矢量地图数据和栅格影像数据,都可以用来制作发布tiled服务(AGSArcGISTiledLayer),这种服务的数据是服务器端渲染好的栅格分层图片,也可以制作成离线可用的数据包(.tpk或.vtpk文件)。
dynamic服务,使用AGSArcGISMapImageLayer来加载。这种map service可以同事包含多个图层,在需要响应前端请求时,在后端渲染地图。区别于Feature Service,dynamic服务本身不包含要素的任何额外的属性。
此外,arcgis的最近版本里引入了vector tiles的技术(AGSArcGISVectorTiledLayer),这种技术显示更为无缝,也可以用来在本地重新渲染,以及在地图旋转时保持更好的用户体验。ESRI的矢量切片技术,是基于一些知名的开源技术路线发展而来,然而目前看似乎并不完备和成熟。
Feature Service,用来操作单条要素,无更多变化。
tile packages,用来离线夹在本地地图包,常用语移动端。
AGSFeatureLayer,与以往也没有很大变化,可以不用多说了。
AGSArcGISSceneLayer,这个算是较新的API,用于显示3D要素,其数据夹在可以通过scene服务,也可以通过本地scene数据包。渲染3D对象时,支持纹理渲染。同时,也支持渲染3D的mesh数据,例如无人机拍摄的影像数据。

下图来自developers.arcgis.com,这个继承关系已经清晰地说明了问题。(其实我觉得有些乱)

以下是将一个中国地图的切片图(MapServer)作为basemap的代码例子:

跑起来地图部分大致是这个样子:

根据basemap的定义,当然也可以讲将多个Layer组合成一个basemap,当然,这些图层必须拥有相同的参考系:

以下是夹在操作图层的例子:

除了基础图层外,第一个加入到operationalLayers中的图层,位于操作图层列表的第0个位置。因此,也可以在指定索引位置插入一个操作图层:

除去开发语言特定的UI和写法,上述几行代码大致能与以往老的API一样把地图给显示出来。后面的内容探索,就很简单了。毕竟文档也是ESRI优秀的一面:)。