作者:gsh
目录
一、前言
做了投影转换后的影像数据,在地图中显示正常,但在三维场景中会在影像边界处出现黑色填充,生成的瓦片(.sci或.sci3d)仍有黑边,导致在场景中叠加多幅影像交界处会有明显黑线,目前超图产品已在 SuperMap iClient3D for Cesium 增加接口来处理优化,一起看看如何处理的吧。
二、问题原因
影像数据投影转换后,会出现拉伸变形,超过数据有效边界的地方没有有效的像素数据填充,生成的瓦片加载在地图中表现为全透明,但三维场景中会在边界处出现黑色填充,导致多幅影像交界处有黑线,该问题为三维软件的通性问题,目前超图产品已在 SuperMap iClient3D for Cesium 增加接口来处理优化。

三、去除接边处黑线代码
发布服务后,SuperMap iClient3D for Cesium加载多幅影像交界处效果如下:

对影像进行设置:
imageryLayer.minTextureAlphaFilter = 0.99;
设置后:

四、注意事项
1.如果场景中多幅影像可以遍历影像数据来做批量设置:
var promise = scene.open('http://localhost:8090/iserver/services/3D-WorkSpace/rest/realspace');
Cesium.when(promise, function(layers) {
var imageryLayers = viewer.imageryLayers
for (var i = 1; i < imageryLayers.length; i++) {
var imageryLayer = imageryLayers.get(i);
imageryLayer.minTextureAlphaFilter = 0.99;
}
})
2.如果场景中有矢量缓存(.sci或.sci3d),也是存在场景的 imageryLayers 中,会被同时过滤掉,建议统一命名标识出影像数据,比如本示例影像命名为“影像1”和“影像2”,根据影像name前两个字符为“影像”做判断:
var promise = scene.open('http://localhost:8090/iserver/services/3D-WorkSpace/rest/realspace');
Cesium.when(promise, function(layers) {
var imageryLayers = viewer.imageryLayers
for (var i = 1; i < imageryLayers.length; i++) {
var imageryLayer = imageryLayers.get(i);
var name = imageryLayer._imageryProvider.tablename;
if (name.slice(2) !== '影像') {
console.log("name11111", imageryLayer._imageryProvider.tablename);
console.log("imageryLayers111", imageryLayer);
imageryLayer.minTextureAlphaFilter = 0.99;
}
}
})
303

被折叠的 条评论
为什么被折叠?



