首页 > 其他分享 >ArcEngine|空间查询功能

ArcEngine|空间查询功能

时间:2023-06-09 16:24:08浏览次数:45  
标签:layers 功能 SpatialFilter 查询 using GeometryBag 图层 null ArcEngine

所有的代码已经传到了我的GitHub,需要的请自取,GitHub项目地址:https://github.com/weltme/T_ArcMap

(1)界面设计

image-20230609160135515

(2)思路

​ 就实现细节而言,实例通过ISpatialFilter 接口来定义空间查询条件,其Geometry属性确定用来查询的空间几何体, SpatialRel属性定义查询所使用的所有空间关系,为esriSpatialRelEnum 枚举类型的变量。包括:esriSpatialRelIntersects(空间相交)、esriSpatialRelTouches(空间相接——共享空间边界)、esriSpatiaIReIOverlaps(空间覆盖)、esriSpatialRelCrosses ( 空间跨越)、esriSpatiaIReIWithin(空间被包含)、esriSpatialRelContains (空间包含)等。因为ISpatialFilter 接口继承于IQueryFilter 接口,因此在定义好空间查询条件后,可以使用IQueryFilter 接口的查询方法进行空间查询操作。另外,在合并源图层的几何体时,使用ITopologicalOperator 接口的Union方法来进行几何体合并操作,该接口是点、线、面等几何体对象所共同实现的接口。

最后在【根据空间位置选择】窗体中完成空间查询功能。在DataGrid view中显示出查询结果。

(3)代码实现

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;

namespace TArcMap.GeoProcessing
{
    public partial class SpatialQueryForm : Form
    {
        private List<IFeatureLayer> _layers = new List<IFeatureLayer>();
        public IFeatureLayer TargetLayer { get; set; }
        private IMap _IMap;
        private ICursor ResultCursor { get; set; }

        public ISpatialFilter SpatialFilter
        {
            get;
            set;
        }

        public SpatialQueryForm()
        {
            InitializeComponent();
        }

        public SpatialQueryForm(IMap map)
            : this()
        {
            this._IMap = map;
            IEnumLayer layerInterator = map.Layers;
            layerInterator.Reset();
            ILayer tmpLayer = layerInterator.Next();
            while (tmpLayer != null)
            {
                //checking the layer type is the Feature layer
                if (tmpLayer is IFeatureLayer)
                {
                    IFeatureLayer tmpFeatureLayer = tmpLayer as IFeatureLayer;
                    this._layers.Add(tmpFeatureLayer);
                    tmpLayer = layerInterator.Next();
                }
            }
            this.SpatialFilter = new SpatialFilter();
            //set the layer name
            this.initializeControlItems();
        }

        private void initializeControlItems()
        {
            if (this._layers != null && this._layers.Count > 0)
            {
                for (int i = 0; i < this._layers.Count; i++)
                {
                    //add to the target list
                    this.comboBox_targetLayer.Items.Add(_layers[i].Name);
                    //add to the sources list
                    this.comboBox_SourceLayer.Items.Add(_layers[i].Name);
                }
            }

            this.comboBox_spRelation.DataSource = Enum.GetNames(typeof(esriSpatialRelEnum));
        }


        /// <summary>
        /// 1.根据提供的图层名称,找到对应 FeatureLayer;
        /// 2.将对应的FeatureLayer中所有的Feature填充到GeometryBag中,作为返回值;
        /// </summary>
        /// <param name="layerName">图层名称</param>
        /// <returns>图层中所有的要素组成的GeometryBag</returns>
        private GeometryBag extractSourceGeometry(string layerName)
        {
            IFeatureLayer sourceFeatureLayer = GetLayerByName(layerName);

            //新建立一个GeometryBag将所有的FeatureClass中的Geometry作为查询的source。
            GeometryBag geometryBag = new GeometryBag();
            IGeometryCollection geometryCollection = geometryBag as IGeometryCollection;
            //提取FeatureLayer中的FeatureClass,提取其中的sp并赋值给GeometryBag
            IGeoDataset sourceGeoDataset = (IGeoDataset)sourceFeatureLayer.FeatureClass;
            ISpatialReference spRef = sourceGeoDataset.SpatialReference;
            geometryBag.SpatialReference = spRef;
            //提取FeatureClass中的每个Feature并添加到GeometryBag中。
            IFeatureCursor soruceFeatureCursor = sourceFeatureLayer.Search(null, false);
            IFeature pFeature = null;
            object missingType = Type.Missing;
            while ((pFeature = soruceFeatureCursor.NextFeature()) != null)
            {
                geometryCollection.AddGeometry(pFeature.Shape, ref missingType, ref missingType);
            }
            //设置GeometryBag中的空间索引,优化检索速度。
            ISpatialIndex spatialIndex = (ISpatialIndex)geometryBag;
            spatialIndex.AllowIndexing = true;
            spatialIndex.Invalidate();

            return geometryBag;
        }

        /// <summary>
        /// 根据图层名称在this._layers中找到对应的FeatureLayer
        /// </summary>
        /// <param name="layerName">string:提供图层名称</param>
        /// <returns>IFeatureLayer:返回矢量图层</returns>
        private IFeatureLayer GetLayerByName(string layerName)
        {
            IEnumerable<IFeatureLayer> sourceLayers = from IFeatureLayer layer in _layers
                                                      where layer.Name == layerName
                                                      select layer;
            List<IFeatureLayer> sourceLayerList = sourceLayers.ToList();
            IFeatureLayer sourceFeatureLayer = sourceLayerList[0];
            return sourceFeatureLayer;
        }

        private esriSpatialRelEnum extractSpRelation(string spRelationName = "esriSpatialRelIntersects")
        {
            //Enum.Parse(typeof(esriSpatialRelationEnum), spRelationName);//不稳定;
            esriSpatialRelEnum spRelation;
            if (Enum.TryParse(spRelationName, out spRelation))
            {
                return spRelation;
            }
            else
            {
                return esriSpatialRelEnum.esriSpatialRelIntersects;
            }
        }

        private void button_buildSpFilter_Click(object sender, EventArgs e)
        {
            //1 提取筛选用图层,转换为GeometryBag
            GeometryBag geometryBag = this.extractSourceGeometry(this.comboBox_SourceLayer.SelectedItem.ToString());
            esriSpatialRelEnum spRelation = this.extractSpRelation(this.comboBox_spRelation.SelectedItem.ToString());
            //构造SpFilter
            this.SpatialFilter.Geometry = geometryBag;
            //SpatialFilter.GeometryField = pInputFeatureLayer.FeatureClass.ShapeFieldName;
            this.SpatialFilter.SpatialRel = spRelation;
            //SpatialFilter.SpatialRelDescription = overlap_typestring;
            //SpatialFilter.SubFields = "shape";
            this.TargetLayer = this.GetLayerByName(this.comboBox_targetLayer.SelectedItem.ToString());
            if (this.SpatialFilter != null && this.TargetLayer != null)
            {
                IFeatureCursor featureCursor = this.PerformSpatialQuery(this.TargetLayer.FeatureClass, this.SpatialFilter);
                this.ResultCursor = featureCursor as ICursor;
            }
            if (this.dataGridView1 != null && this.ResultCursor != null)
            {
                this.FillDataGrid(this.dataGridView1);
            }
        }

        public IFeatureCursor PerformSpatialQuery(IFeatureClass featureClass, ISpatialFilter filter)
        {
            IFeatureCursor featureCursor = featureClass.Search(filter, false);
            return featureCursor;
        }

        private void FillDataGrid(DataGridView gridView)
        {
            if (gridView == null || this.TargetLayer == null || this.ResultCursor == null)
            {
                return;
            }
            IFeatureClass curFeatureClass = this.TargetLayer.FeatureClass;

            this.dataGridView1.Columns.Clear();
            IFields fields = ResultCursor.Fields;
            for (int i = 0; i < fields.FieldCount; i++)
            {
                DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
                column.HeaderText = fields.get_Field(i).Name;
                this.dataGridView1.Columns.Add(column);
            }
            IRow row = ResultCursor.NextRow();
            while (row != null)
            {
                object[] values = new object[row.Fields.FieldCount];
                for (int i = 0; i < row.Fields.FieldCount; i++)
                {
                    values[i] = row.Value[i];

                }
                this.dataGridView1.Rows.Add(values);
                row = ResultCursor.NextRow();
            }
        }

    }
}

(4)结果

加载地图

2023_6_9_1603

打开空间查询窗口

2023_6_9_1603_1

在道路图层中查询地震图层与州图层相交的要素

2023_6_9_1603_2

标签:layers,功能,SpatialFilter,查询,using,GeometryBag,图层,null,ArcEngine
From: https://www.cnblogs.com/tangjielin/p/17469502.html

相关文章

  • 西门子PLC智能网关有什么功能?能采集哪些PLC?
    智能制造与自动化技术的发展带来了更高的生产效率、更低的生产成本和更智能的管理模式,为各行各业提供了科学实用的工业物联网方案。西门子PLC是一种应用广泛的可编程逻辑控制器,具有S7-200SMART、S7-300、S7-400、S7-1200、S7-150型号,适用于各种设备的自动化控制,如智能工厂、污水处......
  • Nest.js + TypeOrm:原始SQL查询及其参数绑定
    上一篇Nest.js+TypeOrm:安装、编写实体类参数化原始SQL查询使用DataSource,注意,如果是PostgreSQL,则参数占位符不能使用问号?,只能使用$n,并且在没有表名的情况下需要指定类型:否则,会出现错误:PostgreSQL-ERROR:couldnotdeterminedatatypeofparameter$1,参见:https://b......
  • Layui自带的导出功能在导出身份证时后3位为000
    在使用Layui自带的导出功能进行数据导出操作时,会发现身份证号码会出现000的情况。 最开始在网上找资料,有人说要下载Excel的插件包也有说要修改js文件。搞半天还是不行。其实一行代码就ok,废话不多说自己上代码:  只需要在获取数据时加上以下代码即可 {field:'identity'......
  • qt按钮切换互斥功能
    有这样一种功能:一组按钮,点击其中一个,该按钮被选中,其他按钮取消选中。  我这里简单说一下方法。创建一个继承自QFrame的窗口类,在上面放几个按钮,按钮属性设置如下:然后设置按钮的qss,下面是其中一个的按钮(其他按钮类似):data文件夹和exe所在的文件夹在同一目录,下面有几个图片......
  • MySQL中查询第2-5条记录的语句为
    查询第m行到第n行记录,注意表中的记录下标是从0开始的,就像数组一样select*fromstudentlimitm,n;返回m+1到m+n行记录,m代表开始的下标,n代表查找的结果数,将返回n行结果select*fromstudentlimit2,8;返回3到10行记录 ......
  • 直播商城源码,点击复制功能和长按复制功能
    直播商城源码,点击复制功能和长按复制功能一、点击复制+长按复制效果 index.wxml 注意:data-title=我是被复制的文本内容<textselectable="true">我是被复制的文本内容/text><viewbindtap="copyBtn"data-title="{{title}}">复制</view>index.js  //不使用封装方法  ......
  • 晃电是什么及电动机抗晃电功能的介绍
    安科瑞虞佳豪“晃电”指的是因供电线路切换、雷击、重合闸、大型设备启动、发电厂故障及其他原因造成电网电压下降到额定值的90%~10%,持续时间为10ms~500ms情况。重要生产型企业对系统供电可靠性的要求较高,一旦出现供电系统晃电,会引起保护设备欠压误保护、生产设备意外停机,致使生产线......
  • 海外直播源码技术文字聊天功能的配置
    今天我要分享的知识和我们日常生活中常用到的一个东西有关,它就是文字。目前已知发现我国最早的文字是距今5000多年的甲骨文,随着历史的发展,文字也在不断的发展,一直发展到我们现在所使用的文字。网络时代的到来,让文字进入到了网络中,在网上我们可以用文字去写文章、搜索问题、聊天等,其......
  • 海外直播源码技术文字聊天功能的配置
     今天我要分享的知识和我们日常生活中常用到的一个东西有关,它就是文字。目前已知发现我国最早的文字是距今5000多年的甲骨文,随着历史的发展,文字也在不断的发展,一直发展到我们现在所使用的文字。网络时代的到来,让文字进入到了网络中,在网上我们可以用文字去写文章、搜索问题、聊天......
  • O2OA (翱途) 开发平台应用市场云笔记功能邀您来体验
    O2OA云笔记提供了一个给员工记录工作笔记,在线协同编辑文档,白板演示的工具,该功能可以将记录下来的文档信息件实时同步到云端,用户随时在多个设备上进行查看、编辑与分享,支持在“云”上做笔记、管理文档、编写脑图信息。这样可以帮助整体工作团队实现资料共享、协同编辑、在线实......