I have:
(a) point feature class (b) polyline feature class
I am trying to loop through the (a) point feature class to find the nearest feature from the (b) polyline feature class.
Just as a start to more complex command, I'd like to find and select the nearest (b) polyline, and create a message box that tells me its ObjectID, just so I know that the method for finding the nearest line is working.
I've come across two options, both of which I'm having issues with.
(1) The IIndexQuery.NearestFeature method, which I could use in combination with the IFeature.GetFeature method to select the polyline feature of interest.
I've successfully entered the parameters (I think), but the NearestFeature method returns a "-1" for each of the features FIDs. Maybe this is because my features have an 'ObjectID' field, but no 'FID' field, though, I tried the same code with a polyline feature that did have an FID field, and it still gave me -1's across the board. Could anybody speak to this?
(2) The IHitTest.HitTest method, which returns a segment index of the nearest feature.
The problem here is that I'm looking for a value in a field for the whole line, not just a segment of the line. Is there a way to return the whole feature from the segment index?
Any other suggestions on finding the nearest line from a given point?
I couldn't figure out how to get the coloring right on the code below...
Private Sub NHD_Prep_Click()
'Set general variables
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
'Set variables for the line layer of interest
Dim pNhdLayer As ILayer
Set pNhdLayer = pMap.Layer(0)
Dim pNhdFLayer As IFeatureLayer
Set pNhdFLayer = pNhdLayer
Dim pNhdFClass As IFeatureClass
Set pNhdFClass = pNhdFLayer.FeatureClass
Dim pNhdFeatureIndex As IFeatureIndex
Set pNhdFeatureIndex = New FeatureIndex
Set pNhdFeatureIndex.FeatureClass = pNhdFClass
Dim pNhdIndexQuery As IIndexQuery2
Set pNhdIndexQuery = pNhdFeatureIndex
'Set variables for the point layer of interest
Dim pLayer As ILayer
Set pLayer = pMap.Layer(1)
Dim pFLayer As IFeatureLayer
Set pFLayer = pLayer
Dim pFClass As IFeatureClass
Set pFClass = pFLayer.FeatureClass
'Set number variables
Dim nearReachFID As Long
Dim distance As Double
Dim strReach As String
Dim dblmeas As Double
'Check to make sure the layer of interest is on top
If pMxDoc.FocusMap.Layer(0).Name <> "NHD Flowline" Then
MsgBox "Please place NHD Flowline on the top spot of the TOC..."
Exit Sub
End If
'Start Cursor on point layer features
Dim pFCursor As IFeatureCursor
Set pFCursor = pFClass.Search(Nothing, True)
Dim pFeature As IFeature
Set pFeature = pFCursor.NextFeature
Do Until pFeature Is Nothing
'Use nearest point method to find the line FID and distance to it
Dim pPointFeature As IPoint
Set pPointFeature = pFeature.Shape
pNhdIndexQuery.NearestFeature pPointFeature, nearReachFID, distance
MsgBox "This is the " & pFeature.Value(pFeature.Fields.FindField("Name")) & " feature. " _
& "The distance from this point to the nearest line, " & nearReachFID & ", is " & distance
Set pFeature = pFCursor.NextFeature
Loop
End Sub