private static CalculateOverlapsResponse CalculateOverlapsRpc(
            RemoveOverlapsGrpc.RemoveOverlapsGrpcClient rpcClient,
            IList <Feature> selectedFeatures,
            IList <Feature> overlappingFeatures,
            CancellationToken cancellationToken)
        {
            CalculateOverlapsRequest request =
                CreateCalculateOverlapsRequest(selectedFeatures, overlappingFeatures);

            CalculateOverlapsResponse response;

            try
            {
                response = rpcClient.CalculateOverlaps(request, null, null,
                                                       cancellationToken);
            }
            catch (Exception e)
            {
                _msg.Debug($"Error calling remote procedure: {e.Message} ", e);

                throw;
            }

            return(response);
        }
        private static CalculateOverlapsRequest CreateCalculateOverlapsRequest(
            [NotNull] IList <Feature> selectedFeatures,
            [NotNull] IList <Feature> overlappingFeatures)
        {
            var request = new CalculateOverlapsRequest();

            ProtobufConversionUtils.ToGdbObjectMsgList(selectedFeatures,
                                                       request.SourceFeatures,
                                                       request.ClassDefinitions);

            ProtobufConversionUtils.ToGdbObjectMsgList(overlappingFeatures,
                                                       request.TargetFeatures,
                                                       request.ClassDefinitions);

            return(request);
        }
Exemple #3
0
        public override async Task <CalculateOverlapsResponse> CalculateOverlaps(
            CalculateOverlapsRequest request, ServerCallContext context)
        {
            Stopwatch watch = _msg.DebugStartTiming();

            Func <ITrackCancel, CalculateOverlapsResponse> func =
                trackCancel => RemoveOverlapsServiceUtils.CalculateOverlaps(request, trackCancel);

            CalculateOverlapsResponse response =
                await GrpcServerUtils.ExecuteServiceCall(func, context, _staTaskScheduler, true) ??
                new CalculateOverlapsResponse();

            _msg.DebugStopTiming(watch, "Calculated overlaps for peer {0} ({1} source features)",
                                 context.Peer, request.SourceFeatures.Count);

            return(Assert.NotNull(response));
        }
        private static CalculateOverlapsResponse CalculateOverlapsRpc(
            RemoveOverlapsGrpc.RemoveOverlapsGrpcClient rpcClient,
            IList <Feature> selectedFeatures,
            IList <Feature> overlappingFeatures,
            CancellationToken cancellationToken)
        {
            CalculateOverlapsRequest request =
                CreateCalculateOverlapsRequest(selectedFeatures, overlappingFeatures);

            int maxTimePerFeature = 4000;

            CalculateOverlapsResponse response =
                RpcCallUtils.Try(
                    o => rpcClient.CalculateOverlaps(request, o),
                    cancellationToken, maxTimePerFeature * selectedFeatures.Count);

            return(response);
        }
Exemple #5
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);
        }
Exemple #6
0
        public static CalculateOverlapsResponse CalculateOverlaps(
            [NotNull] CalculateOverlapsRequest request,
            [CanBeNull] ITrackCancel trackCancel)
        {
            var watch = Stopwatch.StartNew();

            IList <IFeature> sourceFeatures =
                ProtobufConversionUtils.FromGdbObjectMsgList(
                    request.SourceFeatures, request.ClassDefinitions);

            IList <IFeature> targetFeatures =
                ProtobufConversionUtils.FromGdbObjectMsgList(
                    request.TargetFeatures, request.ClassDefinitions);

            _msg.DebugStopTiming(watch, "Unpacked feature lists from request params");

            Overlaps selectableOverlaps = RemoveOverlapsUtils.GetSelectableOverlaps(
                sourceFeatures, targetFeatures, trackCancel);

            watch = Stopwatch.StartNew();

            var result = new CalculateOverlapsResponse();

            foreach (var overlapByGdbRef
                     in selectableOverlaps.OverlapsBySourceRef)
            {
                var gdbObjRefMsg = ProtobufGdbUtils.ToGdbObjRefMsg(overlapByGdbRef.Key);

                var overlap = overlapByGdbRef.Value;

                var overlapsMsg = new OverlapMsg()
                {
                    OriginalFeatureRef = gdbObjRefMsg
                };

                foreach (IGeometry geometry in overlap)
                {
                    // TODO: At some point the SR-XY tol/res should be transferred separately (via class-lookup?)
                    var shapeFormat = ShapeMsg.FormatOneofCase.EsriShape;
                    var srFormat    = SpatialReferenceMsg.FormatOneofCase.SpatialReferenceEsriXml;

                    overlapsMsg.Overlaps.Add(
                        ProtobufGeometryUtils.ToShapeMsg(
                            geometry, shapeFormat, srFormat));

                    if (_msg.IsVerboseDebugEnabled)
                    {
                        _msg.VerboseDebug(
                            $"Calculated overlap: {GeometryUtils.ToString(geometry)}");
                    }
                }

                result.Overlaps.Add(overlapsMsg);
            }

            foreach (var notification in selectableOverlaps.Notifications)
            {
                result.Notifications.Add(notification.Message);
            }

            _msg.DebugStopTiming(watch, "Packed overlaps into response");

            return(result);
        }