AE三维点击查询(3D Identify)的实现,类似ArcGIS的Identify对话框
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function: 三维点击查询 3D Identify
// Copyright ©  天下无双之dxcgis
// 2008-5-8  于岳麓山下。

主窗体中的代码:

// 在主窗体中定义一个frmIdentify窗体类的对象
        frmIdentify m_frmIdentify = new frmIdentify();

// SceneControl1的MouseDown 事件中添加代码
private void axSceneControl1_OnMouseDown(object sender, ISceneControlEvents_OnMouseDownEvent e)
        {
               //三维查询         
                axSceneControl1.SceneGraph.IsNavigating = false;
               
                IHit3DSet pHit3DSet;
                axSceneControl1.SceneGraph.LocateMultiple(axSceneControl1.SceneGraph.ActiveViewer,
                    e.x, e.y, esriScenePickMode.esriScenePickAll, false, out pHit3DSet);
                                
                pHit3DSet.OnePerLayer();
                if (pHit3DSet.Hits.Count == 0)
                {
                    MessageBox.Show("当前点未能查找到任何要素");
                    return;
                }
                IDisplay3D pDisplay3D = (IDisplay3D)axSceneControl1.Scene.SceneGraph;//用于高亮显示要素
                //显示信息窗体
                m_frmIdentify.listBox1.Items.Clear();
                m_frmIdentify.listView1.Items.Clear();
                m_frmIdentify.pHit3DSet = pHit3DSet;
                m_frmIdentify.pDisplay3D = pDisplay3D;
                m_frmIdentify.InitData();
                m_frmIdentify.Location = System.Windows.Forms.Cursor.Position; //获得当前鼠标的屏幕坐标
                m_frmIdentify.Show();
                m_frmIdentify.Focus();
    }

3D Identify 窗体(frmIdentify)的代码

public partial class frmIdentify : Form
    {
        
        public IHit3DSet pHit3DSet;
        public IDisplay3D pDisplay3D;

public frmIdentify()
        {
            InitializeComponent();
        }              
        private void frmIdentify_Load(object sender, EventArgs e)
        {
        }
        private void btnHide_Click(object sender, EventArgs e)
        {
            this.Hide();
        }
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {                  
            listView1.Items.Clear();//消除 listView1 的内容
      IHit3D pHit3D = (IHit3D)pHit3DSet.Hits.get_Element(listBox1.SelectedIndex);
            IFeature pFeature = (IFeature)pHit3D.Object;
            for (int j = 0; j < pFeature.Fields.FieldCount; j++)
            {
                ListViewItem li = new ListViewItem();
                li.SubItems.Clear();
                li.SubItems[0].Text = pFeature.Fields.get_Field(j).Name;
                li.SubItems.Add(pFeature.get_Value(j).ToString());               
                listView1.Items.Add(li);
            }
            //pDisplay3D.AddFlashFeature(pFeature.Shape);
            pDisplay3D.FlashGeometry(pHit3D.Owner,pHit3D.Object);
        }

//自己添加的方法,用以初始化窗体。
        public void InitData()
        {
            listBox1.Items.Clear();//消除 listBox1 的内容
            listView1.Items.Clear();//消除 listView1 的内容
            if (pHit3DSet == null)
                return;
            for (int i = 0; i < pHit3DSet.Hits.Count; )
            {
                IHit3D pHit3D = (IHit3D)pHit3DSet.Hits.get_Element(i);
                IPoint pPoint = pHit3D.Point;
                //if (pPoint.IsEmpty)
                //    return;
                ILayer pLayer = (ILayer)pHit3D.Owner;
                //判断是否为要素图层
         if (pLayer is IFeatureLayer)
                {
                    IFeature pFeature = (IFeature)pHit3D.Object;
                    listBox1.Items.Add(pLayer.Name);//在列表中添加图层名
                    //for (int j = 0; j < pFeature.Fields.FieldCount; j++)
                    //    strHits += "\n  :" + pFeature.Fields.get_Field(j).Name + pFeature.get_Value(j).ToString();
                    pDisplay3D.AddFlashFeature(pFeature.Shape);
                    i++; //计数i加1
                }
                else
                {
                    //不是要素层就从pHit3DSet中删去,因删除后总数减1,计数i不加1
                    pHit3DSet.Hits.Remove(i);
                }
            }                     
            pDisplay3D.FlashFeatures();
        }
    }

转自ESRI官论坛的dxcGIS

AE三维点击查询(3D Identify)的实现(转)的更多相关文章

  1. bind绑定事件,摁回车键提交查询,点击查询也可以提交查询

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  2. asp.mvc中的vue分页实例,分页组件无法重置reload,解决点击查询按钮后,分页不刷新的问题

    刚刚接触Vue.js,现在需要做一个查询功能,并且进行服务端分页.主要思路是在页面中注册一个分页组件,然后进行调用.代码如下 1.引用vue.js,具体去网上下载 2.在html的body中添加如下代 ...

  3. <asp:Button点击查询后,调用js中函数展现加载圈

    <div> <div id='paneloading' style='display:none;position:fixed;top:0px;left:0px;z-index:999 ...

  4. OpenLayers 3+Geoserver+PostGIS实现点击查询

    WebGIS开发中,点击查询是最经常使用的一种查询方式,在ArcGIS api 中.这样的查询叫IdentifyTask,主要作用是前台提交參数.交ArcServer查询分析返回. 本文从开源框架的角 ...

  5. Android GIS开发系列-- 入门季(4) GraphicsLayer的点击查询要素

    上一讲中我们学会了如何在MapView中添加Graphic要素,那么在百度或高德地图中,当我们点击要素时,会显示出相应的详细信息.在GraphicsLayer中也提供了这样的方法.下面我们来学习在Gr ...

  6. Layui 点击查询分页,页码不刷新解决方法

    Layui 点击查询分页,页码不刷新解决方法 function queryDataGrid() { layui.table.reload(tableName, { where: { //设定异步数据接 ...

  7. ArcGIS API for JavaScript 4.2学习笔记[21] 对3D场景上的3D要素进行点击查询【Query类学习】

    有人问我怎么这个系列没有写自己做的东西呢? 大哥大姐,这是"学习笔记"啊!当然主要以解读和笔记为主咯. 也有人找我要实例代码(不是示例),我表示AJS尚未成熟,现在数据编辑功能才简 ...

  8. mapserver+openlayers实现左键点击查询

    效果图 第一步,配置自己的mapfile,在要查询的图层LAYER对象内加上HEADER,TEMPLATE,FOOTER三个参数,同时,TEMPLATE fooOnlyForWMSGetFeature ...

  9. unity区分点击在3D物体还是2D UI上

    当场景中的3D物体需要响应点击,但同时有UI显示时,存在判断点击是在3D物体上还是UI上的问题,办法如下: 1. 射线检测所有2D 3D物体,有2D物体被检测到时表明当前有UI.但无论Physics2 ...

随机推荐

  1. docker容器的基本操作

    docker容器是独立运行的一个或一组应用,以及它们的运行态环境.下面具体介绍如何管理一个容器,包括容器的创建,启动和停止等. 启动容器 基于镜像新建一个容器并启动 将终止状态的容器重新启动 新建并启 ...

  2. C#里面const和readonly

    一.const关键字限定一个变量不允许被改变. 使用const在一定程度上可以提高程序的安全性和可靠性. 1.用于修改字段或局部变量的声明,表示指定的字段或局部变量的值是常数,不能被修改. 2.常数声 ...

  3. Scrapy框架--cookie的获取/传递/本地保存

    环境:Python3.6 + Scrapy1.4 我要实现的东西:1. 完成模拟登陆         2. 登陆成功后提取出cookie,然后保存到本地cookie.txt文件中         3. ...

  4. 设置pip源头地址

    更新pip源 1 . 可以直接在pip时加入参数 比如: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mysqldb 2 . 修改默 ...

  5. CentOS常用命令、快照、克隆大揭秘

    不多说,直接上干货! cat是查看文件内容, cp –cp是连目录及件文件都拷贝 cp是拷贝文件 a.txt里的内容是,   abc   def   ghi cat a.txt |grep –v gh ...

  6. Javac语法糖之EnumSwitch

    在Switch中可以使用的类型有枚举.字符串类型与整形int类型,下面来具体看这几个类型. 1.switch为枚举类型 枚举类: enum Fruit { APPLE,ORINGE } 调用javac ...

  7. C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽的关联

    Qt信号与槽的三种关联方法:1.设计界面关联,编辑信号/槽,自动关联 2.手动关联(1).头文件中定义槽 -----mywidget.h----- #ifndef MYWIDGET_H #define ...

  8. IndexDB的基本操作

    1.前端存储的一个数据库. 2.介绍一下基本操作. <!DOCTYPE html> <html> <head> <meta charset="UTF ...

  9. 如何自学计算机科学与技术(Teach Yourself Computer Science)

    如果你是一个自学成才的半吊子,或者是从培训班毕业的小菜鸟.那么,你欠自己一份计算机科学的专业知识.感谢上帝,如今你可以接受世界水平的计算机教育,但无需花费数年时间和一笔不小的金钱. 互联网上的学习资源 ...

  10. numpy.linalg.norm(求范数)

    1.linalg=linear(线性)+algebra(代数),norm则表示范数. 2.函数参数 x_norm=np.linalg.norm(x, ord=None, axis=None, keep ...