📄 空间查询.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 + -