首页 / 浏览问题 / 三维GIS / 问题详情
winfrom Layer3DDataset 图层中设置对象Style3D无效
80EXP 2021年01月19日
winfrom  Layer3DDataset 图层中设置对象Style3D无效只能设置图层style3d   如何才能设置 Layer3DDataset 图层中对象的Style3D

1个回答

例:对象1高度为100米  颜色红色    对象2 高度200 颜色黑色
80EXP 2021年01月19日
若您需要对Layer3DDataset中不同对象设置不同几何风格,

可以考虑通过Layer3D的Features属性获得feature3D三维要素几何集,

在该集合中找到需要修改的三维要素对象,

通过该要素对象的Geometry属性获取对应的几何对象,

对该Geometry3D三维几何对象的Style3D属性进行设置后,

更新该feature3D三维几何要素。
recordset.AddNew  这种方式添加 获取不到Features 添加的集合对象设置Style3D  是不支持设置Style3D么
recordset.AddNew添加是支持三维几何对象的,

Layer3DDataset目前是不支持Features的,

但是可以直接通过Layer3D可以获取对应Features和对应的DataSet。
recordset.AddNew添加是支持三维几何对象,但是设置的Style3D 会失效呀     我就想知道 怎样才能设置添加的几何对象的Style3D 添加代码如下:

 private void AddPointNormally(DatasetVector datasetVector, Geometry3D geometry3D, string name)
        {
            try
            {
                recordset = datasetVector.GetRecordset(false, CursorType.Dynamic);
                Dictionary<string, object> dic = new Dictionary<string, object>();
                dic.Add("id", name);
                GeoStyle3D geoStyle3D = new GeoStyle3D();
                geoStyle3D.FillBackColor = Color.Red;
                geometry3D.Style3D = geoStyle3D;
                recordset.AddNew(geometry3D, dic);
                recordset.Update();
            }
            catch (Exception ex)
            {
                LogHelper.Info(ex.Message);
            }
            finally
            {
                // recordset 使用完毕后必须 Dispose
                // The recordset must be disposed after using
                if (recordset != null)
                {
                    recordset.Dispose();
                }
            }
        }
而且现在只能设置dataset   设置 Features  效率太慢 请问有什么好的解决方案么
假如您的风格样式全部统一,那在Layer3DDataset中可以统一设置Layer3DSettingVector。

若各对象风格自定义,只能推荐在Layer3D的Layer3D或DataSet中去单对象一一设置您所需要的风格。

需要注意单对象风格设置完成后,若再设置图层风格是会被覆盖的。
不需要图层风格  就是要各个对象风格自定义   上面的代码是有设置的   但是没有效果  能否 提供一个有效果的 demo呢
具体设置方案的话还是建议您设置Dataset   Features。

对单对象的风格自定义设置demo具体可以查看帮助手册中Geometry3D与GeoStyle3D部分。
Features  是只有kml图层才有的属性   我现在都用的Layer3DDataset 图层 用Layer3DDataset 图层 是不能对各个对象设置风格的么  我现在就想用Layer3DDataset 图层设置各个对象的风格
都是图层  没道理  Layer3Dkml图层可以设置   Layer3DDataset 不能设置呀
请问这个有办法解决么
您好 这个能解决吗
如果您是需要修改的话,您是可以直接通过Layer3DDataset的Dataset属性指向的数据集,通过getRecordset方法获得该数据集的记录集Recordset,通过该记录集的SetGeometry方法进行集合对象的属性修改,在属性修改时注意修改前移动记录位置、开启编辑状态后,修改后注意Updata。

同时根据测试,recordse的Addnew方法添加三维几何对象并没有造成3Dstyle三维风格丢失的现象。

您可以对您的数据集代码进行排查,

1.数据源、数据集是否存在问题

2.修改三维几何对象并设置风格前Recordset记录位置是否移动正确

3.添加/修改三维几何对象前,该集三维几何对象是否有效

4.更新后记录集/数据集中是否存在该三维几何对象,该三维几何对象的三位风格是否存在

5.更新成功后显示图层是否重新加载数据并刷新显示
测试代码如下:

 SceneControl sceneControl = new SceneControl();
        Workspace workspace;
        public void bind()
        {
            workspace = new SuperMap.Data.Workspace(this.components);
            SuperMapHelper superMap = new SuperMapHelper(workspace, sceneControl, this);
            BillboardUtil billboardUtil = new BillboardUtil(workspace, sceneControl.Scene);

            DatasourceConnectionInfo info = new DatasourceConnectionInfo();
            info.Server = ":memory:";
            info.EngineType = EngineType.UDB;
            workspace.Datasources.Create(info);

            Datasets datasets = workspace.Datasources[0].Datasets;
            DatasetVectorInfo vectorInfo = new DatasetVectorInfo();
            vectorInfo.Name = "Region3D";
            DatasetVector datasetVector = null;
            try
            {
                vectorInfo.Type = DatasetType.Region3D;
                datasetVector = datasets.Create(vectorInfo);
                FieldInfos infos = datasetVector.FieldInfos;

            }
            catch (Exception ex)
            {

            }

            Point3Ds point3Ds = new Point3Ds();
            point3Ds.Add(new Point3D(103, 32, 0));
            point3Ds.Add(new Point3D(95, 24, 0));
            point3Ds.Add(new Point3D(96, 33, 0));
            point3Ds.Add(new Point3D(97, 50, 0));
            point3Ds.Add(new Point3D(103, 32, 0));

            GeoStyle3D geoStyle3d = new GeoStyle3D();
            geoStyle3d.ExtendedHeight = 100000;
            geoStyle3d.FillBackColor = Color.Red;
            geoStyle3d.FillForeColor = Color.Red;
            geoStyle3d.AltitudeMode = AltitudeMode.Absolute;

            GeoRegion3D geoRegion3D = new GeoRegion3D(point3Ds);
            geoRegion3D.Style3D = geoStyle3d;

            Recordset recordset = datasetVector.GetRecordset(false, CursorType.Dynamic);
            try
            {
                Dictionary<string, object> dic = new Dictionary<string, object>();
                dic.Add("id", "123");
                recordset.AddNew(geoRegion3D, dic);
                recordset.Update();
            }
            catch (Exception ex)
            {
                //LogHelper.Info(ex.Message);
            }
            finally
            {
                // recordset 使用完毕后必须 Dispose
                // The recordset must be disposed after using
                if (recordset != null)
                {
                    recordset.Dispose();
                }
            }

            PrjCoordSys prjCoordSys = new PrjCoordSys();
            prjCoordSys.FromEPSGCode(4326);
            datasetVector.PrjCoordSys = prjCoordSys;
            this.sceneControl.Scene.Layers.Add(datasetVector, new Layer3DSettingVector(), true, "region");

            sceneControl.Scene.EnsureVisible(this.sceneControl.Scene.Layers["region"].Bounds, 2);
            sceneControl.Scene.Refresh();

        }

显示效果如下:

我添加了  高度和颜色样式 但是没有任何效果 请问是代码哪里有问题  这个已经困扰我2天了
那5个情况您全都排查完了都没问题吗?
代码都在上面了呀  我没找到哪里有问题
您好,经过查看您的代码并进行测试,组件的风格设置是成功的,addnew添加几何对象并没有导致风格配置时效或丢失,您的风格设置也是成功了的。

您的代码问题是在加载图层是并没有调用数据集对象的3d风格属性,将其应用到单个对象的风格上或者图层风格上。

您目前加载图层的方式是添加三维图层数据集,该方式只能设置整个图层的Style3d,您可以在添加图层时实例化新的geoStyle3d,或者调用数据集中某个对象的Style3D属性,对该图层的Style3D属性赋值即可调用。

不过根据您之前的描述,该方式可能不足以满足您的各对象自定义风格的需求。因此您可以考虑以专题图的方式添加图层,通过添加自定义专题图即可针对每一个对象进行不同的设置。

专题图的添加方式可以详见帮助手册Layer3Ds的Add方法。

三维自定义专题图的设置可以详见帮助手册Theme3DCustom 类相关。
能否提供下代码
帮助手册中有添加三维专题图图层和三维自定义专题图的详细说明。

添加三维专题图图层可见Layer3Ds的Add方法下相关。

三维自定义专题图设置可见heme3DCustom 类相关。
代码如下:

 Theme3DCustom th = new Theme3DCustom();
            this.sceneControl.Scene.Layers.Add(datasetVector, th, true, "region");

没有效果呢

您的三维自定义专题图th并没有进行任何风格设置,请您根据自己的自定义需求进行相关属性设置。具体参考帮助手册中Theme3DCustom 的方法属性描述,使用字段表达式进行设置。

帮助手册:http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iObjectsNet/index.html

Theme3DCustom  设置的是整个图层的   我又上万个对象   每个对象的风格可能都不同   需要单独设置对象的风格

在自定义专题图层这里风格设置不需要每个对象单独设置。

比如您需要自定义设置填充符号的前景色,您可以将每个对象的颜色设置存储在属性表中。

如数据集中存在10个对象需要设置不同符号填充前景色,您可以预先在属性表中建立“ForeColor”字段,将该对象的颜色设置存入该对象记录的“ForeColor”字段中。

在三维自定义专题图设置时,将该自定义专题图的FillForeColorExpression属性使用ForeColor的字段表达式进行赋值即可。

在渲染时,若该对象“ForeColor”字段中存在有效颜色值则按该值进行渲染。

三维自定义专题图的不同属性自定义还请您按照您的需求具体查看帮助手册中Theme3DCustom类相关进行设置。

...