首页 / 浏览问题 / 组件GIS / 问题详情
初始化三维球并加载数据后窗体显示空白
31EXP 2017年04月10日

初始化三维球并加载数据后,看不到三维球,窗体显示空白(偶尔出现)。初始化时同时初始化了二、三维两个地图控件,二、三维是分两个控件放的,默认显示的是三维,通过切换显示二维地图,三维出现空白时,二维地图加载是正常的,程序没有报错。

1个回答

你好,你的scenecontrol是通过拖控件的方式添加上去的还是用的scenecontrol m_scenecontrol=new scenecontrol()这样的方式使用的呢
胡林
1
5,985EXP 2017年04月10日

我是通过scenecontrol m_scenecontrol=new scenecontrol()这样的方式使用的

加载后出现空白情况是这样的,二维正常。

看了代码没看出什么问题,以前你在这台计算机上用过三维场景的功能吗,三维场景功能对计算机的显卡有一定的要求
我用提供的示例代码试过三维没出现问题,不知道是不是加载数据不稳定,SampleData\\OlympicGreenSCV\\OlympicGreen.sxwu。我这个是一框架,可以加载不同的地图控件,之前三维使用skyline,二维用ArcEngine都挺正常的。
你的scenecontrol是添加到哪个容器里面,就是那句Base.controls.add(scenecontrol)这个Base是什么容器
Base是DevExpress.XtraEditors.XtraUserControl。我给你说下我是怎么加载地图控件的:主窗体上通过documentManager控件使用MDI的方式加载子窗体,子窗体再加载不同的XtraUserControl,地图是放在XtraUserControl上的,

 public void MapReload(MapType mapType)
        {
            XtraUserControl ctlFlatMap = (XtraUserControl)this.Controls["CtlFlatMap"];
            XtraUserControl ctlGlobalMap = (XtraUserControl)this.Controls["CtlGlobalMap"];
            if (MapUtil.Instance.CurrentMap == null)
            {
                MapUtil.Instance.CurrentMap = new CurrentMap();
            }
            //初始化三维地图控件
            if (ctlGlobalMap == null)
            {
                if (AppConfigUtil.GLOBEMAPTYPE == "SkylineGlobalMap")
                {
                    ctlGlobalMap = new CtlSkylineGlobalMap();
                    //(ctlGlobalMap as CtlSkylineGlobalMap).AfterAfterLabelMoving += FrmMap_AfterAfterLabelMoving;
                    ctlGlobalMap.Name = "CtlGlobalMap";
                    ctlGlobalMap.Dock = DockStyle.Fill;
                    this.Controls.Add(ctlGlobalMap);
                }
                else if (AppConfigUtil.GLOBEMAPTYPE == "SuperMapGlobalMap")
                {
                    ctlGlobalMap = new CtlSuperMapGlobalMap();
                    //(ctlGlobalMap as CtlSkylineGlobalMap).AfterAfterLabelMoving += FrmMap_AfterAfterLabelMoving;
                    ctlGlobalMap.Name = "CtlGlobalMap";
                    ctlGlobalMap.Dock = DockStyle.Fill;
                    this.Controls.Add(ctlGlobalMap);
                }
            }
            //初始化二维地图控件
            if (ctlFlatMap == null)
            {
                if (AppConfigUtil.FLATMAPTYPE == "ArcGISEngineMap")
                {
                    // 异步加载二维地图
                    //AsyncCallback initFlatMapCallback = new AsyncCallback(InitFlatMapCallback);
                    //flatMapDelegate.BeginInvoke(ctlFlatMap,this.Controls,initFlatMapCallback, null);

                    ctlFlatMap = new CtlDmFlatMap();

                    ctlFlatMap.Name = "CtlFlatMap";
                    ctlFlatMap.Dock = DockStyle.Fill;
                    this.Controls.Add(ctlFlatMap);
                }
                else if (AppConfigUtil.FLATMAPTYPE == "SuperMapFlatMap")
                {
                    ctlFlatMap = new CtlSuperMapFlatMap();
                    ctlFlatMap.Name = "CtlFlatMap";
                    ctlFlatMap.Dock = DockStyle.Fill;
                    this.Controls.Add(ctlFlatMap);
                }
                
            }

            //地图显隐控制
            if (mapType == MapType.FlatMap)
            {               
                ctlFlatMap.Visible = true;
                MapUtil.Instance.CurrentMap.Map = (IMap)ctlFlatMap;
                MapUtil.Instance.CurrentMap.MapType = MapType.FlatMap;
                //this.Text = "二维地图";
                if (ctlGlobalMap != null)
                {
                    ctlGlobalMap.Visible = false;
                }
            }
            else if (mapType == MapType.GlobalMap)
            {                
                ctlGlobalMap.Visible = true;
                MapUtil.Instance.CurrentMap.Map = (IMap)ctlGlobalMap;
                MapUtil.Instance.CurrentMap.MapType = MapType.GlobalMap;
                //this.Text = "三维地图";
                if (ctlFlatMap != null)
                {
                    ctlFlatMap.Visible = false;
                }
            }
        }
你试试加载一个空的三维球看能出来不,先不绑定数据
我试过就加载一三维球,不加载数据,运行三次就出现了一次空白。
也就是说是能够加载出来三维球的是吧,建议在关闭的时候释放一下三维球(scenecontrol.dispose),还有你的场景中的图层有对应的数据集吗,是什么坐标系的,如果是平面无投影的坐标系是不能加在球面场景中的
加载空的三维球还是偶尔出现窗体空白的情况,我是希望能解决这个空白的问题。我加载的是示例数据SampleData\\OlympicGreenSCV\\OlympicGreen.sxwu,照着示例代码加载的场景,我关闭时都释放了的

private void FormMainClosing(bool flag)
        {
            try
            {
                m_sceneControl.Dispose();
                m_workspace.Close();
                m_workspace.Dispose();
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show(ex.Message);
            }
        }
你运行示范程序是没有问题的是吧,空白窗体出现是有规律的还是随机的
这样子吧,先不用你的第三方控件,先用VS自带的panel来加scenecontrol,这样试试看有问题不

现在是把base改为this后比较稳定,不知道这个有什么区别?

this和base指向的是同一个控件吗,你可以看看他们的继承关系,你这系统是用什么工程做的,winform?

还有个就是三维加载数据过程中有时出现这个,

winform + DevExpress 控件,

这个一般是你释放场景的时候有问题,顺序是:关闭场景,关闭工作空间,释放scenecontrol
this相当于自己的指针;base相当于父类的指针。所以你改成this后能加载数据了吗
我也不确定,示例代码中用的是base,改为this后还是有窗体为空白的情况,只是没有先前那么频繁,这个会与第三方控件有关系吗?
我也不知道有没有关系,所以我叫你先用VS自带的panel容器来装scenecontrol来试试会不会有空白的情况
还有个你知道三维怎么实现添加图片标签、文字标签吗
图片和文字logo一般是加在屏幕图层中的(ScreenLayer3D)中的,分别对应GeoPictrue和GeoText对象,当然文字也可以加在跟踪图层,甚至数据集中显示出来
但是屏幕图层和跟踪图层的对象是不会被保存下来的,只有把对象存在数据集中,才能保存下来对象
非常感谢!对了,你QQ能告诉吗,我以后有问题再问你。
社区的组件是我负责的,你有问题直接在社区提问,然后分类组件就好了,如果问题比较紧急,可以打支持中心的电话(400-8900-866),我的分机号是6631,直接转给我也可
二、三维标绘图片使用GeoPicture、GeoPicture3D中根据指定的参数来构造一个 GeoPicture、GeoPicture3D 的新对象中的 string imageFile 分别需要什么格式的?
...