Lo he hecho:
(a) clase de característica puntual (b) clase de característica polilínea
Intento realizar un bucle a través de la clase de característica (a) punto para encontrar la característica más cercana de la clase de característica (b) polilínea.
Sólo como un comienzo a un comando más complejo, me gustaría encontrar y seleccionar la polilínea (b) más cercana, y crear un cuadro de mensaje que me diga su ObjectID, sólo para saber que el método para encontrar la línea más cercana está funcionando.
Me he encontrado con dos opciones, con las que tengo problemas.
(1) El IIndexQuery.NearestFeature que podría utilizar en combinación con el método IFeature.GetFeature para seleccionar la polilínea de interés.
He introducido correctamente los parámetros (creo), pero el método NearestFeature devuelve un "-1" para cada uno de los FID de las características. Tal vez esto se deba a que mis características tienen un campo 'ObjectID', pero no un campo 'FID', sin embargo, he probado el mismo código con una característica polilínea que tenía un campo FID, y todavía me dio -1 en todos los ámbitos. ¿Alguien puede ayudarme?
(2) El IHitTest.HitTest que devuelve un índice de segmento de la característica más cercana.
El problema aquí es que estoy buscando un valor en un campo para toda la línea, no sólo un segmento de la línea. ¿Hay alguna forma de devolver la característica completa a partir del índice del segmento?
¿Alguna otra sugerencia para encontrar la línea más próxima a un punto dado?
No pude encontrar la manera de obtener el color correcto en el código de abajo ...
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