Пример #1
0
        private static void PackResultGeometries(
            [CanBeNull] IList <OverlapResultGeometries> resultsByFeature,
            [NotNull] ICollection <ResultGeometriesByFeature> intoResponseGeometriesByFeature)
        {
            if (resultsByFeature == null)
            {
                return;
            }

            foreach (OverlapResultGeometries resultByFeature in resultsByFeature)
            {
                var feature = resultByFeature.OriginalFeature;

                var resultGeometriesByFeature = new ResultGeometriesByFeature();

                // Original feature's geometry does not need to be transported back.
                resultGeometriesByFeature.OriginalFeatureRef =
                    ProtobufGdbUtils.ToGdbObjRefMsg(feature);

                resultGeometriesByFeature.UpdatedGeometry =
                    ProtobufGeometryUtils.ToShapeMsg(resultByFeature.LargestResult);

                foreach (var insertGeometry in resultByFeature.NonLargestResults)
                {
                    resultGeometriesByFeature.NewGeometries.Add(
                        ProtobufGeometryUtils.ToShapeMsg(insertGeometry));
                }

                foreach (IGeometry newOverlapFeature in resultByFeature.OverlappingGeometries)
                {
                    resultGeometriesByFeature.NewGeometries.Add(
                        ProtobufGeometryUtils.ToShapeMsg(
                            newOverlapFeature));
                }

                intoResponseGeometriesByFeature.Add(resultGeometriesByFeature);
            }
        }
Пример #2
0
        public void CanCalculateOverlaps()
        {
            var fClass =
                new GdbFeatureClass(123, "TestFC", esriGeometryType.esriGeometryPolygon);

            var sr = SpatialReferenceUtils.CreateSpatialReference(
                WellKnownHorizontalCS.LV95,
                WellKnownVerticalCS.LN02);

            fClass.SpatialReference = sr;

            IPolygon polygon1 = GeometryFactory.CreatePolygon(
                GeometryFactory.CreatePoint(2600000, 1200000, sr),
                GeometryFactory.CreatePoint(2601000, 1201000, sr));

            polygon1.SpatialReference = sr;

            GdbFeature sourceFeature = new GdbFeature(42, fClass)
            {
                Shape = polygon1
            };

            IPolygon polygon2 = GeometryFactory.CreatePolygon(
                GeometryFactory.CreatePoint(2600500, 1200500, sr),
                GeometryFactory.CreatePoint(2601500, 1201500, sr));

            polygon2.SpatialReference = sr;

            GdbFeature targetFeature = new GdbFeature(43, fClass)
            {
                Shape = polygon2
            };

            var sourceFeatureMsg = ProtobufGdbUtils.ToGdbObjectMsg(sourceFeature);
            var targetFeatureMsg = ProtobufGdbUtils.ToGdbObjectMsg(targetFeature);

            var objectClassMsg = ProtobufGdbUtils.ToObjectClassMsg(sourceFeature.Class);

            CalculateOverlapsRequest calculationRequest = new CalculateOverlapsRequest()
            {
                ClassDefinitions =
                {
                    objectClassMsg
                },
                SourceFeatures =
                {
                    sourceFeatureMsg
                },
                TargetFeatures =
                {
                    targetFeatureMsg
                }
            };

            CalculateOverlapsResponse response =
                RemoveOverlapsServiceUtils.CalculateOverlaps(calculationRequest, null);

            Assert.AreEqual(1, response.Overlaps.Count);

            List <ShapeMsg> shapeBufferList =
                response.Overlaps.SelectMany(kvp => kvp.Overlaps).ToList();

            List <IPolygon> resultPolys =
                ProtobufGeometryUtils.FromShapeMsgList <IPolygon>(shapeBufferList);

            Assert.AreEqual(1, resultPolys.Count);

            Assert.AreEqual(1000 * 1000 / 4, ((IArea)resultPolys[0]).Area);

            // Now the removal:
            RemoveOverlapsRequest removeRequest = new RemoveOverlapsRequest();

            removeRequest.ClassDefinitions.AddRange(calculationRequest.ClassDefinitions);
            removeRequest.SourceFeatures.AddRange(calculationRequest.SourceFeatures);
            removeRequest.Overlaps.Add(response.Overlaps);

            RemoveOverlapsResponse removeResponse =
                RemoveOverlapsServiceUtils.RemoveOverlaps(removeRequest);

            Assert.AreEqual(1, removeResponse.ResultsByFeature.Count);
            ResultGeometriesByFeature resultByFeature = removeResponse.ResultsByFeature[0];

            GdbObjectReference originalObjRef = new GdbObjectReference(
                resultByFeature.OriginalFeatureRef.ClassHandle,
                resultByFeature.OriginalFeatureRef.ObjectId);

            Assert.AreEqual(new GdbObjectReference(sourceFeature), originalObjRef);

            var updatedGeometry =
                ProtobufGeometryUtils.FromShapeMsg(resultByFeature.UpdatedGeometry);

            Assert.IsNotNull(updatedGeometry);
            Assert.AreEqual(1000 * 1000 * 3 / 4, ((IArea)updatedGeometry).Area);

            Assert.AreEqual(0, resultByFeature.NewGeometries.Count);
        }
Пример #3
0
        public void CanRemoveOverlaps()
        {
            var fClass =
                new GdbFeatureClass(123, "TestFC", esriGeometryType.esriGeometryPolygon);

            var sr = SpatialReferenceUtils.CreateSpatialReference(
                WellKnownHorizontalCS.LV95,
                WellKnownVerticalCS.LN02);

            IPolygon polygon1 = GeometryFactory.CreatePolygon(
                GeometryFactory.CreatePoint(2600000, 1200000, sr),
                GeometryFactory.CreatePoint(2601000, 1201000, sr));

            polygon1.SpatialReference = sr;

            GdbFeature sourceFeature = new GdbFeature(42, fClass)
            {
                Shape = polygon1
            };

            IPolygon polygon2 = GeometryFactory.CreatePolygon(
                GeometryFactory.CreatePoint(2600500, 1200500, sr),
                GeometryFactory.CreatePoint(2601500, 1201500, sr));

            polygon2.SpatialReference = sr;

            GdbFeature targetFeature = new GdbFeature(43, fClass)
            {
                Shape = polygon2
            };

            IPolygon overlap = GeometryFactory.CreatePolygon(
                GeometryFactory.CreatePoint(2600500, 1200500, sr),
                GeometryFactory.CreatePoint(2601000, 1201000, sr));

            overlap.SpatialReference = sr;

            var sourceFeatureMsg = ProtobufGdbUtils.ToGdbObjectMsg(sourceFeature);
            var targetFeatureMsg = ProtobufGdbUtils.ToGdbObjectMsg(targetFeature);

            var objectClassMsg = ProtobufGdbUtils.ToObjectClassMsg(sourceFeature.Class);

            var removeRequest = new RemoveOverlapsRequest()
            {
                ClassDefinitions =
                {
                    objectClassMsg
                },
                SourceFeatures =
                {
                    sourceFeatureMsg
                },
                UpdatableTargetFeatures =
                {
                    targetFeatureMsg
                }
            };

            var overlapsMsg = new OverlapMsg();

            overlapsMsg.OriginalFeatureRef = new GdbObjRefMsg()
            {
                ClassHandle = sourceFeatureMsg.ClassHandle,
                ObjectId    = sourceFeatureMsg.ObjectId
            };

            overlapsMsg.Overlaps.Add(ProtobufGeometryUtils.ToShapeMsg(overlap));

            removeRequest.Overlaps.Add(overlapsMsg);

            RemoveOverlapsResponse removeResponse =
                RemoveOverlapsServiceUtils.RemoveOverlaps(removeRequest);

            Assert.AreEqual(1, removeResponse.ResultsByFeature.Count);
            ResultGeometriesByFeature resultByFeature = removeResponse.ResultsByFeature[0];

            GdbObjectReference originalObjRef = new GdbObjectReference(
                resultByFeature.OriginalFeatureRef.ClassHandle,
                resultByFeature.OriginalFeatureRef.ObjectId);

            Assert.AreEqual(new GdbObjectReference(sourceFeature), originalObjRef);

            IGeometry updatedGeometry =
                ProtobufGeometryUtils.FromShapeMsg(resultByFeature.UpdatedGeometry);

            Assert.IsNotNull(updatedGeometry);
            Assert.AreEqual(1000 * 1000 * 3 / 4, ((IArea)updatedGeometry).Area);

            Assert.AreEqual(0, resultByFeature.NewGeometries.Count);

            IFeature updatedTarget =
                ProtobufConversionUtils.FromGdbObjectMsgList(removeResponse.TargetFeaturesToUpdate,
                                                             removeRequest.ClassDefinitions)
                .Single();

            int pointCount = GeometryUtils.GetPointCount(updatedTarget.Shape);

            Assert.AreEqual(5 + 2, pointCount);
        }
Пример #4
0
        private bool CutFeature([NotNull] IFeature feature,
                                [NotNull] IPolyline cutPolyline,
                                ChangeAlongZSource?zSource = null)
        {
            IGeometry selectedGeometry = feature.Shape;

            if (GeometryUtils.Disjoint(cutPolyline, selectedGeometry))
            {
                return(false);
            }

            if (FeatureToCutPredicate != null &&
                !FeatureToCutPredicate(selectedGeometry, cutPolyline))
            {
                return(false);
            }

            _msg.DebugFormat("Cutting feature {0}", GdbObjectUtils.ToString(feature));

            IGeometry geometryToCut = GeometryFactory.Clone(selectedGeometry);

            CutPolyline usedCutLine = null;

            if (ProcessedCutLines != null)
            {
                usedCutLine = new CutPolyline(feature.OID);
                ProcessedCutLines.Add(usedCutLine);
            }

            IList <IGeometry> resultGeometries;

            switch (geometryToCut.GeometryType)
            {
            case esriGeometryType.esriGeometryPolygon:
                resultGeometries = CutGeometryUtils.TryCut(
                    (IPolygon)geometryToCut, cutPolyline,
                    zSource ?? DetermineZSource(feature));
                break;

            case esriGeometryType.esriGeometryPolyline:
                resultGeometries =
                    _networkFeatureCutter?.IsNetworkEdge(feature) == true
                                                        ? GetNetworkSplitPoints(cutPolyline, geometryToCut)
                                                        : CutGeometryUtils.TryCut((IPolyline)geometryToCut, cutPolyline);

                break;

            case esriGeometryType.esriGeometryMultiPatch:
                resultGeometries =
                    CutGeometryUtils.TryCut((IMultiPatch)geometryToCut, cutPolyline,
                                            zSource ?? DetermineZSource(feature),
                                            usedCutLine, DegenerateMultipatchFootprintAction)
                    .Values.Cast <IGeometry>()
                    .ToList();
                break;

            default:
                throw new InvalidOperationException(
                          $"Unsupported geometry type: {geometryToCut.GeometryType}");
            }

            if (resultGeometries != null && resultGeometries.Count > 0)
            {
                IList <IGeometry> previousResults;
                if (ResultGeometriesByFeature.TryGetValue(feature, out previousResults))
                {
                    foreach (IGeometry resultGeometry in resultGeometries)
                    {
                        previousResults.Add(resultGeometry);
                    }
                }
                else
                {
                    ResultGeometriesByFeature.Add(feature, resultGeometries);
                }
            }

            return(resultGeometries != null && resultGeometries.Count > 0);
        }