WebGL中通视分析报错

0 投票
function chooseview(){
	clearTop();
	
	if(!viewer.scene.pickPositionSupported){
        alert('不支持深度纹理,通视分析功能无法使用(无法添加观测点目标点)!');
    }
	
	if(pointHandler.active) {
        return;
    }
    scene.viewFlag = true;
    viewer.entities.removeAll();
    if(sightline.couldRemove) {
        sightline.removeAllTargetPoint();
    }
    pointHandler.activate();
    
    //通视分析监听
    pointHandler.drawCompletedEvent.addEventListener(function(point){
        var position = point.position._value;

        //将获取的点的位置转化成经纬度
        var cartographic = Cesium.Cartographic.fromCartesian(position);
        var longitude = Cesium.Math.toDegrees(cartographic.longitude);
        var latitude = Cesium.Math.toDegrees(cartographic.latitude);
        var height = cartographic.height;

        if(scene.viewFlag) {
            //设置视口位置
            sightline.viewPosition = [longitude, latitude, height];
            scene.viewFlag = false;
        }else {
            viewer.entities.remove(point);

            //添加视点
            sightline.addTargetPoint({
                position : [longitude, latitude, height],
                name : "point" + new Date()
            });
            
            sightline.couldRemove = true;
        }
        //构建通视分析
        sightline.build();
    });
}

添加观察位置代码如上,具体操作是:点击一下添加观察点位置,添加没问题,也可以进行正常的通视分析。但是如果添加过一次观察点,再一次点添加观察点,则后台会报错,如图。

场景界面也是如此

3月 29, 2018 分类:  473次浏览 | 用户: alanwhy 牛刀小试 (207 分)

1个回答

0 投票
 
已采纳
chooseview是什么时候调用的呢?另外能否用设一些断点看看是哪句报的错呢?
3月 29, 2018 用户: 张阳名 登峰造极 (5,209 分)
采纳于 4月 4, 2018 用户:alanwhy
chooseview是通过点击通视分析功能中有个添加观察位置的按钮触发的。设置过断点,但是没有任何一句报错,紧接着界面上的三维场景就报错,点击ok之后就直接崩溃点不动了
那么有可能是执行通视分析的时候报的错。

所以给sightline.build();这一句设置断点吧,看看sightline里面的各个参数是否都正常。
参数确实有不一样的地方,我把sightline每次重新选择观察点的时候都初始化了,但是还是不行,跟程序是变量pointHandler的监听在第二次重新选择观察点时跑了两遍,没有先sightline.build();之前就先跑了一次监听,这是怎么回事?意思是要重置下point参数么?
我想了想,应该是你每次执行chooseview()方法,都会添加一次pointHandler.drawCompletedEvent.addEventListener事件,所以第二次执行chooseview()方法后,点击场景后相当于执行了两次pointHandler事件。我觉得你还是照着示例的结构写吧,就是把这个事件放到 function onload(Cesium)里。
依照实例代码里面的方法没问题了,谢谢!
...