C# 2012 VisualStudio ArcGIS Engine 二次开发

一、页面设计

1.1Form窗体设计

1.2AttributeQuery(按属性选择窗体设计)

1.3FormQueryBySpatial(按空间位置查询窗体设计)

1.4AttributeTable(打开属性表窗体设计)

1.5书签功能窗体设计

二、代码

2.1主窗体全部代码

  public partial class FrmMian : Form
    {
        public FrmMian()
        {
            InitializeComponent();
        }
        int flag = 0;
        IRgbColor pColor;//全局变量
        IGeometry pGeometry;
        IRgbColor pColorOutLine;
        ISelectionEnvironment pSelectionE = new SelectionEnvironmentClass();
        private void tsbAddShapefile_Click(object sender, EventArgs e)
        {
            OpenFileDialog pOpenFileShape = new OpenFileDialog();
            pOpenFileShape.Filter = "Shape 文件|*.shp";
            pOpenFileShape.Multiselect = true;
            if (pOpenFileShape.ShowDialog() == DialogResult.OK)
            {
                //循环实现多文本提取
                foreach (string pFile in pOpenFileShape.FileNames)
                {
                    int intPosition = pFile.LastIndexOf("\\");
                    //确定shape文件路径与文件名断点
                    string Path = pFile.Substring(0, intPosition);
                    //提取shape文件路径
                    string pShpFileName = pFile.Substring(intPosition + 1);
                    //提取shape文件名
                    axMapControl1.AddShapeFile(Path, pShpFileName);
                }
            }
        }
        private void tsbAddRaster_Click(object sender, EventArgs e)
        {
            OpenFileDialog pRasterOpen = new OpenFileDialog();
            pRasterOpen.Filter = "栅格数据|*.bmp;*.jpg;*.tif;*.img";
            pRasterOpen.Multiselect = true;
            if (pRasterOpen.ShowDialog() == DialogResult.OK)
            {
                foreach (string pRaster in pRasterOpen.FileNames)
                {
                    int intPosition = pRaster.LastIndexOf("\\");
                    string Path = pRaster.Substring(0, intPosition);
                    string pRtFileName = pRaster.Substring(intPosition + 1);
                    IWorkspaceFactory pRasterFactory = new RasterWorkspaceFactory();
                    IRasterWorkspace pRasterW = pRasterFactory.OpenFromFile(Path, 0) as IRasterWorkspace;
                    IRasterDataset PRasterDataset = pRasterW.OpenRasterDataset(pRtFileName);
                    IRasterLayer pRL = new RasterLayer();
                    pRL.CreateFromDataset(PRasterDataset);
                    ILayer pLy = pRL as ILayer;
                    axMapControl1.AddLayer(pLy);
                }
            }
        }
        private void tsbOpenGDB_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dlg = new FolderBrowserDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string path = dlg.SelectedPath;
                IWorkspaceFactory pWorkspaceFactory = new FileGDBWorkspaceFactory();
                IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(path, 0);
                IEnumDataset pEnumDataset = pWorkspace.get_Datasets(esriDatasetType.esriDTAny);
                IDataset pDataset = pEnumDataset.Next();
                while (pDataset != null)
                {
                    if (pDataset is IFeatureDataset)
                    {
                        IFeatureWorkspace pFeatureworkspace = (IFeatureWorkspace)pWorkspace;
                        IFeatureDataset pFeatureDataset = pFeatureworkspace.OpenFeatureDataset(pDataset.Name);
                        IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets; //获取要素集合
                        IDataset pDataset1 = pEnumDataset1.Next();
                        while (pDataset1 != null)
                        {
                            if (pDataset1 is IFeatureClass)//要素类
                            {
                                IFeatureLayer pFeatureLayer = new FeatureLayer();
                                pFeatureLayer.FeatureClass = pFeatureworkspace.OpenFeatureClass(pDataset1.Name);
                                pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
                                if (pFeatureLayer.FeatureClass != null)
                                {
                                    axMapControl1.AddLayer(pFeatureLayer);
                                }
                            }
                            pDataset1 = pEnumDataset1.Next();
                        }
                    }
                    else if (pDataset is IFeatureClass)
                    {
                        IFeatureWorkspace pFeatureworkspace = pWorkspace as IFeatureWorkspace;
                        IFeatureLayer pFlyr = new FeatureLayer();
                        pFlyr.FeatureClass = pFeatureworkspace.OpenFeatureClass(pDataset.Name);
                        pFlyr.Name = pDataset.Name;
                        if (pFlyr != null)
                        {
                            axMapControl1.AddLayer(pFlyr);
                        }
                    }
                    else if (pDataset is IRasterDataset)
                    {
                        IRasterWorkspaceEx pRasterworkspace = pWorkspace as IRasterWorkspaceEx;
                        IRasterDataset pRasterDataset = pRasterworkspace.OpenRasterDataset(pDataset.Name);
                        if (pRasterDataset != null)
                        {
                            IRasterLayer pRasterLayer = new RasterLayer();
                            pRasterLayer.CreateFromDataset(pRasterDataset);
                            pRasterLayer.Name = pDataset.Name;
                            axMapControl1.AddLayer(pRasterLayer);
                        }
                    }
                    pDataset = pEnumDataset.Next();
                }
            }
        }
        private void tsbOpenMXD_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog pOpenFileDialog = new OpenFileDialog();
                pOpenFileDialog.CheckFileExists = true;
                pOpenFileDialog.Title = "打开地图文档";
                pOpenFileDialog.Filter = "ArcMap文档(*.mxd)|*.mxd;|ArcMap模板(*.mxt)|*.mxt|发布地图文件(*.pmf)|*.pmf|所有地图格式(*.mxd;*.mxt;*.pmf)|*.mxd;*.mxt;*.pmf";
                pOpenFileDialog.Multiselect = false;
                pOpenFileDialog.RestoreDirectory = true;
                if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string pFileName = pOpenFileDialog.FileName;
                    if (pFileName == "")
                    {
                        return;
                    }

                    if (axMapControl1.CheckMxFile(pFileName)) //检查地图文档有效性
                    {
                        //将数据载入pMapDocument并与Map控件关联
                        IMapDocument pMapDocument = new MapDocument();//using ESRI.ArcGIS.Carto;
                        pMapDocument.Open(pFileName, "");
                        //获取Map中激活的地图文档
                        axMapControl1.Map = pMapDocument.ActiveView.FocusMap;
                        axMapControl1.ActiveView.Refresh();
                    }
                    else
                    {
                        MessageBox.Show(pFileName + "是无效的地图文档!", "信息提示");
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("打开地图文档失败" + ex.Message);
            }
        }
        private void tsbZoomIn_Click(object sender, EventArgs e)
        {
            flag = 1;
        }
        private void tsbZoomOut_Click(object sender, EventArgs e)
        {
            flag = 2;
        }
        private void tsbPan_Click(object sender, EventArgs e)
        {
            flag = 3;
        }
        private void tsbFixedZoomIn_Click(object sender, EventArgs e)
        {
            IEnvelope pEnvelope = new EnvelopeClass();
            pEnvelope = axMapControl1.Extent;
            pEnvelope.Expand(0.5, 0.5, true);
            axMapControl1.Extent = pEnvelope;
            axMapControl1.Refresh();
        }
        private void tsbFixedZoomOut_Click(object sender, EventArgs e)
        {
            IEnvelope pEnvelope = new EnvelopeClass();
            pEnvelope = axMapControl1.Extent;
            pEnvelope.Expand(1.5, 1.5, true);
            axMapControl1.Extent = pEnvelope;
            axMapControl1.Refresh();
        }
        private void tsbFullExtent_Click(object sender, EventArgs e)
        {
            axMapControl1.Extent = axMapControl1.FullExtent;
        }
        IExtentStack yExtentStack;
        private void tsbUndo_Click(object sender, EventArgs e)
        {
            yExtentStack = axMapControl1.ActiveView.ExtentStack;
            if (yExtentStack.CanUndo())
            {
                yExtentStack.Undo();
                tsbUndo.Enabled = true;
                if (!yExtentStack.CanUndo())
                {
                    tsbUndo.Enabled = false;
                }
            }
            axMapControl1.ActiveView.Refresh();
        }
        private void tsbRedo_Click(object sender, EventArgs e)
        {
            yExtentStack = axMapControl1.ActiveView.ExtentStack;
            if (yExtentStack.CanRedo())
            {
                yExtentStack.Redo();
                tsbRedo.Enabled = true;
                if (!yExtentStack.CanRedo())
                {
                    tsbRedo.Enabled = false;
                }
            }
            axMapControl1.ActiveView.Refresh();
        }
        private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {
            IActiveView pActiveView = axMapControl1.ActiveView;
            IEnvelope pEnvelope = new EnvelopeClass();
            object symbol;
            switch (flag)
            {
                case 1:
                    pEnvelope = axMapControl1.TrackRectangle();
                    pActiveView.Extent = pEnvelope;
                    pActiveView.Refresh();
                    break;
                case 2:
                    pEnvelope = axMapControl1.TrackRectangle();
                    pEnvelope.Expand(pActiveView.Extent.Width * 2, pActiveView.Extent.Height * 2, true);
                    pActiveView.Extent = pEnvelope;
                    pActiveView.Refresh();
                    break;
                case 3:
                    axMapControl1.Pan();
                    break;
                case 4:
                    IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
                    pPoint.X = e.mapX;
                    pPoint.Y = e.mapY;
                    pGeometry = pPoint as IGeometry;
                    ISimpleMarkerSymbol pSimpleMarkerS = new SimpleMarkerSymbol();
                    if (cboStyle.SelectedIndex == 0)
                    {
                        pSimpleMarkerS.Style = esriSimpleMarkerStyle.esriSMSCircle;
                    }
                    else if (cboStyle.SelectedIndex == 1)
                    {
                        pSimpleMarkerS.Style = esriSimpleMarkerStyle.esriSMSSquare;
                    }
                    else if (cboStyle.SelectedIndex == 2)
                    {
                        pSimpleMarkerS.Style = esriSimpleMarkerStyle.esriSMSCross;
                    }
                    else if (cboStyle.SelectedIndex == 3)
                    {
                        pSimpleMarkerS.Style = esriSimpleMarkerStyle.esriSMSX;
                    }
                    else if (cboStyle.SelectedIndex == 4)
                    {
                        pSimpleMarkerS.Style = esriSimpleMarkerStyle.esriSMSDiamond;
                    }
                    pSimpleMarkerS.Size = Convert.ToDouble(txtSize.Text);
                    if (pColor == null)
                    {
                        pColor = new RgbColor();
                        pSimpleMarkerS.Color = pColor;
                    }
                    else
                    {
                        pSimpleMarkerS.Color = pColor;
                    }
                    symbol = pSimpleMarkerS;
                    axMapControl1.DrawShape(pPoint, ref symbol);
                    break;
                case 5:
                    pGeometry = axMapControl1.TrackLine();
                    ISimpleLineSymbol pSimpleLineS = new SimpleLineSymbol();
                    if (cboStyle.SelectedIndex == 0)
                    {
                        pSimpleLineS.Style = esriSimpleLineStyle.esriSLSSolid;
                    }
                    else if (cboStyle.SelectedIndex == 1)
                    {
                        pSimpleLineS.Style = esriSimpleLineStyle.esriSLSDash;
                    }
                    pSimpleLineS.Width = Convert.ToDouble(txtSize.Text);
                    if (pColor == null)
                    {
                        pColor = new RgbColor();
                        pSimpleLineS.Color = pColor;
                    }
                    else
                    {
                        pSimpleLineS.Color = pColor;
                    }
                    symbol = pSimpleLineS;
                    axMapControl1.DrawShape(pGeometry, ref symbol);
                    break;
                case 6:
                    pGeometry = axMapControl1.TrackPolygon();
                    ISimpleFillSymbol pSimpleFillS = new SimpleFillSymbol();
                    switch (cboStyle.SelectedIndex)
                    {
                        case 0:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSSolid;
                            break;
                        case 1:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSHollow;
                            break;
                        case 2:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSNull;
                            break;
                        case 3:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSHorizontal;
                            break;
                        case 4:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSVertical;
                            break;
                        case 5:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSForwardDiagonal;
                            break;
                        case 6:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSBackwardDiagonal;
                            break;
                        case 7:
                            pSimpleFillS.Style = esriSimpleFillStyle.esriSFSCross;
                            break;
                    }
                    if (pColor == null)
                    {
                        pColor = new RgbColor();
                        pSimpleFillS.Color = pColor;
                    }
                    else
                    {
                        pSimpleFillS.Color = pColor;
                    }
                    pSimpleFillS.Color = pColor;
                    pColorOutLine = new RgbColor();
                    pColorOutLine.Blue = 100;
                    pColorOutLine.Green = 88;
                    pColorOutLine.Red = 90;
                    ILineSymbol pLineSymbol = new SimpleLineSymbol();
                    pLineSymbol.Width = 2;
                    pLineSymbol.Color = pColorOutLine;
                    pSimpleFillS.Outline = pLineSymbol;
                    symbol = pSimpleFillS;
                    axMapControl1.DrawShape(pGeometry, ref symbol);
                    break;
                case 7:
                    pGeometry = axMapControl1.TrackRectangle();
                    SelectionByShape();
                    break;
                case 8:
                    pGeometry = axMapControl1.TrackCircle();
                    SelectionByShape();
                    break;
                case 9:
                    pGeometry = axMapControl1.TrackPolygon();
                    SelectionByShape();
                    break;
                case 10:
                    pGeometry = axMapControl1.TrackLine();
                    SelectionByShape();
                    break;
            }
        }
        //创建一个公共方法
        private void SelectionByShape()
        {
            pSelectionE.DefaultColor = pColor;
            switch (tcbSelectionMethod.SelectedIndex)
            {
                case 0:
                    pSelectionE.AreaSelectionMethod = esriSpatialRelEnum.esriSpatialRelContains;
                    break;
                case 1:
                    pSelectionE.AreaSelectionMethod = esriSpatialRelEnum.esriSpatialRelCrosses;
                    break;
                case 2:
                    pSelectionE.AreaSelectionMethod = esriSpatialRelEnum.esriSpatialRelIntersects;
                    break;
            }

            axMapControl1.Map.SelectByShape(pGeometry, pSelectionE, false);
            axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
        }
        private void tsbPoint_Click(object sender, EventArgs e)
        {
            flag = 4;
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
            cboStyle.Visible = true;
            txtSize.Visible = true;
            label1.Visible = true;
            pictureBox1.Visible = true;
            cboStyle.Items.Add("圆");
            cboStyle.Items.Add("正方形");
            cboStyle.Items.Add("十字形");
            cboStyle.Items.Add("X型");
            cboStyle.Items.Add("菱形");
            //给绘制点设置初始形状
            cboStyle.SelectedIndex = 0;
            txtSize.Text = "5";
        }
        private void tbsPolyLine_Click(object sender, EventArgs e)
        {
            flag = 5;
            cboStyle.Items.Clear();
            cboStyle.Items.Add("实线");
            cboStyle.Items.Add("虚线");
            cboStyle.SelectedIndex = 0;
            cboStyle.Visible = true;
            txtSize.Text = "2";
        }
        private void tsbPolygon_Click(object sender, EventArgs e)
        {
            flag = 6;
            cboStyle.Items.Clear();
            cboStyle.Items.Add("实心填充");
            cboStyle.Items.Add("空心填充");
            cboStyle.Items.Add("不填充");
            cboStyle.Items.Add("短横线填充");
            cboStyle.Items.Add("竖线填充");
            cboStyle.Items.Add("对角线填充");
            cboStyle.Items.Add("反对角线填充");
            cboStyle.Items.Add("十字架填充");
            cboStyle.SelectedIndex = 0;
            cboStyle.Visible = true;
        }
        private void tsbSelectRectangle_Click(object sender, EventArgs e)
        {
            flag = 7;
        }
        private void tsbSelectCircle_Click(object sender, EventArgs e)
        {
            flag = 8;
        }
        private void tsbSelectPoligon_Click(object sender, EventArgs e)
        {
            flag = 9;
        }
        private void SelectLine_Click(object sender, EventArgs e)
        {
            flag = 10;
        }
        private void tsbClear_Click(object sender, EventArgs e)
        {
            axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
            axMapControl1.Map.ClearSelection();
            axMapControl1.ActiveView.Refresh();
        }
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            ColorD();
        }
        public void ColorD()
        {
            ColorDialog pColorD = new ColorDialog();
            if (pColorD.ShowDialog() == DialogResult.OK)
            {
                pColor = new RgbColor();
                pColor.Red = pColorD.Color.R;
                pColor.Blue = pColorD.Color.B;
                pColor.Green = pColorD.Color.G;
            }
        }
        private void tsbBookmarks_Click(object sender, EventArgs e)
        {
            frmBookMarks frmBookM = new frmBookMarks(this);
            frmBookM.Show();
        }
        public void CreatBookMark(string pBookmarkName)
        {
            IAOIBookmark pAoBookmark = new AOIBookmark();
            if (pAoBookmark != null)
            {
                pAoBookmark.Location = axMapControl1.ActiveView.Extent;
                pAoBookmark.Name = pBookmarkName;
            }
            IMapBookmarks pBookmarks = axMapControl1.Map as IMapBookmarks;
            if (pAoBookmark != null)
            {
                pBookmarks.AddBookmark(pAoBookmark);
            }
            tcbBookmarkName.Items.Add(pBookmarkName);
        }
        private void tcbBookmarkName_SelectedIndexChanged(object sender, EventArgs e)
        {
            IMapBookmarks pBookmarks = axMapControl1.Map as IMapBookmarks;
            IEnumSpatialBookmark pEnumSpatialBookmark = pBookmarks.Bookmarks;
            pEnumSpatialBookmark.Reset();
            ISpatialBookmark pSpatialBooks = pEnumSpatialBookmark.Next();
            while (pSpatialBooks != null)
            {
                if (tcbBookmarkName.SelectedItem.ToString() == pSpatialBooks.Name)
                {
                    pSpatialBooks.ZoomTo((IMap)axMapControl1.ActiveView);
                    axMapControl1.ActiveView.Refresh();
                    break;
                }
                pSpatialBooks = pEnumSpatialBookmark.Next();
            }
        }
        private void tsbColorDialog_Click(object sender, EventArgs e)
        {
            ColorD();
        }
        private void FrmMian_Load(object sender, EventArgs e)
        {
            tcbSelectionMethod.Items.Add("包含");
            tcbSelectionMethod.Items.Add("穿过");
            tcbSelectionMethod.Items.Add("相交");
            tcbSelectionMethod.SelectedIndex = 0;
        }

        private void tsbSelectbyAttribute_Click(object sender, EventArgs e)
        {
            AttributeQuery pAttributeF = new AttributeQuery();
            pAttributeF.mainMap = axMapControl1.Map;
            pAttributeF.Show();
        }
                ILayer pLayer=null;
        private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
        {
            //鼠标右键触发菜单栏,并定位在图层控件内
            if (e.button == 2)
            {
                System.Drawing.Point point = new System.Drawing.Point();
                esriTOCControlItem pItem = esriTOCControlItem.esriTOCControlItemNone;
                IBasicMap pMap = null;
                object pUnk =null,pData=null;
                axTOCControl1.HitTest(e.x, e.y, ref pItem,ref pMap,ref  pLayer,ref pUnk,ref pData);
                point.X = e.x;
                point.Y = e.y;
                contextMenuStrip1.Show(axTOCControl1, point);
            }
        }
        //点击打开属性表时弹出属性表(AttributeTable)窗口
        private void ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AttributeTable pAttributeT = new AttributeTable();
            //在窗体显示之前就调用属性表方法
            pAttributeT.CreateAttribute(pLayer);
            pAttributeT.Show();
        }
        private void tsbSelectedByLocation_Click(object sender, EventArgs e)
        {
            //新创建空间查询窗体
            FormQueryBySpatial formQueryBySpatial = new FormQueryBySpatial();
            //将当前主窗体中MapControl控件中的Map对象赋值给FormSelection窗体的CurrentMap属性
            formQueryBySpatial.CurrentMap= axMapControl1.Map;
            formQueryBySpatial.Show();
        }
    }

2.2按属性查询窗体代码

public partial class AttributeQuery : Form
    {
        public AttributeQuery()
        {
            InitializeComponent();
        }
        int selectedIndex;
        int pFieldSelected;
        int[] fieldIndex;
        private IMap pMap;
        public IMap mainMap
        {
            //类属性传值方式:写入,用pMap接收值
            set
            {
                pMap = value;
            }
        }
        private void AttributeQuery_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < pMap.LayerCount; i++)
            {
                cboLayer.Items.Add(pMap.get_Layer(i).Name);
            }
            cboLayer.SelectedIndex = 0;
        }

        private void cboLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            lblSQLWhere.Text = "Select*From " + cboLayer.SelectedItem.ToString() + "Where:";
            for (int i = 0; i < pMap.LayerCount; i++)
            {
                if (cboLayer.Text == pMap.get_Layer(i).Name)
                {
                    selectedIndex = i;
                    break;
                }
            }
            ITable pTable = pMap.get_Layer(selectedIndex) as ITable;
            IField pField = null;
            lstField.Items.Clear();
            List<int> fieldIndices = new List<int>();//用数组来存储字段索引
            for (int i = 0; i < pTable.Fields.FieldCount; i++)
            {
                pField = pTable.Fields.get_Field(i);
                if (pField.Type != esriFieldType.esriFieldTypeGeometry && pField.Type != esriFieldType.esriFieldTypeRaster)
                {
                    lstField.Items.Add(pField.Name);
                    fieldIndices.Add(i);
                }
                fieldIndex = fieldIndices.ToArray();
            }
        }

        private void lstField_DoubleClick(object sender, EventArgs e)
        {
            txtSQLWhere.Text = txtSQLWhere.Text+lstField.SelectedItem.ToString();
        }

        private void btSQL_Click(object sender, EventArgs e)
        {
            IFeatureLayer pFeatureLyr=pMap.get_Layer(selectedIndex) as IFeatureLayer;
            IFeatureSelection pFeatureSel = pFeatureLyr as IFeatureSelection;
            IQueryFilter pQueryFilter = new QueryFilter();
            pQueryFilter.WhereClause = txtSQLWhere.Text;
            pFeatureSel.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
            IActiveView pActiveView = pMap as IActiveView;
            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, pActiveView.Extent);
            this.Close();
        }

        private void btDeng_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text = txtSQLWhere.Text + "=";
        }

        private void btDaYu_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text = txtSQLWhere.Text + ">";
        }

        private void btXiaoYu_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text = txtSQLWhere.Text + "<";
        }

        private void btBaifenShu_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text = txtSQLWhere.Text + "%";
        }

        private void btJian_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text = txtSQLWhere.Text + "-";
        }

        private void lstFieldValue_DoubleClick(object sender, EventArgs e)
        {
            txtSQLWhere.Text = txtSQLWhere.Text + lstFieldValue.SelectedItem.ToString();
        }

        private void btClear_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Clear();
        }

        private void btCancel_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void btUniqueValue_Click(object sender, EventArgs e)
        {
            lstFieldValue.Items.Clear();
            IFeatureLayer pFeatureLyr = pMap.get_Layer(selectedIndex) as IFeatureLayer;
            IFeatureClass pFeatureClass = pFeatureLyr.FeatureClass;
            IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
            //数据统计
            IDataStatistics pDatasta = new DataStatistics();
            pDatasta.Cursor = pFeatureCursor as ICursor;
            //获取选中字段
            ITable pTable = pMap.get_Layer(selectedIndex) as ITable;
            int realFieldIndex = fieldIndex[lstField.SelectedIndex];
            IField pFieldSelected = pTable.Fields.get_Field(realFieldIndex);
            //获得唯一值
            pDatasta.Field = pFieldSelected.Name;
            //定义一个集合,用于获取字段唯一值
            System.Collections.IEnumerator pEnumerator = pDatasta.UniqueValues;
            pEnumerator.Reset();
            //用循环显示所有字段值
            lstFieldValue.Items.Clear();
            while (pEnumerator.MoveNext())
            {
                if (pFieldSelected.Type == esriFieldType.esriFieldTypeString)
                {
                    lstFieldValue.Items.Add("'" + pEnumerator.Current.ToString() + "'");
                }
                else
                {
                    lstFieldValue.Items.Add(pEnumerator.Current.ToString());
                }
            }
        }

        private void btLike_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btLike.Text + " ";
        }

        private void btAnd_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btAnd.Text + " ";
        }

        private void btOr_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btOr.Text + " ";
        }

        private void btNot_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btNot.Text + " ";
        }

        private void btIs_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btIs.Text + " ";
        }

        private void btKuohao_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btKuohao.Text + " ";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + button2.Text + " ";
        }

        private void btDayuDengyu_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btDayuDengyu.Text + " ";
        }

        private void btXiaoyuDengyu_Click(object sender, EventArgs e)
        {
            txtSQLWhere.Text += " " + btXiaoyuDengyu.Text + " ";
        }
    }

2.3按空间查询窗体代码(部分功能使用不了,自行解决)

  public partial class FormQueryBySpatial : Form
    {
        private IMap currentMap;    //当前MapControl控件中的Map对象        

        /// <summary>
        /// 获得当前MapControl控件中的Map对象。
        /// </summary>
        public IMap CurrentMap
        {
            set
            {
                currentMap = value;
            }
        }
        public FormQueryBySpatial()
        {
            InitializeComponent();
        }
        private void FormQueryBySpatial_Load(object sender, EventArgs e)
        {
            try
            {

                checkedListBoxTargetLayers.Items.Clear();

                string layerName;
                for (int i = 0; i < currentMap.LayerCount; i++)
                {
                    if (currentMap.get_Layer(i) is GroupLayer)
                    {
                        ICompositeLayer compositeLayer = currentMap.get_Layer(i) as ICompositeLayer;
                        for (int j = 0; j < compositeLayer.Count; j++)
                        {
                            layerName = compositeLayer.get_Layer(j).Name;
                            checkedListBoxTargetLayers.Items.Add(layerName);
                            comboBoxSourceLayer.Items.Add(layerName);
                        }
                    }
                    else
                    {
                        layerName = currentMap.get_Layer(i).Name;
                        checkedListBoxTargetLayers.Items.Add(layerName);
                        comboBoxSourceLayer.Items.Add(layerName);
                    }
                }
                comboBoxSourceLayer.SelectedIndex = 0;
                comboBoxMethods.SelectedIndex = 0;
            }
            catch { }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                SelectFeaturesBySpatial();
                this.Close();
            }
            catch
            { }
        }
        private void btApply_Click(object sender, EventArgs e)
        {
            try
            {
                SelectFeaturesBySpatial();
            }
            catch
            { }
        }

        /// <summary>
        /// 在地图中根据图层名称获得矢量图层。
        /// </summary>
        /// <param name="map">当前地图</param>
        /// <param name="layerName">图层名称</param>
        /// <returns>IFeatureLayer接口的矢量图层对象</returns>
        private IFeatureLayer GetFeatureLayerByName(IMap map, string layerName)
        {
            //对地图中的图层进行遍历
            for (int i = 0; i < map.LayerCount; i++)
            {
                //如果该图层为图层组类型,则分别对所包含的每个图层进行操作
                if (map.get_Layer(i) is GroupLayer)
                {
                    //使用ICompositeLayer接口进行遍历操作
                    ICompositeLayer compositeLayer = map.get_Layer(i) as ICompositeLayer;
                    for (int j = 0; j < compositeLayer.Count; j++)
                    {
                        //如果图层名称为所要查询的图层名称,则返回IFeatureLayer接口的矢量图层对象
                        if (compositeLayer.get_Layer(j).Name == layerName)
                            return (IFeatureLayer)compositeLayer.get_Layer(j);
                    }
                }
                //如果图层不是图层组类型,则直接进行判断
                else
                {
                    if (map.get_Layer(i).Name == layerName)
                        return (IFeatureLayer)map.get_Layer(i);
                }
            }
            return null;
        }
        /// <summary>
        /// 将矢量图层中所有要素的几何体进行Union操作得到一个合并后的新几何体。
        /// </summary>
        /// <param name="featureLayer">进行操作的矢量图层</param>
        /// <returns>合并后的新几何体</returns>
        private IGeometry GetFeatureLayerGeometryUnion(IFeatureLayer featureLayer)
        {
            //定义IGeometry接口的对象,存储每一步拓扑操作后得到的几何体
            IGeometry geometry = null;
            //使用ITopologicalOperator接口进行几何体的拓扑操作
            ITopologicalOperator topologicalOperator;
            //使用null作为查询过滤器得到图层中所有要素的游标
            IFeatureCursor featureCursor = featureLayer.Search(null, false);
            //获取IFeature接口的游标中的第一个元素
            IFeature feature = featureCursor.NextFeature();
            //当游标不为空时
            while (feature != null)
            {
                //如果几何体不为空
                if (geometry != null)
                {
                    //进行接口转换,使用当前几何体的ITopologicalOperator接口进行拓扑操作
                    topologicalOperator = geometry as ITopologicalOperator;
                    //执行拓扑合并操作,将当前要素的几何体与已有几何体进行Union,返回新的合并后的几何体
                    geometry = topologicalOperator.Union(feature.Shape);
                }
                else
                    geometry = feature.Shape;
                //移动游标到下一个要素
                feature = featureCursor.NextFeature();
            }
            //返回最新合并后的几何体
            return geometry;
        }
        /// <summary>
        /// 根据已配置的查询条件来执行空间查询操作。
        /// </summary>
        private void SelectFeaturesBySpatial()
        {
            //定义和创建用于空间查询的ISpatialFilter接口的对象
            ISpatialFilter spatialFilter = new SpatialFilterClass();
            //默认设定用于查询的空间几何体为当前地图源图层中所有要素几何体的集合
            spatialFilter.Geometry = GetFeatureLayerGeometryUnion
                (GetFeatureLayerByName(currentMap, comboBoxSourceLayer.SelectedItem.ToString()));
            //根据对空间选择方法的选择采用相应的空间选择方法
            switch (comboBoxMethods.SelectedIndex)
            {
                case 0:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                    break;
                case 1:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin;
                    break;
                case 2:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
                    break;
                case 3:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin;
                    break;
                case 4:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches;
                    break;
                case 5:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
                    break;
                default:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                    break;
            }

            //对所选择的目标图层进行遍历,并对每一个图层进行空间查询操作,查询结果将放在选择集中
            IFeatureLayer featureLayer;
            //对所有被选择的目标图层进行遍历
            for (int i = 0; i < checkedListBoxTargetLayers.CheckedItems.Count; i++)
            {
                //根据选择的目标图层名称获得对应的矢量图层
                featureLayer = GetFeatureLayerByName(currentMap, (string)checkedListBoxTargetLayers.CheckedItems[i]);
                //进行接口转换,使用IFeatureSelection接口选择要素
                IFeatureSelection featureSelection = featureLayer as IFeatureSelection;
                //使用IFeatureSelection接口的SelectFeatures方法根据空间查询过滤器选择要素,将其放在新的选择集中
                featureSelection.SelectFeatures((IQueryFilter)spatialFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
            }

            //进行接口转换,使用IActiveView接口进行视图操作
            IActiveView activeView = currentMap as IActiveView;
            //部分刷新操作,只刷新地理选择集的内容
            activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, activeView.Extent);
        }
        private void comboBoxMethods_SelectedIndexChanged(object sender, EventArgs e)
        {
            //comboBoxMethods.Items.Add("目标图层的要素与源图层的要素相交(intersect)");
            //comboBoxMethods.Items.Add("目标图层的要素位于源图层要素的一定距离范围内(within)");
            //comboBoxMethods.Items.Add("目标图层的要素包含源图层要素(contain)");
            //comboBoxMethods.Items.Add("目标图层的要素在源图层的要素内(within)");
            //comboBoxMethods.Items.Add("目标图层的要素与源图层要素的边界相接(touch)");
            //comboBoxMethods.Items.Add("目标图层的要素被源图层要素的轮廓穿过(corss)");
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            
        }
    }

 2.4打开属性表窗体代码

  public partial class AttributeTable : Form
    {
        //图层对象
        ILayer pLayer;
        public AttributeTable()
        {
            InitializeComponent();
        }
        //创建公共方法接受图层信息
        public void CreateAttribute(ILayer pLayer)
        {
            //创建虚拟表用于过渡性存储
            //DataTable
            //将方法createDataTable获取到的值赋到attributeTable变量上,用于后续显示
            DataTable attributeTable = createDataTable(pLayer);
            dataGridView1.DataSource = attributeTable;
        }
        //创建一个公共方法获取空表,用于后续存储表信息
        public DataTable createDataTable(ILayer pLayer)
        {
            DataTable pDataTable=createDataTableByLayer(pLayer);
            //行
            DataRow pDataRow = null;
            ITable pTable = pLayer as ITable;
            ICursor pCursor = pTable.Search(null, false);
            IRow pRow = pCursor.NextRow();//逐行检索
            while (pRow!=null)
            {
                pDataRow = pDataTable.NewRow();
                for (int i = 0; i < pRow.Fields.FieldCount; i++)
                {
                    pDataRow[i] = pRow.get_Value(i);
                }
                pDataTable.Rows.Add(pDataRow);
                pRow = pCursor.NextRow();

            }
            return pDataTable;
        }
        //创建一个公共方法用于获取属性表的名称行信息
        public DataTable createDataTableByLayer(ILayer pLayer)
        {
            DataTable pDatatable = new DataTable();
            ITable pTable = pLayer as ITable;
            IField pField = null;
            DataColumn pDataColumn = null;
            for (int i = 0; i < pTable.Fields.FieldCount; i++)
            {
                pField = pTable.Fields.get_Field(i);
                pDataColumn = new DataColumn(pField.Name);
                pDatatable.Columns.Add(pDataColumn);
            }
            return pDatatable;
        }
    
        private void AttributeTable_Load(object sender, EventArgs e)
        {

        }
    }

2.5书签功能窗体代码

    public partial class frmBookMarks : Form
    {            
        FrmMian frmMian;
        public frmBookMarks(FrmMian frmM)
        {
            InitializeComponent();
            if (frmM != null)
            {
                frmMian = frmM;
            }
        }

        private void btOK_Click(object sender, EventArgs e)
        {
            frmMian.CreatBookMark(textBox1.Text);
            this.Close();
        }

        private void btConceal_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        }
    }

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值