public static Overlaps CalculateOverlaps( RemoveOverlapsGrpc.RemoveOverlapsGrpcClient rpcClient, [NotNull] IList <Feature> selectedFeatures, [NotNull] IList <Feature> overlappingFeatures, CancellationToken cancellationToken) { CalculateOverlapsResponse response = CalculateOverlapsRpc(rpcClient, selectedFeatures, overlappingFeatures, cancellationToken); if (response == null || cancellationToken.IsCancellationRequested) { return(null); } var result = new Overlaps(); foreach (OverlapMsg overlapMsg in response.Overlaps) { GdbObjectReference gdbObjRef = new GdbObjectReference( overlapMsg.OriginalFeatureRef.ClassHandle, overlapMsg.OriginalFeatureRef.ObjectId); List <Geometry> overlapGeometries = ProtobufConversionUtils.FromShapeMsgList(overlapMsg.Overlaps); result.AddGeometries(gdbObjRef, overlapGeometries); } result.Notifications.AddRange( response.Notifications.Select(n => new Notification(n))); return(result); }
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); }
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); }
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); }