7 votos

Métodos de búsqueda del objeto más próximo VB ArcObjects

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

4voto

Usagi Puntos 113

Bien, mi compañero de trabajo me ayudó a resolver esto...

Resulta que no había declarado un sobre para mi featureIndex, que a su vez, dejó mi indexQuery vacío.

Debajo:

    Dim pNhdIndexQuery As IIndexQuery2

He añadido las siguientes líneas de código:

    Dim pEnvelope As IEnvelope
    Set pEnvelope = New Envelope
    pNhdFeatureIndex.Index Nothing, pEnvelope

Esto viene antes:

    Set pNhdIndexQuery = pNhdFeatureIndex

También debe asegurarse de que las proyecciones del marco de datos, el índice de origen y los puntos de entrada coinciden, para evitar errores.

Espero que esto ayude,

DR

1voto

Hameno Puntos 129

He aquí algunas opciones alternativas no arcoobjeto para encontrar la(s) característica(s) más cercana(s). Esta fue una pregunta anterior publicada en este sitio, "Para cada punto, ¿distancia al polígono más cercano de tipo X?"

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X