ArcGIS Runtime SDK开发简单却又恼人的小问题之如何正确在同一mapview中加载多个图层

目的:

esri提供的官方帮助文档没有介绍在一个mapview中添加多个图层时需要注意的事项,这篇文章目的从实战出发,说明我们开发的时候加载多个图层的小技巧,阅读本文可以实现:

  1. 确保正确初始化mapview;
  2. 确保图层之间的加载不互受影响;
  3. 了解影响图层加载的因素(方便快速排查加载失败原因)

储备知识:

了解 mapview, arcgismap, layers之间的关系。

代码:

//初始化切片图层并监听图层加载状态
final ArcGISTiledLayer arcGISTiledLayer = new ArcGISTiledLayer(“https://domain.xxx.com/server/rest/services/SampleWorldCities/MapServer”);

arcGISTiledLayer.addDoneLoadingListener(new Runnable() {
@Override
public void run() {
if (arcGISTiledLayer.getLoadStatus()== LoadStatus.LOADED){
System.out.println(arcGISTiledLayer.getLoadStatus()+“loadasbasemap”);
}else if (arcGISTiledLayer.getLoadStatus()==LoadStatus.FAILED_TO_LOAD){
System.out.println(arcGISTiledLayer.getLoadError().getCause());
}
}
});

 

//将上述图层作为底图传入

mMap.setBasemap(new Basemap(arcGISTiledLayer));

 

//初始化业务图层并监听图层加载状态

ArcGISMapImageLayer arcGISMapImageLayer=new ArcGISMapImageLayer(“https://domain.xxx.com/server/rest/services/river/MapServer”);
arcGISMapImageLayer.addDoneLoadingListener(new Runnable() {
@Override
public void run() {
if (arcGISMapImageLayer.getLoadStatus()== LoadStatus.LOADED){
System.out.println(arcGISMapImageLayer.getLoadStatus()+“riverloadasbasemap”);
}else if (arcGISMapImageLayer.getLoadStatus()==LoadStatus.FAILED_TO_LOAD){
System.out.println(arcGISMapImageLayer2.getLoadError().getCause());
}
}
});

 

总结:

查看测试结果:

测试过程说明:

测试中一共加载三个图层,不变量为:

> 始终确保业务图层2正常加载;

> 始终确保业务图层1无法加载;

变量为:

> 是否加载底图

> 如果加载底图,底图是否能正常加载

测试结果总结:

如果想要正常加载多个图层,需要确保mapview正常加载第一个图层;

建议使用basemap类,并确保底图可成功加载;

底图都选择静态,不经常变化且适合做地理背景的。

图层加载失败可能的原因:

  • 无法访问域名
  • 使用自签名证书且没有信任自签名证书

(解决方法参考:http://zhihu.esrichina.com.cn/article/3862)

  • 服务加密,未对外开放给每个人
  • 服务无法动态投影

(mapview的空间参考由第一个图层决定,如果后期加入切片图层,则无法动态投影)

提供图层的服务出错:需要联系服务器运维人员介入。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注