1 votos

spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin; no funciona

Tengo la tarea de obtener el área total de todas las características poligonales dentro de un límite. Así que obtuve la envoltura del límite e hice una consulta espacial para obtener las características dentro de ese elemento

pero mi problema es que soy capaz de conseguir los elementos que se superponen a la envolvente pero no exactamente dentro de ella.. mi código es el siguiente

IMxDocument mxDoc = (IMxDocument)GetMxDocumentFromArcMap(m_application);
        IEnvelope gridEnvelope = GetGridExtents("Z29");
        IFeatureClass featureClass = GetFeatureClassFromShapefileOnDisk("D:\\Projects\\Working\\BMRDA\\data", "Hoskote_Satellite_Polygon");

        // Create the spatial filter and set its spatial constraints.
        ISpatialFilter spatialFilter = new SpatialFilterClass();
        spatialFilter.Geometry = gridEnvelope.Envelope;
        spatialFilter.GeometryField = featureClass.ShapeFieldName;
        spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin;
        spatialFilter.set_OutputSpatialReference(featureClass.ShapeFieldName, mxDoc.FocusMap.SpatialReference);

        // Set the attribute constraints and subfields.
        // We want to exclude ramps, highways and interstates.
        spatialFilter.WhereClause = "LEVEL3 = 'AGRICULTURE LAND'";

        // Execute the query.
        IFeatureCursor featureCursor = featureClass.Search(spatialFilter, true);
        ESRI.ArcGIS.Geodatabase.IFeature feature;  // Automatically initialized to null. Used to test existence of a feature in the featureCursor
        double dbArea = 0.0;
        int intCount = 0;
        while ((feature = featureCursor.NextFeature()) != null)
        {
            IArea area = (IArea)feature.Shape;
            dbArea = dbArea + area.Area;
            intCount++;
        }    

el spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin; no funciona me devuelve null quiero que el polígono sea recortado y obtener el área del mismo ¿Se me escapa algo? Por favor, guíenme

1voto

tgmdbm Puntos 1115

Si quiere el área de la parte que está dentro de la envolvente, tiene que consultar con esriSpatialRelOverlaps o esriSpatialRelInstersects y realizar una operación de recorte en todas las geometrías devueltas utilizando ITopologicalOperator.Clip contra la envolvente. Si utiliza otra geometría que no sea una envolvente para recortar, deberá utilizar ITopologicalOperator.Intersect.

Como siempre al realizar operaciones geométricas debes asegurarte de que ambas geometrías tienen la misma referencia espacial.

0voto

Jon Galloway Puntos 28243

Within sólo le dará resultados que estén completamente dentro de su polígono. Si tiene un polígono que está medio dentro medio fuera, será excluido del resultado. Utilice en su lugar intersecciones.

Como se ha señalado anteriormente, se trata de una operación de dos pasos.

Es algo así, en pseudocódigo:

  1. Crea un filtro espacial;
  2. Obtenga la geometría que filtrará los resultados y utilícela en el filtro espacial;
  3. para cada resultado en el cursor do:
  4. comprueba si la geometría está dentro de su geometría original. Esto es sencillo utilizando la interfaz IRelationalOperator.
    1. si está dentro, suma su área al total;
    2. si no está dentro, recorta la geometría con tu geom de consulta y añade ese resultado a tu suma total

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