首页 / 浏览问题 / 组件GIS / 问题详情
C#二次开发Layer3DDataset获得模型数据集
2EXP 2021年04月06日

layer3DDataset.ToDatasetVector(layer3DDataset.Dataset.Datasource, "道路合并model");

此方法无法使用,目标就是想生成个贴完图的模型数据集

使用产品:iobject.net 9D 2019 操作系统:win7 x64
数据类型: 文件型udb
问题详细描述:

1。udb道路数据集合并

2。合并后的数据集贴图生成图层  Layer3DDataset layer3DDataset = sceneObject.Layers.Add(targetDataset, layer3DSettingVector, true); 图层已正常出现在球形场景

3。layer3DDataset.ToDatasetVector(layer3DDataset.Dataset.Datasource, "道路合并model");出错E:\Csupermap-idesktop.net-9.1.2-38169-win64-bin-zip-chs\log

当天运行多次  第一次出现过

使用产品 

1个回答

您好,您的该工作空间、数据源、数据集在桌面端中能否正常打开操作?
9,653EXP 2021年04月06日
都很正常

工作空间是默认的未命名空间
当前唯一的问题就是 layer3DDataset.ToDatasetVector 报错
感觉这个方法是废的

所有的操作只为一个目的 生成一个有贴图的 模型数据集

layer3DDataset是已经贴完图了由矢量数据集变过来的

希望通过c#达到图上 点击 保存为模型数据集 一样的结果

ToDatasetVector是一个很常用的基本方法,这边还没有出现过错误。

刚刚也测试下Layer3DDtaset下的ToDatasetVector也没有问题,根据您这边显示的信息,可以很明显的看到,该方法已经执行,并且在写入信息,但是写入失败,读写保护错误。

建议您检查下您的结果数据源是否是以只读方式打开。
Idesktop桌面端就是用Iobject.net对应方法实现的,方法肯定是一模一样的。

鼠标右键 保存为模型数据集 是好使的

objdss2是datasource

DatasetVector datasetlayer3d = layer3DDataset.Dataset as DatasetVector;

之前还尝试过  获取他的dataset 插入到一个新建的模型数据集  (无果)塞不进去
这里的功能也是用ToDatasetVector写的。
//贴图设置
        public Layer3DDataset TestLayer3DSettingDatasetVector(DatasetVector targetDataset, Scene sceneObject, string img, string crosswise, string lengthways)
        {
            //矢量数据集三维图层扩展设置
            Layer3DSettingVector layer3DSettingVector = new Layer3DSettingVector();
            GeoStyle3D geoStyle3D = new GeoStyle3D();
            geoStyle3D.AltitudeMode = AltitudeMode.RelativeToGround;
            geoStyle3D.FillMode = FillMode3D.LineAndFill;
            geoStyle3D.LineColor = Color.White;
            geoStyle3D.LineWidth = 1;
            layer3DSettingVector.Style = geoStyle3D;
            layer3DSettingVector.TopTextureField = img;
            layer3DSettingVector.TopTilingUField = crosswise;
            layer3DSettingVector.TopTilingVField = lengthways;
            //将矢量数据集显示在三维地图场景中
            Layer3DDataset layer3DDataset = sceneObject.Layers.Add(targetDataset, layer3DSettingVector, true);
            layer3DDataset.UpdateData();
            sceneObject.Refresh();
            return layer3DDataset;
        }

经历各种尝试  就差这一步了

//datasets = objDss2.Datasets
            //创建三维场景
            Scene sceneObject = new Scene();
            sceneObject.Workspace = Wkspace;
            //进行三维地图场景的设置
            sceneObject.Atmosphere.IsVisible = true;
            Camera camera = new Camera(102, 31, 10000, AltitudeMode.RelativeToGround);
            sceneObject.Camera = camera;
            Fog fog = new Fog();
            fog.Mode = FogMode.LINEAR;
            fog.IsEnabled = true;
            sceneObject.Fog = fog;
            sceneObject.IsScaleLegendVisible = true;
            sceneObject.Name = "全线贴图展示";
            //全幅显示三维地图场景
            sceneObject.ViewEntire();
            sceneObject.Refresh();
            //按照字段值贴图并生成图层 道路合并 
            Layer3DDataset layer3DDataset = TestLayer3DSettingDatasetVector(roadDataset, sceneObject, "chartlet", "crosswise", "lengthways");
            //三维地图场景展示
            String descriptionScene = sceneObject.ToXML();
            //获取三维场景的XML形式的描述
            Console.WriteLine("当前三维场景的信息:" + descriptionScene);
            Wkspace.Scenes.Add("全线贴图展示", descriptionScene);
            DatasetVector datasetlayer3d = layer3DDataset.Dataset as DatasetVector;
            Console.WriteLine(datasetlayer3d.Type);
            Console.WriteLine(objDss2.IsOpened);
            Console.WriteLine(objDss2.IsReadOnly);
            Console.WriteLine(datasetlayer3d.IsOpen);
            Console.WriteLine(datasetlayer3d.IsReadOnly);
            //layer3DDataset.ToDatasetVector(objDss2, "道路合并model");
            //有毛病的api方法
            //layer3DDataset.ToDatasetVector(layer3DDataset.Dataset.Datasource, "道路合并model");

一个可能的方向是,我点击保存模型数据集 一般要经过将近半个小时的生成时间

会不会内存上的分配  c#代码不如idesktop做得好 或其他什么的

异常详细信息

那建议您断点先排查您这边到底是 layer3DDataset是否可以读取, layer3DDataset.Datatset是否获得成功,或是DataSource无法写入。

您在开发过程中应排查出您调用、获取、使用的各项参数断点查看属性,是否成功有值。

作为开发基本方法,您控制变量找到您代码出现问题的具体参数或函数才能有效解决。

方法上,您的概念好像有些混淆。c#只是一种语言用来写组件网页桌面端都可以,和应用是两种维度上的概念。

比如IDesktop桌面版用的就是Sumpermap Iobject.net,写出来的桌面应用。

比如Iserver服务器用的就是Sumpermap Iobject Jave,写出来的服务器应用。

您如果需要用Iobject.net asp去写网页应用也是可以实现的。
您这边是参数出错,建议您断点调试您的参数是哪一个出错,出错的参数是在哪一步未获取到/为空值/异常/...,找到您导致bug的点,而不是您的bug点。

这边看到您用的是vs,您可以先行系统性学习了解一下使用vs调试查找错误的方法,您如果找到出现问题的地方,这边肯定可以给您解决。

您刚刚提到的add和ToDatasetVector方法我这边刚刚都写了demo进行测试了,都可以正常使用,添加和导出结果均正常,同桌面端一样。
- IsColorByCategory 'layer3DDataset.IsColorByCategory' threw an exception of type 'System.ObjectDisposedException' bool {System.ObjectDisposedException}

+        CollectionDatasetCount    '((SuperMap.Data.DatasetVector)layer3DDataset.Dataset).CollectionDatasetCount' threw an exception of type 'System.InvalidOperationException'    int {System.InvalidOperationException}
 

+        CollectionDatasetInfos    '((SuperMap.Data.DatasetVector)layer3DDataset.Dataset).CollectionDatasetInfos' threw an exception of type 'System.InvalidOperationException'    System.Collections.Generic.List<SuperMap.Data.CollectionDatasetInfo> {System.InvalidOperationException}
 

这三个错误有影响么

使用layer3DDataset.ToDatasetVector时会有此错误;

Layer3DDataset layer3DDataset = sceneObject.Layers.Add(targetDataset, layer3DSettingVector, true);

此语句会有

+        IsUseEffect    'layer3DSettingVector.IsUseEffect' threw an exception of type 'System.NullReferenceException'    bool {System.NullReferenceException}
+        UpdateSize    'layer3DSettingVector.UpdateSize' threw an exception of type 'System.NullReferenceException'    uint {System.NullReferenceException}
 

最后两个上传图片的时候告诉我上传太多一个小时后再来

主要是实在没有深究   图层右键保存模型数据集也好使  就是c#写代码报错 我也实在没招了

//工作空间及三维场景部分
workspace = SuperMap.Desktop.Application.ActiveApplication.Workspace;

            sceneControl = new SceneControl();
            sceneControl.Scene.Workspace = workspace;
            sceneControl.Dock = DockStyle.Fill;
            this.Controls.Add(sceneControl);
            sceneControl.Refresh();






            //Thread.Sleep(30000);




//贴图及模型生成部分
            DatasetVector datasetVector=workspace.Datasources[0].Datasets["道路合并"] as DatasetVector;
            Scene scene=sceneControl.Scene;

            Layer3DDataset layer3DDataset = TestLayer3DSettingDatasetVector(datasetVector, scene, "chartlet", "crosswise", "lengthways");
            sceneControl.Scene.EnsureVisible(layer3DDataset);
            layer3DDataset.ToDatasetVector(workspace.Datasources[0], "道路合并model");

发现上述代码上下两部分  分成两个按钮顺序点击  不会有错误

放到一个按钮运行就出问题

即使我设置了长达30秒的阻塞  依然无效

如何解决  让我一个按钮就完成功能
阻塞、方法、api什么的没有影响,您的问题很明显了,是操作数据的读写失败。

数据的读写失败调试,可能是占用、锁定、打开不成功、为空、实例化失败、赋值失败等等,参数出错的问题会出现在你实例化这个参数到您过程中使用赋值的每一步,都有可能,而不是在方法这里,方法调用失败是返错误或者方法报错,而不是参数报错。

您应该去学习以下c#开发的基础知识,程序调试、bug调试、调试过程中的参数检查等等的开发基础技术。
...