protected override async void OnMouseUp(System.Windows.Input.MouseButtonEventArgs e) { if (e.ButtonState == MouseButtonState.Released) { if (e.ChangedButton == System.Windows.Input.MouseButton.Left) { e.Handled = true; POINT clickPOINT; GetCursorPos(out clickPOINT); MapPoint clickMapPoint = await MappingModule.ActiveMapView.ScreenToLocationAsync(new System.Windows.Point(clickPOINT.X, clickPOINT.Y)); Envelope ext = await MappingModule.ActiveMapView.GetExtentAsync(); double searchDistance = 0.0; await QueuingTaskFactory.StartNew(() => { searchDistance = ext.Width / 2.0; }); var targetLayer = MappingModule.ActiveTOC.SelectedLayers.OfType <FeatureLayer>().First(); ArcGIS.Core.Geometry.GeometryEngine.ProximityResult clickResult = await ComputeDistanceToGeometryAsync(clickMapPoint, targetLayer, 1, searchDistance); var templateGroupLayer = MappingModule.ActiveMapView.Map.GetFlattenedLayers().OfType <GroupLayer>().Where(lyr => lyr.Name.Equals("Bright Map Notes")).First(); var flashLayer = templateGroupLayer.GetFlattenedLayers().OfType <FeatureLayer>().Where(lyr => lyr.Name.Equals("Bright - Point Notes")).First(); if (clickResult != null) { await flashLayer.AddAndFlashGeometryAsync(clickResult.Point); } } base.OnMouseUp(e); } }
private async Task <ArcGIS.Core.Geometry.GeometryEngine.ProximityResult> ComputeDistanceToGeometryAsync(MapPoint clickPoint, FeatureLayer targetLayer, int hitNumber, double searchDistance) { FeatureClass featureClass = await targetLayer.GetTableAsync() as FeatureClass; Geometry searchBuffer = null; List <Geometry> geometryList = new List <Geometry>(); double closestDistance = double.MaxValue; ArcGIS.Core.Geometry.GeometryEngine.ProximityResult clickResult = null; MapPoint closestPoint = null; bool foundFeatureAndComputedDistance = false; await QueuingTaskFactory.StartNew(() => { var classDefinition = featureClass.Definition as FeatureClassDefinition; searchBuffer = GeometryEngine.Project(GeometryEngine.Buffer(clickPoint, searchDistance), classDefinition.SpatialReference); SpatialQueryFilter spatialFilter = new SpatialQueryFilter() { FilterGeometry = searchBuffer, SpatialRelationship = SpatialRelationship.EnvelopeIntersects }; RowCursor featureCursor = featureClass.Search(spatialFilter, false); while (featureCursor.MoveNext()) { var feature = featureCursor.Current as Feature; geometryList.Add(feature.Shape); } clickPoint = GeometryEngine.Project(clickPoint, classDefinition.SpatialReference) as MapPoint; foreach (var geometry in geometryList) { var geoResult = GeometryEngine.NearestBoundaryPoint(geometry, clickPoint, searchDistance); if (geoResult.Distance < closestDistance) { closestDistance = geoResult.Distance; clickResult = geoResult; foundFeatureAndComputedDistance = true; } } }); if (foundFeatureAndComputedDistance) { DockPane dockPane = FrameworkApplication.FindDockPane("GeometrySamples_ClosestGeometryPane"); if (dockPane == null) { return(new ArcGIS.Core.Geometry.GeometryEngine.ProximityResult()); } DistancePaneViewModel cgVM = dockPane as DistancePaneViewModel; cgVM.DistanceDisplayUnit = _linearDisplayUnit; cgVM.ClickResult = clickResult; } return(clickResult); }