4 votos

La selección de características de ubicación según característica seleccionada utilizando ArcObjects?

Soy muy nuevo en ArcGIS y ArcObjects.

Estoy escribiendo un código de un botón que va a detectar una función seleccionada y, a continuación, seleccione otras características basadas en la función que yo había escogido por favor, eche un vistazo a mi código

public class LandmarkBtn : ESRI.ArcGIS.Desktop.AddIns.Button {

    public LandmarkBtn() {
    }

    protected override void OnClick() {
         var doc = ArcMap.Document;
        var focusMap = doc.FocusMap;
        IEnumLayer layer = focusMap.get_Layers(null,true);
        ILayer lyr = null;
        IFeatureClass Lmarks = null;

        while ((lyr = layer.Next()) != null) {

            var featureLayer = lyr as IFeatureLayer;
            if (featureLayer == null)
                continue;  



        var name = featureLayer.FeatureClass.AliasName;

            if ("landmarks".Equals(name.ToLowerInvariant())) {


                Lmarks = featureLayer.FeatureClass;
                break;
            }
        }

        if (Lmarks == null) {
            MessageBox.Show("Sorry, No LM Layer Found");
            return;
        }


        var selection = (IEnumFeature)focusMap.FeatureSelection;
        IFeature ftr = null;
        ftr = selection.Next();

ftr, ahora tiene el seleccionado hito(característica), quiero realizar una consulta que seleccione características de otra capa que está dentro de 100 metros de la histórica función, puede usted por favor me indique hacia donde debo mirar o me dan un código de ejemplo que podría ayudar?

5voto

user19213 Puntos 1

Esto tomará varios pasos:

  1. Obtener un cursor de selección de conjunto de

        public static IFeatureCursor GetSelectedFeatures(IFeatureLayer featureLayer)
    {
        if (featureLayer == null) return null;
        IFeatureSelection fSel = (IFeatureSelection)featureLayer;
        ISelectionSet selSet = (ISelectionSet)fSel.SelectionSet;
        ICursor cursor = null;
        selSet.Search(null, false, out cursor);
        IFeatureCursor fCursor = cursor as IFeatureCursor;
        return fCursor;
    }
    
  2. La unión del búfer y los elementos en el cursor

    public static IPolygon UnionShapes(IFeatureCursor cursor, double bufferDist)
    {
        if (cursor == null) return null;
        IFeature pFeat = cursor.NextFeature();
        if (pFeat != null)
        {
            if (pFeat.Shape is IPoint)
            {
                ITopologicalOperator ptopBuffer = (ITopologicalOperator)pFeat.Shape;
                IPolygon pTempPoly = (IPolygon)ptopBuffer.Buffer(bufferDist);
                ITopologicalOperator ptopUnion = (ITopologicalOperator)pTempPoly;
                pFeat = cursor.NextFeature();
                while (pFeat != null)
                {
                    ptopBuffer = (ITopologicalOperator)pFeat.Shape;
                    pTempPoly = (IPolygon)ptopBuffer.Buffer(bufferDist);
                    ptopUnion = (ITopologicalOperator)ptopUnion.Union(pTempPoly);
                    pFeat = cursor.NextFeature();
                }
                return (IPolygon)ptopUnion;
            }
            return null;
        }
        return null;
    }
    
  3. Seleccione el filtro espacial en la nueva forma

       public static ISpatialFilter CreateSpatialFilter(IFeatureClass fc, IGeometry shape)
    {
        if (fc == null) return null;
        ISpatialFilter sf = new SpatialFilterClass();
        sf.GeometryField = fc.ShapeFieldName;
        sf.Geometry = shape;
        sf.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
        return sf;
    }
    
  4. Búsqueda en la clase de entidad con el filtro.

        public static IFeatureCursor GetSelectedItemsByShape(IFeatureClass fc, ISpatialFilter filter)
    {
        try
        {
            if (filter == null) return null;
            if (fc == null) return null;
            IFeatureCursor fcursor = fc.Search(filter, true);
            return fcursor;
        }
        catch
        {
            return null;
        }
    }
    
  5. A continuación, si desea seleccionar las nuevas características:

        public static ISelectionSet CursorToSelectionSet(IFeatureLayer layer, IFeatureCursor cursor)
    {
    
        IFeatureSelection fSel = (IFeatureSelection)layer;
        if (cursor != null)
        {
            IFeature feat = cursor.NextFeature();
            while (feat != null)
            {
                fSel.Add(feat);
                feat = cursor.NextFeature();
            }
        }
        return fSel.SelectionSet;
    }
    

Buena Suerte

2voto

CodeSlave Puntos 7133

Te recomiendo que completar la Construcción de los complementos de ArcGIS Desktop a pie-a través de, a continuación, mirar algunos de los fragmentos de código que están disponibles en developoers.

A la dirección de su pregunta; primero es necesario aislar la geometría de la función que desea utilizar para hacer la selección, localizar y establecer el destino de clase de entidad, crear un filtro espacial establecer la característica inicial de la geometría y el uso de la distribución espacial característica para hacer la selección. Por último yo tendrá que llamar al método refresh del sorteo de la selección en el mapa.

Aquí está un ejemplo similar (VB.NET) yo uso para seleccionar las características de una capa específica en un evento OnMouseUp. En este caso en lugar de utilizar una función de la geometría para hacer la selección, el filtro espacial geometría de entrada se crea a partir de la ubicación del ratón punto (en el caso de un solo clic) o un rectángulo dibujado con el ratón en la pantalla. El procedimiento para la selección de características en una capa en particular sería similar en su caso - el uso de un filtro espacial del objeto.

Protected Overrides Sub OnMouseUp(ByVal arg As ESRI.ArcGIS.Desktop.AddIns.Tool.MouseEventArgs)
        On Error GoTo Trap
        Dim mxDoc As ESRI.ArcGIS.ArcMapUI.IMxDocument = My.ArcMap.Document
        If arg.Button = Windows.Forms.MouseButtons.Left Then

            Dim pEnv As ESRI.ArcGIS.Geometry.IEnvelope = New ESRI.ArcGIS.Geometry.Envelope

            'Dim pGeoFeatureLayer As ESRI.ArcGIS.Carto.IGeoFeatureLayer
            Dim pFeatureSelection As ESRI.ArcGIS.Carto.IFeatureSelection
            Dim pSpatialFilter As ESRI.ArcGIS.Geodatabase.ISpatialFilter = New ESRI.ArcGIS.Geodatabase.SpatialFilter
            Dim pLayer As ESRI.ArcGIS.Carto.ILayer = Nothing
            Dim pFeatureLayer As ESRI.ArcGIS.Carto.IFeatureLayer = Nothing
            Dim point As ESRI.ArcGIS.Geometry.IPoint = TryCast(m_focusMap.ScreenDisplay.DisplayTransformation.ToMapPoint(arg.X, arg.Y), ESRI.ArcGIS.Geometry.IPoint)
            Dim bFull As Boolean


            pLayer = mxDoc.SelectedLayer
            pFeatureLayer = pLayer
            If Not pFeatureLayer.Selectable Then pFeatureLayer.Selectable = True 'override default selectibility to true

            If (Not pLayer Is Nothing And TypeOf pLayer Is ESRI.ArcGIS.Carto.IGeoFeatureLayer) Or _
             (Not pLayer Is Nothing And TypeOf pLayer Is ESRI.ArcGIS.Carto.IAnnotationLayer) Then

                pFeatureSelection = pFeatureLayer

                If Not m_pFeedbackEnv Is Nothing Then
                    pEnv = TryCast(m_pFeedbackEnv.Stop(), ESRI.ArcGIS.Geometry.IEnvelope)

                    With pSpatialFilter
                        .GeometryField = pFeatureLayer.FeatureClass.ShapeFieldName
                        If (Not pEnv Is Nothing) And (pEnv.IsEmpty = False) Then
                            .Geometry = pEnv
                        Else
                            .Geometry = point
                        End If
                        .SpatialRel = 1
                    End With

                Else
                    With pSpatialFilter
                        .GeometryField = pFeatureLayer.FeatureClass.ShapeFieldName
                        .Geometry = point
                        .SpatialRel = 1
                    End With
                End If

                If Not arg.Shift Then
                    If pFeatureLayer.FeatureClass.FeatureCount(pSpatialFilter) > 0 Then
                        pFeatureSelection.SelectFeatures(TryCast(pSpatialFilter, ESRI.ArcGIS.Geodatabase.ISpatialFilter), 0, False)
                    Else
                        My.ArcMap.Document.FocusMap.ClearSelection()
                        ''bFull = True
                    End If

                Else
                    pFeatureSelection.SelectFeatures(TryCast(pSpatialFilter, ESRI.ArcGIS.Geodatabase.ISpatialFilter), 1, False)
                End If


                'Refresh the selections
                m_lineFeedback.Stop() 'stop line feedback
                m_lineFeedback = Nothing
                m_pFeedbackEnv = Nothing 'MUST CANCEL FEEDBACK BEFORE REFRES ELSE CRASH WILL OCCUR

                m_isMouseDown = False
                'm_focusMap.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeoSelection, mxDoc.SelectedLayer, mxDoc.ActiveView.Extent.Envelope)
                m_focusMap.Refresh()
                Else
                    'if Layer is not selected or not a golayer use default selection across all layers 
                    If m_pFeedbackEnv IsNot Nothing Then
                        pEnv = m_pFeedbackEnv.Stop()
                        If pEnv IsNot Nothing Then
                            With My.ArcMap.Document.FocusMap
                                .ClearSelection() 'clear previous selection before making new
                                .SelectByShape(pEnv, Nothing, False)
                            End With
                        End If
                    End If
                    m_lineFeedback.Stop() 'stop line feedback
                    m_lineFeedback = Nothing
                    m_pFeedbackEnv = Nothing
                    m_isMouseDown = False
                    'm_focusMap.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeoSelection, mxDoc.SelectedLayer, mxDoc.ActiveView.Extent.Envelope)
                    m_focusMap.Refresh()
                End If

        End If



        Exit Sub
Trap:

        'MsgBox(Err.Description)
        m_isMouseDown = False
        m_lineFeedback = Nothing
        m_pFeedbackEnv = Nothing
    End Sub

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