首页 / 浏览问题 / 组件GIS / 问题详情
三维场景自定义添加图片标签
31EXP 2017年04月21日
怎么实现在三维场景中选择图片后添加到场景中并显示?

2 个回答

您好,一般是添加点,然后设置点图层的风格GeoStyle3D.MarkerFile。
3,389EXP 2017年04月21日

选择图片添加后图片是黑色的,这个怎么解决?

原始图片不是黑色的吧,建议换一个PNG格式的图片试试。

我用的是png的图片,

有点奇怪哈,图片发我瞧瞧,我加我这看看正常不。

你说下你QQ我加你下。

Recordset recordset = cadDataset.GetRecordset(false, CursorType.Dynamic);
                                    recordset.MoveLast();
                                    Bitmap pic = new Bitmap(fileName);
                                    double width = pic.Width;
                                    double height = pic.Height;
                                    Point3D pt3d = new Point3D();
                                    pt3d = m_sceneControl.Scene.PixelToGlobe(e.Location, PixelToGlobeMode.TerrainAndModel);
                                    GeoPoint3D geoPoint3D = new GeoPoint3D(pt3d);
                                    GeoStyle3D style = new GeoStyle3D();
                                    style.AltitudeMode = AltitudeMode.Absolute;
                                    style.MarkerColor = Color.Transparent;
                                    style.MarkerFile = fileName;
                                    style.MarkerScale = 2;
                                    geoPoint3D.Style3D = style;

                                    recordset.AddNew(geoPoint3D);
                                    recordset.Update();
                                    recordset.Dispose();
发邮箱。
没找到你邮箱号啊
zoutao@supermap.com
你找别图片试试,我试别的图片都是黑色的
发给你的图片你试过了没?
今天给您试哈
试的怎么样了?
您好,涛哥最近比较忙,我帮您测试一下,今天之内会给您答复。
好的,麻烦了
先问一下,您用的iObjects的版本是?
SMO_DotNET_801

抱歉哈现在才回复您。根据我这边的测试,图标是可以正常显示的,我这边的版本是8.1.0:

您可以针对以下几点进行调整:

1. 设置图层的风格而不是点数据的风格,即,将

geoPoint3D.Style3D = style;

替换为

layer3DSettingVector.Style = style;

同时,删去将风格变为透明的语句

style.MarkerColor = Color.Transparent;

2. 如果仍然无法正常显示,您不妨升级一下您iObjects的版本至8.1.0

你用的数据集是3D点数据集,还是CAD数据集,我用的是CAD数据集
怎么可能是layer3DSettingVector.Style = style;呢,这样的话添加第2个图标那之前添加的不也变了吗,这样总是只有一种图标。
我用的是点数据集。咱们最新的8c似乎已经不再支持设置CAD图层的风格,所以推荐您用点数据集进行风格设置的操作。当然,这样的话,一个数据集只能有1条数据(1个图标)就是了。

如果您仍然想用CAD数据集,您可以试试删除如下语句:style.MarkerColor = Color.Transparent;
对的,我就是想实现添加不同的图标,问下这个怎么解决?
那我再帮您测试下cad数据集的情况
好的,用这个试GeoStyle3D.MarkerFile,实现添加不同的图标
再次让您久等了不好意思。经测试,8.1.0版本之前确实如您所言,加载的图标风格无法正常显示;但是这个缺陷已经在8.1.1中修复了。请您用8.1.1以上的版本。
就是CAD数据集上添加不同图标只能用8.1.1以上的版本,这个你要确定啊。还有个问题,添加几何对象在三维场景中显示,只能使用CAD数据集吗,还是只是8.0.1版本是这样的。
8.1.0版本之前的,添加不同地标肯定有这需求啊,那你们是怎么解决的。
添加几何对象您也可以直接用三维点线面数据集。您要是执意用8.1.0之前的版本的话,您可以建立点数据集来添加图标。
8.1.0之前的版本你用点数据集试过了没,可以实现不?
我在8.0.1版本使用点数据集添加图片后显示为一白点。
8.1.0用点数据集是可以实现的,不过点数据集只能整体设置图层风格,不能分别设置点的风格(即,必须一个图层一个点)。所以,您设置的style需要赋予图层,而不是赋予点。需要修正的代码可参见我一开始回复您的那段~
GeoCircle3D geoCircle = new GeoCircle3D(new Point3D(x, y, 0), Radius);
            geoCircle.GetGeoModel(100,100);
            recordset.AddNew(geoCircle);

添加圆这样写有什么问题?
看上去是没有问题的。请问您遇到什么状况了吗?
recordset.AddNew(geoCircle);返回为false,添加不成功

1、在使用该方法添加记录之后,需要调用 Recordset.Update 方法来提交修改,保存结果;

2、对于只读打开的数据源,其数据集的记录集的此方法不可用;

3、在新增记录的时候,不能对记录集进行锁定并编辑(Edit),否则调用该方法会失败;

4、当传入的参数为空时,只有记录集所在的数据集为属性数据集时该方法才可用,如果是其他类型的数据集,调用该方法会失败;

5、当传入的参数非空时,只有记录集所在的数据集不是属性数据集时该方法才可用,如果是属性数据集,调用该方法会失败。

您依次检查一下看看?

我想问下geoCircle.GetGeoModel(100,100)参数一般是怎么填的?
如果您的recordset是CAD模型数据集的recordset的话,您应该添加geomodel而不是直接添加geocircle

比如您可以GeoModel geoModel = geoCircle.GetGeoModel(100,100);

recordset.AddNew(geoModel);
额不好意思哈,我又试了下,geoModel是可以添加,不过geoCircle也可以成功添加的(返回true)。要不您把您相关的代码发一下?

我这边添加geoModel的代码:

            GeoCircle3D geocircle = new GeoCircle3D(new Point3D(0, 0, 0), 10000);
            GeoModel geoModel = geocircle.GetGeoModel(100,100);
            if (recordset.AddNew(geoModel))
            {
                MessageBox.Show("helloworld");
            }

添加geoCircle的代码(直接添加的话不用写getGeoModel()):

            if(recordset.AddNew(new GeoCircle3D(new Point3D(0, 0, 0), 10000)))
            {
                MessageBox.Show("helloworld");
            }
我用的是Region3D 数据集,添加geoModel还是返回false.

m_sceneControl.TrackMode = SuperMap.UI.TrackMode3D.Edit;
            Datasource datasource = m_workspace.Datasources[0];
            String bufferName = "缓冲分析";
            //if (m_workspace.Datasources[0].Datasets.Contains(bufferName))
            //{
            //    m_workspace.Datasources[0].Datasets.Delete(bufferName);
            //}
            // 缓冲区结果数据集和对应的场景图层
            DatasetVectorInfo layerInfo = new DatasetVectorInfo(bufferName, DatasetType.Region3D);
            DatasetVector m_bufferDataset = datasource.Datasets.Create(layerInfo);

            #region 创建缓冲数据集
            Layer3DSettingVector layer3DSetting = new Layer3DSettingVector();
            GeoStyle3D style = new GeoStyle3D();
            style.FillForeColor = Color.FromArgb(100, 255, 128, 64);
            style.AltitudeMode = AltitudeMode.RelativeToGround;
            style.FillMode = FillMode3D.Fill;
            layer3DSetting.Style = style;
            Layer3D m_layerBuffer = m_sceneControl.Scene.Layers.Add(m_bufferDataset, layer3DSetting, true);
            m_layerBuffer.Caption = bufferName;
            m_layerBuffer.IsEditable = true;
            Recordset recordset = m_bufferDataset.GetRecordset(false, CursorType.Dynamic);
            recordset.MoveLast();

            GeoCircle3D geoCircle = new GeoCircle3D(new Point3D(x, y, 0), Radius);
            GeoModel geoModel = geoCircle.GetGeoModel(100,100);
            recordset.AddNew(geoModel);
            recordset.Update();
            recordset.Dispose();
            m_layerBuffer.UpdateData();
            m_sceneControl.Scene.Refresh();
            recordset.Dispose();
我刚试过了,换为CAD数据集是可以的,但Region3D 数据集,添加geoModel还是返回false
Region3D的话,Region3D是三维面数据集,但是GeoCircle3D并不属于三维面数据,而是属于CAD数据,所以并不能直接添加至Region3D中(同理,GeoModel也不能添加至三维面数据集)。

您要是想将GeoCircle3D添加至三维面数据集中的话,

首先建议您使用GeoCircle而不是GeoCircle3D(其实后者就是前者加了高程)。

然后,您需要先将GeoCircle转换为GeoRegion。

再提取GeoRegion中所有结点的子对象(Point2Ds)。

然后根据这个Point2Ds(二维点对象集合)创建Point3Ds(三维点数据集合)。

接着根据Point3Ds构造GeoRegion3D。

最后即可这个GeoRegion3D添加至Region3D中。
选择图片后,使用构建GeoPicture3D对象,添加到您所需要添加的地方,屏幕图层,跟踪层,以及KML都可以添加
1,742EXP 2017年04月21日
...