本文针对ArcGIS for JavaScript中栅格图层叠加时出现的400错误进行解析。直接访问子图层URL会因输出格式不支持而失败,正确做法是加载父级地图服务,利用layerInfos属性获取子图层ID,并在图层加载完成后通过事件监听设置可见性,从而正确显示栅格数据。
问题现象与报错分析
该问题可能与栅格图层(Raster Layer)无直接关联,其他类型图层也可能存在类似情况。由于对ArcGIS了解有限,目前仅在栅格图层中遇到此问题,故先记录并保留疑问。
具体表现为栅格图层叠加时无法显示,并触发报错。
例如存在如下地图服务:

尝试直接叠加其中一个子图层(其类型显示为栅格图层)。

相关代码如下:
var layer = new ArcGISDynamicMapServiceLayer("http://192.168.0.225:6080/arcgis/HN_test/MapServer/1");
map.addLayer(layer);
执行上述代码必然导致报错,返回状态码为“400”,错误信息提示:不支持的输出格式。
Error: Output format not supported. Code: 400
此处涉及的格式即为 image 格式。ArcGIS图层服务支持多种输出格式,详细信息可参考官方文档。
然而,若仅访问图层服务的根地址,图层则能正常显示:
var layer = new ArcGISDynamicMapServiceLayer("http://192.168.0.225:6080/arcgis/HN_test/MapServer");//<----------------- 后面没有“/1”
map.addLayer(layer);

这令人困惑。在叠加FeatureLayer时,直接访问子图层从未出现问题。为何此处不行?无论是使用
ArcGISDynamicMapServiceLayer, ArcGISImageServiceLayer, RasterLayer
还是
ArcGISTiledMapServiceLayer, FeatureLayer
均无法成功。前三种类型直接报400错误,后两种虽无报错,但图层并未显示。
难道栅格图层具有特殊处理机制?
从周六至周二,每日投入时间排查此问题,并咨询两位专家,但因对方忙碌未能解决。其中一位专家曾提及答案线索,但未获理解,导致问题仍未解决。在百度等搜索引擎中,关于栅格图层的代码示例极少(这也侧面说明栅格图层无需特殊对象处理)。
解决方案与代码实现
后来偶然看到一篇关于访问地图服务并控制子图层的文章,想起年初初学ArcGIS时曾参考过类似代码,用于显示或隐藏不同图层。查阅后发现,图层对象包含layerInfos属性,其中列出了所有子图层信息。不仅包含直接子层,还包括子孙后代层级。但layerInfos的加载需要一定过程,通常在图层加载完成的事件触发后访问才有效。
修改代码后,图像终于成功显示。

具体处理步骤如下:
1、构建动态切片图层对象
var layer = new ArcGISDynamicMapServiceLayer(http://192.168.0.225:6080/arcgis/rest/services/HN_test/MapServer);
2、在图层对象加载完毕后,设置子图层的可见属性
if (layer.loaded) {
buildSubLayerList(layer);
}
else {
dojo.connect(layer, "onLoad", buildSubLayerList);
}
function buildSubLayerList(layer) {
var visible = [];
dojo.map(layer.layerInfos,function (info, index) {
if(符合条件) visible.push(info.id);
});
map.addLayer(layer);//万事俱备,至此方才将图层添加到地图
}
总结
以上介绍了ArcGIS for JS中栅格图层叠加(Raster Layer)的相关问题及解决方法,希望有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!