About the Server spatial query COM utility Sample
[C#]
VegUtils_VBNet.cs
[Visual Basic .NET]
VegUtils_VBNet.vb
Imports Microsoft.VisualBasic Imports System Imports System.Collections.Generic Imports System.Text Imports System.Runtime.InteropServices Imports System.EnterpriseServices Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.Display Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Geometry <Guid("7B9FA6DD-C89E-40f2-85B2-1A8391D70568")> _ Public Interface IVegUtils_VBNet Function sumVegetationType(ByRef pVegClass As IFeatureClass, ByRef pPoint As IPoint, ByRef dDistance As Double, ByRef sSummaryFld As String) As IVegResults_VBNet End Interface Namespace VegCOM_VBNet <AutomationProxy(True), ClassInterface(ClassInterfaceType.None), Guid("FD32CC24-6547-48d8-B1D6-323E07F6269F")> _ Public Class VegUtils_VBNet Inherits ServicedComponent Implements IVegUtils_VBNet Public Function sumVegetationType(ByRef pVegClass As IFeatureClass, ByRef pPoint As IPoint, ByRef dDistance As Double, ByRef sSummaryFld As String) As IVegResults_VBNet Implements IVegUtils_VBNet.sumVegetationType ' buffer the point Dim pTopoOp As ITopologicalOperator = TryCast(pPoint, ITopologicalOperator) Dim pGeom As IGeometry = pTopoOp.Buffer(dDistance) ' query the feature class Dim pSFilter As ISpatialFilter = New SpatialFilter() pSFilter.Geometry = pGeom pSFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects pSFilter.GeometryField = pVegClass.ShapeFieldName Dim pFCursor As IFeatureCursor = pVegClass.Search(pSFilter, True) ' loop thourgh the features, clip each geometry to the buffer ' and total areas by attribute value pTopoOp = TryCast(pGeom, ITopologicalOperator) Dim lPrim As Integer = pVegClass.FindField(sSummaryFld) Dim dict As New System.Collections.Specialized.ListDictionary() ' create the symbol and graphic elements collection for the graphics Dim pSFS As ISimpleFillSymbol = newFillS() Dim pGraphics As IGraphicElements = New GraphicElements() Dim pFeature As IFeature pFeature = pFCursor.NextFeature() Do While pFeature IsNot Nothing ' create the graphic Dim pFE As IFillShapeElement = TryCast(New PolygonElement, IFillShapeElement) Dim pElement As IElement = TryCast(pFE, IElement) ' clip the geometry Dim pNewGeom As IGeometry = pTopoOp.Intersect(pFeature.Shape, esriGeometryDimension.esriGeometry2Dimension) pElement.Geometry = pNewGeom pFE.Symbol = pSFS Dim ge As IGraphicElement = TryCast(pFE, IGraphicElement) pGraphics.Add(ge) ' add to dictionary Dim pArea As IArea = TryCast(pNewGeom, IArea) Dim sType As String = TryCast(pFeature.Value(lPrim), String) If dict.Contains(sType) Then dict(sType) = CDbl(dict(sType)) + pArea.Area Else dict(sType) = pArea.Area End If pFeature = pFCursor.NextFeature() Loop ' create the summary recordset Dim psumRS As IRecordSet = sumRS(dict) ' create the results object Dim pRes As IVegResults_VBNet = New VegResults_VBNet() pRes.ResGraphics = pGraphics pRes.Stats = psumRS Return pRes End Function Private Function sumRS(ByVal dict As System.Collections.Specialized.ListDictionary) As IRecordSet ' create the new record set Dim pNewRs As IRecordSet = New RecordSet() Dim prsInit As IRecordSetInit = TryCast(pNewRs, IRecordSetInit) Dim pFields As IFields = New Fields() Dim pFieldsEdit As IFieldsEdit = TryCast(pFields, IFieldsEdit) pFieldsEdit.FieldCount_2 = 2 Dim pField As IField = New Field() Dim pFieldEdit As IFieldEdit = TryCast(pField, IFieldEdit) pFieldEdit.Name_2 = "Type" pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString pFieldEdit.Length_2 = 50 pFieldsEdit.Field_2(0) = pField pField = New Field() pFieldEdit = TryCast(pField, IFieldEdit) pFieldEdit.Name_2 = "Area" pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble pFieldsEdit.Field_2(1) = pField prsInit.CreateTable(pFields) ' add all the area/type pairs Dim pIC As ICursor = prsInit.Insert() Dim pRowBuf As IRowBuffer = prsInit.CreateRowBuffer() Dim myEnumerator As System.Collections.IDictionaryEnumerator = dict.GetEnumerator() Do While myEnumerator.MoveNext() pRowBuf.Value(0) = myEnumerator.Key pRowBuf.Value(1) = myEnumerator.Value pIC.InsertRow(pRowBuf) Loop Return pNewRs End Function Private Function newFillS() As ISimpleFillSymbol Dim pSLS As ISimpleLineSymbol = New SimpleLineSymbol() Dim pcolor As IRgbColor = New RgbColor() pcolor.Red = 255 pcolor.Green = 0 pcolor.Blue = 0 pSLS.Color = pcolor pSLS.Style = esriSimpleLineStyle.esriSLSSolid pSLS.Width = 2 Dim pSFS As ISimpleFillSymbol = New SimpleFillSymbol() pSFS.Outline = pSLS pSFS.Style = esriSimpleFillStyle.esriSFSHollow Return pSFS End Function End Class End Namespace