我有C#ArcGis应用程序,里面我使用图形图层。 我想确定多边形内包含图层的图形。 这是正确/准确的方法吗?
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);
}
}
}
编辑 - 这不准确'它让我的图形接近多边形。有任何想法吗?我正在使用ESRI.ArcGIS.Client
答案 0 :(得分: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);
}
}
}
}
}
说明:GeometryService是一种服务,它具有各种方法,但需要一个指向我们正在处理的给定服务的URL。如果没有服务,则必须使用“InitializeWithLocalService”初始化它,以创建本地服务。 Intersect方法不返回相交的图形,它的作用是返回一个几何图形,表示它接收的2个参数之间的相交部分。因此,要检查某些内容是否相交,可以调用此方法并检查返回参数是否基本上不是上面代码中的“空”几何。 (返回的几何类型与在这种情况下发送到Intersect方法的第一个参数相同。)