private async void OnGeoViewTapped(object sender, GeoViewInputEventArgs e) { try { IsBusy.Visibility = Visibility.Visible; Status.Text = "Identifying trace locations..."; // Identify the feature to be used. IEnumerable <IdentifyLayerResult> identifyResult = await MyMapView.IdentifyLayersAsync(e.Position, 10.0, false); ArcGISFeature feature = identifyResult?.FirstOrDefault()?.GeoElements?.FirstOrDefault() as ArcGISFeature; if (feature == null) { return; } // Create element from the identified feature. UtilityElement element = _utilityNetwork.CreateElement(feature); if (element.NetworkSource.SourceType == UtilityNetworkSourceType.Junction) { // Select terminal for junction feature. IEnumerable <UtilityTerminal> terminals = element.AssetType.TerminalConfiguration?.Terminals; if (terminals?.Count() > 1) { element.Terminal = await GetTerminalAsync(terminals); } Status.Text = $"Terminal: {element.Terminal?.Name ?? "default"}"; } else if (element.NetworkSource.SourceType == UtilityNetworkSourceType.Edge) { // Compute how far tapped location is along the edge feature. if (feature.Geometry is Polyline line) { line = GeometryEngine.RemoveZ(line) as Polyline; double fraction = GeometryEngine.FractionAlong(line, e.Location, -1); if (double.IsNaN(fraction)) { return; } element.FractionAlongEdge = fraction; Status.Text = $"Fraction along edge: {element.FractionAlongEdge}"; } } // Check whether starting location or barrier is added to update the right collection and symbology. Symbol symbol = null; if (IsAddingStartingLocations.IsChecked.Value == true) { _startingLocations.Add(element); symbol = _startingPointSymbol; } else { _barriers.Add(element); symbol = _barrierPointSymbol; } // Add a graphic for the new utility element. Graphic traceLocationGraphic = new Graphic(feature.Geometry as MapPoint ?? e.Location, symbol); MyMapView.GraphicsOverlays.FirstOrDefault()?.Graphics.Add(traceLocationGraphic); } catch (Exception ex) { Status.Text = "Identifying locations failed."; MessageBox.Show(ex.Message, ex.GetType().Name, MessageBoxButton.OK, MessageBoxImage.Error); } finally { if (Status.Text.Equals("Identifying trace locations...")) { Status.Text = "Could not identify location."; } IsBusy.Visibility = Visibility.Hidden; } }
private async void OnGeoViewTapped(object sender, GeoViewInputEventArgs e) { try { _activityIndicator.StartAnimating(); _statusLabel.Text = "Identifying trace locations..."; // Identify the feature to be used. IEnumerable <IdentifyLayerResult> identifyResult = await _myMapView.IdentifyLayersAsync(e.Position, 10.0, false); ArcGISFeature feature = identifyResult?.FirstOrDefault()?.GeoElements?.FirstOrDefault() as ArcGISFeature; if (feature == null) { return; } // Create element from the identified feature. UtilityElement element = _utilityNetwork.CreateElement(feature); if (element.NetworkSource.SourceType == UtilityNetworkSourceType.Junction) { // Select terminal for junction feature. IEnumerable <UtilityTerminal> terminals = element.AssetType.TerminalConfiguration?.Terminals; if (terminals?.Count() > 1) { element.Terminal = await WaitForTerminal(terminals); } _statusLabel.Text = $"Terminal: {element.Terminal?.Name ?? "default"}"; } else if (element.NetworkSource.SourceType == UtilityNetworkSourceType.Edge) { // Compute how far tapped location is along the edge feature. if (feature.Geometry is Polyline line) { line = GeometryEngine.RemoveZ(line) as Polyline; element.FractionAlongEdge = GeometryEngine.FractionAlong(line, e.Location, -1); _statusLabel.Text = $"Fraction along edge: {element.FractionAlongEdge}"; } } // Check whether starting location or barrier is added to update the right collection and symbology. Symbol symbol = null; if (_startBarrierPicker.SelectedSegment == 0) { _startingLocations.Add(element); symbol = _startingPointSymbol; } else { _barriers.Add(element); symbol = _barrierPointSymbol; } // Add a graphic for the new utility element. Graphic traceLocationGraphic = new Graphic(feature.Geometry as MapPoint ?? e.Location, symbol); _myMapView.GraphicsOverlays.FirstOrDefault()?.Graphics.Add(traceLocationGraphic); } catch (Exception ex) { _statusLabel.Text = "Identifying locations failed..."; new UIAlertView("Error", ex.Message, (IUIAlertViewDelegate)null, "OK", null).Show(); } finally { if (_statusLabel.Text.Equals("Identifying trace locations...")) { _statusLabel.Text = "Could not identify location."; } _activityIndicator.StopAnimating(); } }
private async void GeoViewTapped(object sender, GeoViewInputEventArgs e) { try { _progressBar.Visibility = Android.Views.ViewStates.Visible; _status.Text = "Identifying trace locations..."; // Identify the feature to be used. IEnumerable <IdentifyLayerResult> identifyResult = await _myMapView.IdentifyLayersAsync(e.Position, 10.0, false); // Check that a results from a layer were identified from the user input. if (!identifyResult.Any()) { return; } // Identify the selected feature. IdentifyLayerResult layerResult = identifyResult?.FirstOrDefault(); ArcGISFeature feature = layerResult?.GeoElements?.FirstOrDefault() as ArcGISFeature; // Check that a feature was identified from the layer. if (feature == null) { return; } // Create element with `terminal` for junction feature or with `fractionAlong` for edge feature. UtilityElement element = null; // Select default terminal or display possible terminals for the junction feature. UtilityNetworkSource networkSource = _utilityNetwork.Definition.GetNetworkSource(feature.FeatureTable.TableName); // Check if the network source is a junction or an edge. if (networkSource.SourceType == UtilityNetworkSourceType.Junction) { // Get the UtilityAssetGroup from the feature. string assetGroupFieldName = ((ArcGISFeatureTable)feature.FeatureTable).SubtypeField ?? "ASSETGROUP"; int assetGroupCode = Convert.ToInt32(feature.Attributes[assetGroupFieldName]); UtilityAssetGroup assetGroup = networkSource?.AssetGroups?.FirstOrDefault(g => g.Code == assetGroupCode); // Get the UtilityAssetType from the feature. int assetTypeCode = Convert.ToInt32(feature.Attributes["ASSETTYPE"]); UtilityAssetType assetType = assetGroup?.AssetTypes?.FirstOrDefault(t => t.Code == assetTypeCode); // Get the list of terminals for the feature. IEnumerable <UtilityTerminal> terminals = assetType?.TerminalConfiguration?.Terminals; // If there is more than one terminal, prompt the user to select a terminal. if (terminals.Count() > 1) { // Ask the user to choose the terminal. UtilityTerminal terminal = await WaitForTerminal(terminals); // Create a UtilityElement with the terminal. element = _utilityNetwork.CreateElement(feature, terminal); _status.Text = $"Terminal: {terminal?.Name ?? "default"}"; } else { element = _utilityNetwork.CreateElement(feature, terminals.FirstOrDefault()); _status.Text = $"Terminal: {element.Terminal?.Name ?? "default"}"; } } else if (networkSource.SourceType == UtilityNetworkSourceType.Edge) { element = _utilityNetwork.CreateElement(feature); // Compute how far tapped location is along the edge feature. if (feature.Geometry is Polyline line) { line = GeometryEngine.RemoveZ(line) as Polyline; // Set how far the element is along the edge. element.FractionAlongEdge = GeometryEngine.FractionAlong(line, e.Location, -1); _status.Text = $"Fraction along edge: {element.FractionAlongEdge}"; } } // Check that the element can be added to the parameters. if (element == null) { return; } // Build the utility trace parameters. if (_parameters == null) { IEnumerable <UtilityElement> startingLocations = Enumerable.Empty <UtilityElement>(); _parameters = new UtilityTraceParameters(UtilityTraceType.Connected, startingLocations); } if (isAddingStart) { _parameters.StartingLocations.Add(element); } else { _parameters.Barriers.Add(element); } // Add a graphic for the new utility element. Graphic traceLocationGraphic = new Graphic(feature.Geometry as MapPoint ?? e.Location, isAddingStart ? _startingPointSymbol : _barrierPointSymbol); _myMapView.GraphicsOverlays.FirstOrDefault()?.Graphics.Add(traceLocationGraphic); } catch (Exception ex) { _status.Text = "Identifying locations failed..."; CreateDialog(ex.Message); } finally { if (_status.Text.Equals("Identifying trace locations...")) { _status.Text = "Could not identify location."; } _progressBar.Visibility = Android.Views.ViewStates.Invisible; } }