2016-03-20 5 views
1

Ich habe C# ArcGis-Anwendung, und innerhalb ich Grafikebenen verwenden. Ich möchte entscheiden, welche Grafiken der Ebene in einem Polygon enthalten sind. Ist dies der richtige/genaue Weg?Ist dies ein genauer Weg, um zu entscheiden, ob eine Geometrie in einer anderen enthalten ist?

var identifiedGraphics = new List<Graphic>(); 
var polygonExtent = (drawnGeometry as Polygon).Extent; 

if (layer.Graphics != null) 
{ 
    foreach (var graphic in layer.Graphics) 
    { 
     if (polygonExtent.Intersects(graphic.Geometry.Extent)) 
     { 
      identifiedGraphics.Add(graphic); 
     } 
    } 
} 

bearbeiten - Das ist nicht richtig‘es wird mir die Grafik, die auf das Polygon schließen sind. Irgendwelche Ideen? Ich verwende ESRI.ArcGIS.Client

Antwort

1
var graphicsToReturn = new List<Graphic>(); 
var geometryService = new GeometryService(); 
geometryService.InitializeWithLocalService(); 

foreach (var currentGraphic in layer.Graphics) 
{ 
    var intersectSection = geometryService.Intersect(new List<Graphic> { currentGraphic }, polygonGeometry); 

    if (intersectSection != null) 
    { 
     foreach (var intersectionGraphic in intersectSection) 
     { 
       if (intersectionGraphic != null) 
       { 
        var polygon = intersectionGraphic.Geometry as Polygon; 
        var point = intersectionGraphic.Geometry as MapPoint; 
        var line = intersectionGraphic.Geometry as Polyline; 

        if (polygon != null && polygon.Rings.Count > 0) 
        { 
        graphicsToReturn.Add(currentGraphic); 
        } 
        else if (point != null && !double.IsNaN(point.X) && !double.IsNaN(point.Y)) 
        {          
        graphicsToReturn.Add(currentGraphic); 
        } 
        else if (line != null && line.Paths.Count > 0) 
        { 
        graphicsToReturn.Add(currentGraphic); 
        } 
       } 
      } 
     } 
} 

Erläuterung: Der GeometryService ein Dienst ist, der alle Arten von Methoden hat aber braucht eine URL zu dem gewünschten Dienst arbeiten wir an. Wenn kein Dienst vorhanden ist, muss er mit "InitializeWithLocalService" initialisiert werden, wodurch ein lokaler Dienst erstellt wird. Die Intersect-Methode gibt die durchschnittenen Grafiken NICHT zurück. Sie gibt eine Geometrie zurück, die den Schnittpunkt zwischen den beiden Parametern darstellt. Um also zu überprüfen, ob sich etwas überschneidet, können Sie diese Methode aufrufen und überprüfen, ob der Rückgabe-Parameter nicht wie im obigen Code eine "leere" Geometrie ist. (Der Typ der zurückgegebenen Geometrie stimmt mit dem ersten Parameter überein, der in diesem Fall an die Intersect-Methode gesendet wird.)