private IEnumerable <Feature> StandardClipPoints(IEnumerable <Feature> masterFeatures, IEnumerable <Feature> clippingFeatures) { ConcurrentQueue <Feature> results = new ConcurrentQueue <Feature>(); int index = 1; int count = masterFeatures.Count(); ConcurrentQueue <Feature> cqMasterFeatures = new ConcurrentQueue <Feature>(masterFeatures); if (count > 0) { var firstFeature = masterFeatures.FirstOrDefault(); var firstWktType = firstFeature.GetWellKnownType(); if (firstWktType == WellKnownType.Point) { Parallel.ForEach(cqMasterFeatures, feature => { index++; isCanceled = ReportProgress(index, count); if (isCanceled) { return; } if (clippingFeatures.Any(f => { try //{ return f.GetShape().Intersects(feature); } { return(SqlTypesGeometryHelper.Intersects(f.GetShape(), feature)); } catch (Exception ex) { GisEditor.LoggerManager.Log(LoggerLevel.Debug, ex.Message, new ExceptionInfo(ex)); HandleExceptionFromInvalidFeature(feature.Id, ex.Message); return(false); } })) { results.Enqueue(feature); } }); } else { Parallel.ForEach(cqMasterFeatures, feature => { isCanceled = ReportProgress(index, count); if (isCanceled) { return; } index++; MultipointShape multiPoints = feature.GetShape() as MultipointShape; if (multiPoints != null) { MultipointShape resultPoints = new MultipointShape(); Parallel.ForEach(multiPoints.Points, p => { if (clippingFeatures.Any(f => { try //{ return f.GetShape().Intersects(p); } { return(SqlTypesGeometryHelper.Intersects(f.GetShape(), p)); } catch (Exception ex) { GisEditor.LoggerManager.Log(LoggerLevel.Debug, ex.Message, new ExceptionInfo(ex)); HandleExceptionFromInvalidFeature(feature.Id, ex.Message); return(false); } })) { resultPoints.Points.Add(p); } }); if (resultPoints.Points.Count > 0) { results.Enqueue(new Feature(resultPoints.GetWellKnownBinary(), feature.Id, feature.ColumnValues)); } } }); } } return(results); }
private IEnumerable <Feature> StandardClipPoints(IEnumerable <Feature> masterFeatures, IEnumerable <Feature> clippingFeatures, ShapeFileType shpFileType) { ConcurrentQueue <Feature> results = new ConcurrentQueue <Feature>(); int index = 1; int count = masterFeatures.Count(); ConcurrentQueue <Feature> cqMasterFeatures = new ConcurrentQueue <Feature>(masterFeatures); if (shpFileType == ShapeFileType.Point) { Parallel.ForEach(cqMasterFeatures, feature => { index++; ReportProgress(index * 100 / count); if (clippingFeatures.Any(f => { try { return(f.GetShape().Intersects(feature)); } catch (Exception ex) { HandleExceptionFromInvalidFeature(feature.Id, ex.Message); return(false); } })) { results.Enqueue(feature); } }); } else { Parallel.ForEach(cqMasterFeatures, feature => { ReportProgress(index * 100 / count); index++; MultipointShape multiPoints = feature.GetShape() as MultipointShape; if (multiPoints != null) { MultipointShape resultPoints = new MultipointShape(); Parallel.ForEach(multiPoints.Points, p => { if (clippingFeatures.Any(f => { try { return(f.GetShape().Intersects(p)); } catch (Exception ex) { HandleExceptionFromInvalidFeature(feature.Id, ex.Message); return(false); } })) { resultPoints.Points.Add(p); } }); if (resultPoints.Points.Count > 0) { results.Enqueue(new Feature(resultPoints.GetWellKnownBinary(), feature.Id, feature.ColumnValues)); } } }); } return(results); }