Example #1
0
 public NotNearNeighborhoodFinder(
     [NotNull] IFeatureRowsDistance rowsDistance,
     [NotNull] IFeature feature, int tableIndex,
     [CanBeNull] IFeature neighbor, int neighborTableIndex)
     : base(rowsDistance, feature, tableIndex, neighbor, neighborTableIndex)
 {
 }
Example #2
0
 protected override NeighborhoodFinder GetNeighborhoodFinder(
     IFeatureRowsDistance rowsDistance, IFeature feature, int tableIndex,
     IFeature neighbor, int neighborTableIndex)
 {
     return(new NotNearNeighborhoodFinder(
                rowsDistance, feature, tableIndex, neighbor, neighborTableIndex));
 }
        protected override int ExecuteCore(IRow row, int tableIndex)
        {
            if (tableIndex > 0)
            {
                return(NoError);
            }

            if (_filter == null)
            {
                InitFilter();
            }

            ISpatialFilter filter = Assert.NotNull(_filter, "_filter");

            var processed0 = new SegmentNeighbors(new SegmentPartComparer());

            IGeometry geom0 = ((IFeature)row).Shape;
            IEnvelope box0  = geom0.Envelope;

            box0.Expand(SearchDistance, SearchDistance, false);

            filter.Geometry = box0;

            var errorCount = 0;

            double    maxNear            = SearchDistance;
            const int neighborTableIndex = 1;

            IFeatureRowsDistance rowsDistance =
                NearDistanceProvider.GetRowsDistance(row, tableIndex);

            foreach (IRow neighborRow in
                     Search((ITable)_reference, filter, _helper, geom0))
            {
                var rowNeighbor = (IFeature)neighborRow;

                if (IgnoreNeighbor(row, neighborRow))
                {
                    continue;
                }

                SegmentNeighbors processed1;
                var neighborKey = new RowKey(rowNeighbor, neighborTableIndex);
                if (!ProcessedList.TryGetValue(neighborKey, out processed1))
                {
                    processed1 = new SegmentNeighbors(new SegmentPartComparer());
                    ProcessedList.Add(neighborKey, processed1);
                }

                NeighborhoodFinder finder =
                    GetNeighborhoodFinder(rowsDistance, (IFeature)row, tableIndex,
                                          rowNeighbor, neighborTableIndex);
                errorCount += FindNeighborhood(finder, tableIndex, processed0,
                                               neighborTableIndex, processed1,
                                               maxNear);
            }

            return(errorCount);
        }
Example #4
0
 protected override NeighborhoodFinder GetNeighborhoodFinder(
     IFeatureRowsDistance rowsDistance, IFeature feature, int tableIndex,
     IFeature neighbor, int neighborTableIndex)
 {
     return(new NearNeighborhoodFinder(
                rowsDistance, feature, tableIndex, neighbor, neighborTableIndex, _coincidentParts,
                _coincidenceTolerance,
                _coincidenceToleranceSquared, Is3D));
 }
Example #5
0
 public NearNeighborhoodFinder(
     [NotNull] IFeatureRowsDistance rowsDistance,
     [NotNull] IFeature feature, int tableIndex,
     [CanBeNull] IFeature neighbor, int neighborTableIndex,
     SegmentNeighbors coincidentParts,
     double coincidenceTolerance,
     double coincidenceToleranceSquared, bool is3D)
     : base(rowsDistance, feature, tableIndex, neighbor, neighborTableIndex)
 {
     _coincidentParts             = coincidentParts;
     _coincidenceTolerance        = coincidenceTolerance;
     _coincidenceToleranceSquared = coincidenceToleranceSquared;
     _is3D = is3D;
 }
Example #6
0
            private void RecalcNeighbor([NotNull] SegmentPartWithNeighbor neighbor,
                                        [NotNull] SegmentPartWithNeighbor part,
                                        [NotNull] SegmentPair hulls)
            {
                IFeatureRowsDistance rowsDistance =
                    NearDistanceProvider.GetRowsDistance(part.NeighborFeature,
                                                         part.NeighborTableIndex);

                SegmentHull neighborhull = CreateSegmentHull(
                    (SegmentProxy)part.NeighborProxy, rowsDistance,
                    hulls.Neighbor.StartCap, hulls.Neighbor.EndCap);

                SegmentHull hull = CreateNeighborSegmentHull(
                    (SegmentProxy)Assert.NotNull(part.SegmentProxy, "segmentproxy is null"),
                    rowsDistance, neighbor.NeighborFeature,          // == part.Feature
                    neighbor.NeighborTableIndex,                     // == part.TableIndex
                    hulls.Hull.StartCap, hulls.Hull.EndCap);

                RecalcPart(neighbor, neighborhull, hull);
            }
Example #7
0
        protected override int ExecuteCore(IRow row, int tableIndex)
        {
            if (tableIndex != 0)
            {
                return(NoError);
            }

            if (_spatialFilters == null)
            {
                InitFilter();
            }

            IList <ISpatialFilter> filters = Assert.NotNull(_spatialFilters);

            // iterating over all needed tables
            int neighborTableIndex = -1;

            IGeometry geom0 = ((IFeature)row).Shape;

            geom0.QueryEnvelope(_queryBox);

            SegmentNeighbors processed0;
            var rowKey = new RowKey(row, tableIndex);

            if (!ProcessedList.TryGetValue(rowKey, out processed0))
            {
                // add to process List
                processed0 = new SegmentNeighbors(new SegmentPartComparer());
                ProcessedList.Add(rowKey, processed0);
            }

            _queryBox.Expand(SearchDistance, SearchDistance, false);
            double maxNear = SearchDistance;

            IFeatureRowsDistance rowsDistance =
                NearDistanceProvider.GetRowsDistance(row, tableIndex);

            foreach (IFeatureClass neighborFeatureClass in _referenceList)
            {
                neighborTableIndex++;

                ISpatialFilter spatialFilter = filters[neighborTableIndex];
                spatialFilter.Geometry = _queryBox;

                var neighborTable = (ITable)neighborFeatureClass;

                foreach (IRow neighborRow in
                         Search(neighborTable, spatialFilter, _helperList[neighborTableIndex], geom0))
                {
                    if (IgnoreNeighbor(row, neighborRow, neighborTableIndex))
                    {
                        continue;
                    }

                    var neighborFeature = (IFeature)neighborRow;
                    var processed1      = new SegmentNeighbors(new SegmentPartComparer());

                    var finder = new FullNeighborhoodFinder(
                        rowsDistance, (IFeature)row, tableIndex, neighborFeature,
                        neighborTableIndex);
                    FindNeighborhood(finder, tableIndex, processed0,
                                     neighborTableIndex, processed1,
                                     maxNear);
                }
            }

            // Remark: here only the neighborhood properties are found
            // if these properties are correct is checked in OnProgressedChanged
            return(NoError);
        }
Example #8
0
        protected override int ExecuteCore(IRow row, int tableIndex)
        {
            if (tableIndex > 0)
            {
                return(NoError);
            }

            var feature = row as IFeature;

            if (feature == null)
            {
                return(NoError);
            }

            if (_filter == null)
            {
                InitFilter();
                Assert.NotNull(_filter, "_filter");
            }

            var processed0 = new SegmentNeighbors(new SegmentPartComparer());

            IGeometry geom0 = feature.Shape;
            IEnvelope box0  = geom0.Envelope;

            const bool asRatio = false;

            box0.Expand(SearchDistance, SearchDistance, asRatio);

            ISpatialFilter filter = Assert.NotNull(_filter);

            filter.Geometry = box0;

            var errorCount = 0;

            double               maxNear             = SearchDistance;
            const int            referenceTableIndex = 0;
            IFeatureRowsDistance rowsDistance        =
                NearDistanceProvider.GetRowsDistance(feature, tableIndex);

            foreach (IRow neighborRow in Search((ITable)_reference, filter, _helper, geom0))
            {
                var neighborFeature = (IFeature)neighborRow;

                if (neighborFeature == feature)
                {
                    continue;
                }

                // TODO apply comparison condition to filter out irrelevant pairs
                if (IgnoreNeighbor(row, neighborRow))
                {
                    continue;
                }

                SegmentNeighbors processed1;
                var neighborKey = new RowKey(neighborFeature, referenceTableIndex);
                if (!ProcessedList.TryGetValue(neighborKey, out processed1))
                {
                    processed1 = new SegmentNeighbors(new SegmentPartComparer());

                    ProcessedList.Add(neighborKey, processed1);
                }

                NeighborhoodFinder finder = new NotNearNeighborhoodFinder(
                    rowsDistance, feature, tableIndex, neighborFeature, referenceTableIndex);

                errorCount += FindNeighborhood(finder, tableIndex, processed0,
                                               referenceTableIndex, processed1,
                                               maxNear);
            }

            return(errorCount);
        }
Example #9
0
            private Dictionary <FeaturePoint, SegmentInfo> GetFlatEnds(
                [NotNull] Dictionary <FeaturePoint, List <NeighboredSegmentsSubpart> > splittedParts,
                [NotNull] ContinuationFinder continuationFinder, out int errorCount)
            {
                errorCount = 0;
                var flatEnds =
                    new Dictionary <FeaturePoint, SegmentInfo>(new FeaturePointComparer());

                foreach (
                    KeyValuePair <FeaturePoint, List <NeighboredSegmentsSubpart> > splitted in
                    splittedParts)
                {
                    foreach (NeighboredSegmentsSubpart segmentsSubpart in splitted.Value)
                    {
                        foreach (
                            KeyValuePair <SegmentPart, SegmentParts> neighboredSegmentPart in
                            segmentsSubpart.SegmentNeighbors)
                        {
                            SegmentPart key = neighboredSegmentPart.Key;
                            if (key.SegmentIndex > 0 &&
                                key.SegmentIndex < segmentsSubpart.FullMaxFraction - 1)
                            {
                                continue;
                            }

                            var flatStart = false;
                            var flatEnd   = false;
                            foreach (SegmentPart segmentPart in neighboredSegmentPart.Value)
                            {
                                if (!flatStart && segmentPart.FullMin <= 0)
                                {
                                    flatStart = HandleAsFlat(segmentsSubpart, segmentPart.FullMin,
                                                             continuationFinder);
                                }

                                if (!flatEnd && segmentPart.FullMax >=
                                    segmentsSubpart.FullMaxFraction)
                                {
                                    flatEnd = HandleAsFlat(segmentsSubpart, segmentPart.FullMax,
                                                           continuationFinder);
                                }
                            }

                            if (flatStart || flatEnd)
                            {
                                IFeatureRowsDistance rowsDistance =
                                    NearDistanceProvider.GetRowsDistance(splitted.Key.Feature,
                                                                         splitted.Key.TableIndex);
                                double rowDistance = rowsDistance.GetRowDistance();

                                if (flatStart)
                                {
                                    errorCount += CreateFlatEnds(
                                        segmentsSubpart, rowDistance, flatEnds, continuationFinder,
                                        atStart: true);
                                }

                                if (flatEnd)
                                {
                                    errorCount += CreateFlatEnds(
                                        segmentsSubpart, rowDistance, flatEnds, continuationFinder,
                                        atStart: false);
                                }

                                if (flatStart && flatEnd)
                                {
                                    double sumLength = 0;
                                    double limit     = 2 * rowDistance;
                                    foreach (SegmentProxy segmentProxy in segmentsSubpart
                                             .GetSegments())
                                    {
                                        sumLength += segmentProxy.Length;
                                        if (sumLength > limit)
                                        {
                                            break;
                                        }
                                    }

                                    if (sumLength < limit && ReportShortSubpartError != null)
                                    {
                                        errorCount += ReportShortSubpartError(
                                            new ShortSubpartError(
                                                segmentsSubpart, sumLength, limit));
                                    }
                                }
                            }
                        }
                    }
                }

                return(flatEnds);
            }
Example #10
0
            private SegmentPair RecalcFlatEnd(
                [NotNull] FeaturePoint end,
                [NotNull] SegmentPartWithNeighbor segWithNb,
                [NotNull] Dictionary <FeaturePoint, SegmentInfo> flatEnds,
                out bool neighborIsFlatEnd)
            {
                IFeatureRowsDistance rowsDistance =
                    NearDistanceProvider.GetRowsDistance(end.Feature, end.TableIndex);

                SegmentInfo segmentInfo;

                Find(end, segWithNb.SegmentIndex, flatEnds, out segmentInfo);

                SegmentCap startCap = segmentInfo.FlatStart
                                                              ? (SegmentCap) new RectCap(0)
                                                              : new RoundCap();

                SegmentCap endCap = segmentInfo.FlatEnd
                                                            ? (SegmentCap) new RectCap(0)
                                                            : new RoundCap();

                SegmentHull hull = CreateSegmentHull(
                    (SegmentProxy)Assert.NotNull(segWithNb.SegmentProxy, "segmentproxy is null"),
                    rowsDistance, startCap, endCap);

                var neighborKey = new FeaturePoint(segWithNb.NeighborFeature,
                                                   segWithNb.NeighborTableIndex,
                                                   segWithNb.PartIndex, 0);

                neighborIsFlatEnd = false;

                SegmentInfo neighborInfo;

                SegmentCap nbStartCap;
                SegmentCap nbEndCap;

                if (Find(neighborKey, segWithNb.NeighborProxy.SegmentIndex, flatEnds,
                         out neighborInfo))
                {
                    neighborIsFlatEnd = true;

                    nbStartCap = neighborInfo.FlatStart
                                                             ? (SegmentCap) new RectCap(0)
                                                             : new RoundCap();
                    nbEndCap = neighborInfo.FlatEnd
                                                           ? (SegmentCap) new RectCap(0)
                                                           : new RoundCap();
                }
                else
                {
                    nbStartCap = new RoundCap();
                    nbEndCap   = new RoundCap();
                }

                SegmentHull neighborhull = CreateNeighborSegmentHull(
                    (SegmentProxy)segWithNb.NeighborProxy, rowsDistance, segWithNb.NeighborFeature,
                    segWithNb.NeighborTableIndex, nbStartCap, nbEndCap);

                SegmentPair segPair = RecalcPart(segWithNb, hull, neighborhull);

                return(segPair);
            }