⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 空间查询.vb

📁 GIS的Arcengine编程
💻 VB
字号:
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.Display
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.Output
Imports ESRI.ArcGIS.SystemUI
Public Class 空间查询
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim pFeatLyr0 As IFeatureLayer
        Dim pFeatLyr1 As IFeatureLayer
        Dim pFeatLyr2 As IFeatureLayer
        pFeatLyr0 = Form1.AxMapControl1.Map.Layer(0)
        pFeatLyr1 = Form1.AxMapControl1.Map.Layer(1)
        pFeatLyr2 = Form1.AxMapControl1.Map.Layer(2)

        Dim pFeatureSel As IFeatureSelection
        If ComboBox2.Text = "cities" Then
            pFeatureSel = pFeatLyr0
        ElseIf ComboBox2.Text = "roads" Then
            pFeatureSel = pFeatLyr1
        Else
            pFeatureSel = pFeatLyr2
        End If
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim pFeatureClass0 As IFeatureClass
        pFeatureClass0 = pFeatLyr0.FeatureClass

        Dim pDataTable0 As DataTable
        pDataTable0 = New DataTable(pFeatureClass0.AliasName)
        Dim pDataColumn0 As DataColumn

        Dim count0 As Integer
        For count0 = 0 To pFeatureClass0.Fields.FieldCount - 1
            pDataColumn0 = New DataColumn(pFeatureClass0.Fields.Field(count0).Name)
            pDataTable0.Columns.Add(pDataColumn0)
            pDataColumn0.Dispose()
        Next count0

        Dim pFeatureClass1 As IFeatureClass
        pFeatureClass1 = pFeatLyr1.FeatureClass

        Dim pDataTable1 As DataTable
        pDataTable1 = New DataTable(pFeatureClass1.AliasName)
        Dim pDataColumn1 As DataColumn

        Dim count1 As Integer
        For count1 = 0 To pFeatureClass1.Fields.FieldCount - 1
            pDataColumn1 = New DataColumn(pFeatureClass1.Fields.Field(count1).Name)
            pDataTable1.Columns.Add(pDataColumn1)
            pDataColumn1.Dispose()
        Next count1

        Dim pFeatureClass2 As IFeatureClass
        pFeatureClass2 = pFeatLyr2.FeatureClass

        Dim pDataTable2 As DataTable
        pDataTable2 = New DataTable(pFeatureClass0.AliasName)
        Dim pDataColumn2 As DataColumn

        Dim count2 As Integer
        For count2 = 0 To pFeatureClass2.Fields.FieldCount - 1
            pDataColumn2 = New DataColumn(pFeatureClass2.Fields.Field(count2).Name)
            pDataTable2.Columns.Add(pDataColumn2)
            pDataColumn2.Dispose()
        Next count2

       
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

        Dim pSelectionSet As ISelectionSet
        pSelectionSet = pFeatureSel.SelectionSet
        Dim pFeatureCursor As IFeatureCursor
        pSelectionSet.Search(Nothing, False, pFeatureCursor)

        Dim pFeature As IFeature
        pFeature = pFeatureCursor.NextFeature
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

        If ComboBox1.Text = "within the distance of" Then

            Dim pCircle As IPolygon
            pCircle = New Polygon

            Dim pTop As ITopologicalOperator
            pTop = pFeature.Shape
            pCircle = pTop.Buffer(Convert.ToInt32(TextBox1.Text))

            Dim pSpatialQuery As ISpatialFilter
            pSpatialQuery = New SpatialFilter
            pSpatialQuery.GeometryField = "SHAPE"
            pSpatialQuery.Geometry = pCircle
            pSpatialQuery.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains

            Dim pFeatureCursorbuff As IFeatureCursor

            If CheckedListBox1.GetItemChecked(2) = True Then
                pFeatureCursorbuff = pFeatLyr2.Search(pSpatialQuery, False)

                Dim pFeaturebuff As IFeature
                pFeaturebuff = pFeatureCursorbuff.NextFeature

                Do Until pFeaturebuff Is Nothing
                    Form1.AxMapControl1.DrawShape(pFeaturebuff.Shape)

                    Dim pDataRow As DataRow
                    pDataRow = pDataTable2.NewRow

                    Dim count6 As Integer
                    For count6 = 0 To pFeatureClass1.Fields.FieldCount - 1
                        If pFeatureClass2.Fields.FindField(pFeatureClass2.ShapeFieldName) = count6 Then '不懂
                            pDataRow(count6) = pFeatureClass2.ShapeType.ToString()
                        Else
                            pDataRow(count6) = pFeaturebuff.Value(count6).ToString()
                        End If

                    Next count6
                    pDataTable2.Rows.Add(pDataRow)

                    pFeaturebuff = pFeatureCursorbuff.NextFeature
                Loop
            End If

            If CheckedListBox1.GetItemChecked(1) = True Then
                pFeatureCursorbuff = pFeatLyr1.Search(pSpatialQuery, False)

                Dim pFeaturebuff As IFeature
                pFeaturebuff = pFeatureCursorbuff.NextFeature

                Do Until pFeaturebuff Is Nothing
                    Dim pLinesyl As ISimpleLineSymbol
                    pLinesyl = New SimpleLineSymbol
                    pLinesyl.Style = esriSimpleLineStyle.esriSLSSolid
                    Dim mycolor As IRgbColor
                    mycolor = New RgbColor
                    mycolor.Red = 255
                    pLinesyl.Color = mycolor
                    pLinesyl.Width = 4
                    Form1.AxMapControl1.DrawShape(pFeaturebuff.Shape, pLinesyl)

                    Dim pDataRow As DataRow
                    pDataRow = pDataTable1.NewRow

                    Dim count5 As Integer
                    For count5 = 0 To pFeatureClass1.Fields.FieldCount - 1
                        If pFeatureClass1.Fields.FindField(pFeatureClass1.ShapeFieldName) = count5 Then '不懂
                            pDataRow(count5) = pFeatureClass1.ShapeType.ToString()
                        Else
                            pDataRow(count5) = pFeaturebuff.Value(count5).ToString()
                        End If

                    Next count5
                    pDataTable1.Rows.Add(pDataRow)

                    pFeaturebuff = pFeatureCursorbuff.NextFeature
                Loop
            End If

            If CheckedListBox1.GetItemChecked(0) = True Then
                pFeatureCursorbuff = pFeatLyr0.Search(pSpatialQuery, False)

                Dim pFeaturebuff As IFeature
                pFeaturebuff = pFeatureCursorbuff.NextFeature

                Do Until pFeaturebuff Is Nothing
                    Form1.AxMapControl1.DrawShape(pFeaturebuff.Shape)

                    Dim pDataRow As DataRow
                    pDataRow = pDataTable0.NewRow

                    Dim count4 As Integer
                    For count4 = 0 To pFeatureClass0.Fields.FieldCount - 1
                        If pFeatureClass0.Fields.FindField(pFeatureClass0.ShapeFieldName) = count4 Then '不懂
                            pDataRow(count4) = pFeatureClass0.ShapeType.ToString()
                        Else
                            pDataRow(count4) = pFeaturebuff.Value(count4).ToString()
                        End If

                    Next count4
                    pDataTable0.Rows.Add(pDataRow)

                    pFeaturebuff = pFeatureCursorbuff.NextFeature
                Loop
            End If

            pFeature = pFeatureCursor.NextFeature
        Else

            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

            Dim pSpatialQuery As ISpatialFilter
            pSpatialQuery = New SpatialFilter

            Do Until pFeature Is Nothing
                pSpatialQuery.Geometry = pFeature.Shape

                Select Case ComboBox1.Text
                    Case "intersects(相交)"
                        pSpatialQuery.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects
                    Case "touches(相接)"
                        pSpatialQuery.SpatialRel = esriSpatialRelEnum.esriSpatialRelTouches
                    Case "within(在内部)"
                        pSpatialQuery.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin
                    Case "Contains(包含)"
                        pSpatialQuery.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains
                End Select

                pSpatialQuery.GeometryField = "SHAPE"

                Dim outFeatureCursor As IFeatureCursor

                If CheckedListBox1.GetItemChecked(0) = True Then
                    outFeatureCursor = pFeatLyr0.Search(pSpatialQuery, True)
                    Dim pFeat As IFeature
                    pFeat = outFeatureCursor.NextFeature
                    Do Until pFeat Is Nothing
                        Form1.AxMapControl1.DrawShape(pFeat.Shape)

                        Dim pDataRow As DataRow
                        pDataRow = pDataTable0.NewRow

                        Dim count4 As Integer
                        For count4 = 0 To pFeatureClass0.Fields.FieldCount - 1
                            If pFeatureClass0.Fields.FindField(pFeatureClass0.ShapeFieldName) = count4 Then '不懂
                                pDataRow(count4) = pFeatureClass0.ShapeType.ToString()
                            Else
                                pDataRow(count4) = pFeat.Value(count4).ToString()
                            End If

                        Next count4
                        pDataTable0.Rows.Add(pDataRow)

                        pFeat = outFeatureCursor.NextFeature
                    Loop

                End If

                If CheckedListBox1.GetItemChecked(1) = True Then
                    outFeatureCursor = pFeatLyr1.Search(pSpatialQuery, True)
                    Dim pFeat As IFeature
                    pFeat = outFeatureCursor.NextFeature
                    Do Until pFeat Is Nothing
                        Dim pLinesyl As ISimpleLineSymbol
                        pLinesyl = New SimpleLineSymbol
                        pLinesyl.Style = esriSimpleLineStyle.esriSLSSolid
                        Dim mycolor As IRgbColor
                        mycolor = New RgbColor
                        mycolor.Red = 255
                        pLinesyl.Color = mycolor
                        pLinesyl.Width = 4
                        Form1.AxMapControl1.DrawShape(pFeat.Shape, pLinesyl)

                        Dim pDataRow As DataRow
                        pDataRow = pDataTable1.NewRow

                        Dim count5 As Integer
                        For count5 = 0 To pFeatureClass1.Fields.FieldCount - 1
                            If pFeatureClass1.Fields.FindField(pFeatureClass1.ShapeFieldName) = count5 Then '不懂
                                pDataRow(count5) = pFeatureClass1.ShapeType.ToString()
                            Else
                                pDataRow(count5) = pFeat.Value(count5).ToString()
                            End If

                        Next count5
                        pDataTable1.Rows.Add(pDataRow)

                        pFeat = outFeatureCursor.NextFeature
                    Loop

                End If

                If CheckedListBox1.GetItemChecked(2) = True Then
                    outFeatureCursor = pFeatLyr2.Search(pSpatialQuery, True)
                    Dim pFeat As IFeature
                    pFeat = outFeatureCursor.NextFeature
                    Do Until pFeat Is Nothing
                        Dim pFillsyl As ISimpleFillSymbol
                        pFillsyl = New SimpleFillSymbol
                        pFillsyl.Style = ESRI.ArcGIS.Display.esriSimpleFillStyle.esriSFSCross

                        Form1.AxMapControl1.DrawShape(pFeat.Shape, pFillsyl)

                        Dim pDataRow As DataRow
                        pDataRow = pDataTable2.NewRow

                        Dim count6 As Integer
                        For count6 = 0 To pFeatureClass1.Fields.FieldCount - 1
                            If pFeatureClass2.Fields.FindField(pFeatureClass2.ShapeFieldName) = count6 Then '不懂
                                pDataRow(count6) = pFeatureClass2.ShapeType.ToString()
                            Else
                                pDataRow(count6) = pFeat.Value(count6).ToString()
                            End If

                        Next count6
                        pDataTable2.Rows.Add(pDataRow)


                        pFeat = outFeatureCursor.NextFeature
                    Loop

                End If

                pFeature = pFeatureCursor.NextFeature
            Loop


        End If

        选择集显示.DataGridView1.DataSource = pDataTable0
        选择集显示.DataGridView2.DataSource = pDataTable1
        选择集显示.DataGridView3.DataSource = pDataTable2

        
    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        选择集显示.Show()

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
        If ComboBox1.Text = "within the distance of" Then
            TextBox1.Visible = True
        End If

    End Sub


End Class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -