private void ChangeExtrusionExpression() { // Get the first layer from the scene view's operation layers, it should be a feature layer. FeatureLayer censusFeatureLayer = (FeatureLayer)_mySceneView.Scene.OperationalLayers[0]; // Get the renderer from the feature layer. Renderer censusRenderer = censusFeatureLayer.Renderer; // Get the scene properties from the feature layer's renderer. RendererSceneProperties sceneProperties = censusRenderer.SceneProperties; // Toggle the feature layer's scene properties renderer extrusion expression and change the button text. if (_toggleExtrusionButton.Title(UIControlState.Normal) == "Show population density") { // An offset of 100000 is added to ensure that polygons for large areas (like Alaska) // with low populations will be extruded above the curvature of the Earth. sceneProperties.ExtrusionExpression = "[POP07_SQMI] * 5000 + 100000"; _toggleExtrusionButton.SetTitle("Show total population", UIControlState.Normal); } else if (_toggleExtrusionButton.Title(UIControlState.Normal) == "Show total population") { sceneProperties.ExtrusionExpression = "[POP2007] / 10"; _toggleExtrusionButton.SetTitle("Show population density", UIControlState.Normal); } }
private void ChangeExtrusionExpression() { // Get the first layer from the scene view's operation layers, it should be a feature layer FeatureLayer myFeatureLayer = (FeatureLayer)_mySceneView.Scene.OperationalLayers[0]; // Get the renderer from the feature layer Renderer myRenderer = myFeatureLayer.Renderer; // Get the scene properties from the feature layer's renderer RendererSceneProperties myRendererSceneProperties = myRenderer.SceneProperties; // Toggle the feature layer's scene properties renderer extrusion expression and change the button text if (_button_ToggleExtrusionData.Text == "Show population density") { // An offset of 100000 is added to ensure that polygons for large areas (like Alaska) // with low populations will be extruded above the curvature of the Earth. myRendererSceneProperties.ExtrusionExpression = "[POP07_SQMI] * 5000 + 100000"; _button_ToggleExtrusionData.Text = "Show total population"; } else if (_button_ToggleExtrusionData.Text == "Show total population") { myRendererSceneProperties.ExtrusionExpression = "[POP2007] / 10"; _button_ToggleExtrusionData.Text = "Show population density"; } }
private async void Initialize() { try { // Define the Uri for the service feature table (US state polygons) Uri serviceFeatureTableUri = new Uri("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3"); // Create a new service feature table from the Uri ServiceFeatureTable censusTable = new ServiceFeatureTable(serviceFeatureTableUri); // Create a new feature layer from the service feature table FeatureLayer censusLayer = new FeatureLayer(censusTable) { // Set the rendering mode of the feature layer to be dynamic (needed for extrusion to work) RenderingMode = FeatureRenderingMode.Dynamic }; // Create a new simple line symbol for the feature layer SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Black, 1); // Create a new simple fill symbol for the feature layer SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, Color.Blue, lineSymbol); // Create a new simple renderer for the feature layer SimpleRenderer layerRenderer = new SimpleRenderer(fillSymbol); // Get the scene properties from the simple renderer RendererSceneProperties sceneProperties = layerRenderer.SceneProperties; // Set the extrusion mode for the scene properties sceneProperties.ExtrusionMode = ExtrusionMode.AbsoluteHeight; // Set the initial extrusion expression sceneProperties.ExtrusionExpression = "[POP2007] / 10"; // Set the feature layer's renderer to the define simple renderer censusLayer.Renderer = layerRenderer; // Create a new scene with the topographic backdrop Scene myScene = new Scene(BasemapType.Topographic); // Set the scene view's scene to the newly create one MySceneView.Scene = myScene; // Add the feature layer to the scene's operational layer collection myScene.OperationalLayers.Add(censusLayer); // Create a new map point to define where to look on the scene view MapPoint myMapPoint = new MapPoint(-10974490, 4814376, 0, SpatialReferences.WebMercator); // Set the scene view's camera controller to the orbit location camera controller MySceneView.CameraController = new OrbitLocationCameraController(myMapPoint, 20000000); } catch (Exception ex) { // Something went wrong, display the error var message = new MessageDialog(ex.ToString(), "Error"); await message.ShowAsync(); } }
private async void InitializeScene() { try { //var webSceneUrl = new Uri("https://geoinfo-support.maps.arcgis.com/home/webscene/viewer.html?webscene=47435c44d2d8483d9489218eac5329dd"); Uri serviceFeatureTable_Uri = new Uri("https://services.arcgis.com/LeHsdRPbeEIElrVR/arcgis/rest/services/globalSceneTrainees_WFL1/FeatureServer/1"); ServiceFeatureTable featureTable = new ServiceFeatureTable(serviceFeatureTable_Uri); FeatureLayer featureLayer = new FeatureLayer(featureTable) { RenderingMode = FeatureRenderingMode.Dynamic }; SimpleLineSymbol mySimpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Colors.Black, 1); SimpleFillSymbol mysimpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, Colors.Blue, mySimpleLineSymbol); SimpleRenderer mySimpleRenderer = new SimpleRenderer(mysimpleFillSymbol); var scene = new Scene(Basemap.CreateTopographic()); //scene = new Scene(Basemap.CreateTopographic()); scene.BaseSurface.BackgroundGrid.IsVisible = false; //scene.BaseSurface.ElevationSources.Add(new ArcGISTiledElevationSource(new Uri("https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"))); scene.BaseSurface.NavigationConstraint = NavigationConstraint.None; RendererSceneProperties myRendererSceneProperties = mySimpleRenderer.SceneProperties; myRendererSceneProperties.ExtrusionMode = ExtrusionMode.AbsoluteHeight; myRendererSceneProperties.ExtrusionExpression = "[height]"; featureLayer.Renderer = mySimpleRenderer; scene.OperationalLayers.Add(featureLayer); await scene.LoadAsync(); arSceneView.Scene = scene; double widthScene = 1300; double widthReal = 1; arSceneView.TranslationFactor = widthScene / widthReal; //scene.OperationalLayers.Add(layer); arSceneView.ClippingDistance = 800; arSceneView.SetInitialTransformation(TransformationMatrix.Create(0, 0, 0, 1, 0, .5, 1.5)); } catch (System.Exception ex) { await DisplayAlert("Failed to load scene", ex.Message, "OK"); await Navigation.PopAsync(); } }
private void ChangeExtrusionExpression() { // Get the first layer from the scene view's operation layers, it should be a feature layer FeatureLayer myFeatureLayer = (FeatureLayer)_mySceneView.Scene.OperationalLayers[0]; // Get the renderer from the feature layer Renderer myRenderer = myFeatureLayer.Renderer; // Get the scene properties from the feature layer's renderer RendererSceneProperties myRendererSceneProperties = myRenderer.SceneProperties; // Toggle the feature layer's scene properties renderer extrusion expression and change the button text if (_button_ToggleExtrusionData.Text == "Population Density") { myRendererSceneProperties.ExtrusionExpression = "[POP07_SQMI] * 5000"; _button_ToggleExtrusionData.Text = "Total Population"; } else if (_button_ToggleExtrusionData.Text == "Total Population") { myRendererSceneProperties.ExtrusionExpression = "[POP2007] / 10"; _button_ToggleExtrusionData.Text = "Population Density"; } }
private void ToggleExtrusionButton_Clicked(object sender, EventArgs e) { // Get the first layer from the scene view's operation layers, it should be a feature layer. FeatureLayer censusFeatureLayer = (FeatureLayer)_mySceneView.Scene.OperationalLayers[0]; // Get the renderer from the feature layer. Renderer censusRenderer = censusFeatureLayer.Renderer; // Get the scene properties from the feature layer's renderer. RendererSceneProperties sceneProperties = censusRenderer.SceneProperties; // Toggle the feature layer's scene properties renderer extrusion expression and change the button text. if (((UISegmentedControl)sender).SelectedSegment == 0) { // An offset of 100000 is added to ensure that polygons for large areas (like Alaska) // with low populations will be extruded above the curvature of the Earth. sceneProperties.ExtrusionExpression = "[POP07_SQMI] * 5000 + 100000"; } else { sceneProperties.ExtrusionExpression = "[POP2007] / 10"; } }
private async void Initialize() { // Apply appropriate maps to the scene and the inset map view InsetMapView.Map = new Map(Basemap.CreateImagery()); MySceneView.Scene = new Scene(Basemap.CreateImagery()); // Update the mission selection UI MissionSelectionBox.ItemsSource = _missionToItemId.Keys; MissionSelectionBox.SelectedIndex = 0; // Wire up the selection change event to call the ChangeMission method; this method resets the animation and starts a new mission MissionSelectionBox.SelectionChanged += async(sender, args) => { await ChangeMission(args.AddedItems[0].ToString()); }; // Apply the elevation source Surface surface = new Surface(); ElevationSource elevationSource = new ArcGISTiledElevationSource(_elevationServiceUrl); surface.ElevationSources.Add(elevationSource); MySceneView.Scene.BaseSurface = surface; // Create and add the graphics overlay GraphicsOverlay sceneOverlay = new GraphicsOverlay { SceneProperties = { SurfacePlacement = SurfacePlacement.Absolute } }; MySceneView.GraphicsOverlays.Add(sceneOverlay); // Create a renderer to handle updating plane's orientation SimpleRenderer renderer3D = new SimpleRenderer(); RendererSceneProperties renderProperties = renderer3D.SceneProperties; // Use expressions to keep the renderer properties updated as parameters of the rendered object renderProperties.HeadingExpression = "[HEADING]"; renderProperties.PitchExpression = "[PITCH]"; renderProperties.RollExpression = "[ROLL]"; // Apply the renderer to the scene view's overlay sceneOverlay.Renderer = renderer3D; // Create renderer to symbolize plane and update plane orientation in the inset map SimpleRenderer renderer2D = new SimpleRenderer(); // Create the symbol that will be used for the plane SimpleMarkerSymbol plane2DSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Triangle, System.Drawing.Color.Blue, 10); // Apply the symbol to the renderer renderer2D.Symbol = plane2DSymbol; // Apply a rotation expression to the renderer renderer2D.RotationExpression = "[ANGLE]"; // Update the inset map with a new GraphicsOverlay based on the renderer GraphicsOverlay insetMapOverlay = new GraphicsOverlay { Renderer = renderer2D }; InsetMapView.GraphicsOverlays.Add(insetMapOverlay); // Create placeholder graphic for showing the mission route in the inset map SimpleLineSymbol routeSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, System.Drawing.Color.Red, 2); _routeGraphic = new Graphic { Symbol = routeSymbol }; insetMapOverlay.Graphics.Add(_routeGraphic); // Create the plane graphic; this is symbolized as a blue triangle because of renderer implemented above // Create the attribute dictionary Dictionary <string, object> plane2DAttributes = new Dictionary <string, object>(); // Set the angle for the plane graphic plane2DAttributes["ANGLE"] = 0f; // Create the graphic from the attributes and the initial point _plane2D = new Graphic(new MapPoint(0, 0, SpatialReferences.Wgs84), plane2DAttributes); // Add the plane graphic to the inset map via the overlay insetMapOverlay.Graphics.Add(_plane2D); try { // Create the model graphic for the plane // Get the path to the 3D model string modelPath = GetModelPath(); // Create the scene symbol from the path to the model ModelSceneSymbol plane3DSymbol = await ModelSceneSymbol.CreateAsync(new Uri(modelPath), 1.0); // Create the graphic with an initial location and the plane symbol _plane3D = new Graphic(new MapPoint(0, 0, 0, SpatialReferences.Wgs84), plane3DSymbol); // Add the plane to the overlay sceneOverlay.Graphics.Add(_plane3D); // Create the orbit camera controller to follow the plane _orbitCameraController = new OrbitGeoElementCameraController(_plane3D, 20.0) { CameraPitchOffset = 75.0 }; MySceneView.CameraController = _orbitCameraController; // Create a timer; this will enable animating the plane _animationTimer = new DispatcherTimer() { // This is the duration of the timer in milliseconds. This controls the animation speed (fps) Interval = new TimeSpan(0, 0, 0, 0, 60) }; _animationTimer.Tick += AnimatePlane; // Set the initial mission for when the sample loads await ChangeMission(_missionToItemId.Keys.First()); } catch (Exception e) { await new MessageDialog(e.ToString(), "Error").ShowAsync(); } }
private void Initialize() { try { // Define the Uri for the service feature table (US state polygons) var myServiceFeatureTable_Uri = new Uri("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3"); // Create a new service feature table from the Uri ServiceFeatureTable myServiceFeatureTable = new ServiceFeatureTable(myServiceFeatureTable_Uri); // Create a new feature layer from the service feature table FeatureLayer myFeatureLayer = new FeatureLayer(myServiceFeatureTable); // Set the rendering mode of the feature layer to be dynamic (needed for extrusion to work) myFeatureLayer.RenderingMode = FeatureRenderingMode.Dynamic; // Create a new simple line symbol for the feature layer SimpleLineSymbol mySimpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Black, 1); // Create a new simple fill symbol for the feature layer SimpleFillSymbol mysimpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, Color.Blue, mySimpleLineSymbol); // Create a new simple renderer for the feature layer SimpleRenderer mySimpleRenderer = new SimpleRenderer(mysimpleFillSymbol); // Get the scene properties from the simple renderer RendererSceneProperties myRendererSceneProperties = mySimpleRenderer.SceneProperties; // Set the extrusion mode for the scene properties to be base height myRendererSceneProperties.ExtrusionMode = ExtrusionMode.BaseHeight; // Set the initial extrusion expression myRendererSceneProperties.ExtrusionExpression = "[POP2007] / 10"; // Set the feature layer's renderer to the define simple renderer myFeatureLayer.Renderer = mySimpleRenderer; // Create a new scene with the topographic backdrop Scene myScene = new Scene(BasemapType.Topographic); // Set the scene view's scene to the newly create one _mySceneView.Scene = myScene; // Add the feature layer to the scene's operational layer collection myScene.OperationalLayers.Add(myFeatureLayer); // Create a new map point to define where to look on the scene view MapPoint myMapPoint = new MapPoint(-10974490, 4814376, 0, SpatialReferences.WebMercator); // Create a new orbit location camera controller using the map point and defined distance OrbitLocationCameraController myOrbitLocationCameraController = new OrbitLocationCameraController(myMapPoint, 20000000); // Set the scene view's camera controller to the orbit location camera controller _mySceneView.CameraController = myOrbitLocationCameraController; } catch (Exception ex) { // Something went wrong, display the error var alert = new AlertDialog.Builder(this); alert.SetTitle("Error"); alert.SetMessage(ex.Message); alert.Show(); } }
private void Initialize() { try { // Define the URI for the service feature table (US state polygons). Uri featureTableUri = new Uri("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3"); // Create a new service feature table from the URI. ServiceFeatureTable censusServiceFeatureTable = new ServiceFeatureTable(featureTableUri); // Create a new feature layer from the service feature table. FeatureLayer censusFeatureLayer = new FeatureLayer(censusServiceFeatureTable) { // Set the rendering mode of the feature layer to be dynamic (needed for extrusion to work). RenderingMode = FeatureRenderingMode.Dynamic }; // Create a new simple line symbol for the feature layer. SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Black, 1); // Create a new simple fill symbol for the feature layer. SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, Color.Blue, lineSymbol); // Create a new simple renderer for the feature layer. SimpleRenderer renderer = new SimpleRenderer(fillSymbol); // Get the scene properties from the simple renderer. RendererSceneProperties sceneProperties = renderer.SceneProperties; // Set the extrusion mode for the scene properties. sceneProperties.ExtrusionMode = ExtrusionMode.AbsoluteHeight; // Set the initial extrusion expression. sceneProperties.ExtrusionExpression = "[POP2007] / 10"; // Set the feature layer's renderer to the define simple renderer. censusFeatureLayer.Renderer = renderer; // Create a new scene with a topographic basemap. Scene myScene = new Scene(BasemapType.Topographic); // Set the scene view's scene to the newly create one. _mySceneView.Scene = myScene; // Add the feature layer to the scene's operational layer collection. myScene.OperationalLayers.Add(censusFeatureLayer); // Create a new map point to define where to look on the scene view. MapPoint myMapPoint = new MapPoint(-10974490, 4814376, 0, SpatialReferences.WebMercator); // Create and use an orbit location camera controller defined by a point and distance. _mySceneView.CameraController = new OrbitLocationCameraController(myMapPoint, 20000000); } catch (Exception ex) { // Something went wrong, display the error. UIAlertController alert = UIAlertController.Create("Error", ex.Message, UIAlertControllerStyle.Alert); alert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null)); PresentViewController(alert, true, null); } }
private async void Initialize() { _statsVC = new StatsDisplayViewController(); // Apply appropriate maps to the scene and the inset map view. _insetMapView.Map = new Map(Basemap.CreateImagery()); _insetMapView.IsAttributionTextVisible = false; _mySceneView.Scene = new Scene(Basemap.CreateImagery()); // Apply the elevation source. Surface surface = new Surface(); ElevationSource elevationSource = new ArcGISTiledElevationSource(_elevationServiceUrl); surface.ElevationSources.Add(elevationSource); _mySceneView.Scene.BaseSurface = surface; // Create and add the graphics overlay. GraphicsOverlay sceneOverlay = new GraphicsOverlay { SceneProperties = { SurfacePlacement = SurfacePlacement.Absolute } }; _mySceneView.GraphicsOverlays.Add(sceneOverlay); // Create a renderer to handle updating plane's orientation. SimpleRenderer renderer3D = new SimpleRenderer(); RendererSceneProperties renderProperties = renderer3D.SceneProperties; // Use expressions to keep the renderer properties updated as parameters of the rendered object. renderProperties.HeadingExpression = "[HEADING]"; renderProperties.PitchExpression = "[PITCH]"; renderProperties.RollExpression = "[ROLL]"; // Apply the renderer to the scene view's overlay. sceneOverlay.Renderer = renderer3D; // Create renderer to symbolize plane and update plane orientation in the inset map. SimpleRenderer renderer2D = new SimpleRenderer { Symbol = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Triangle, Color.Blue, 10), RotationExpression = "[ANGLE]" }; // Update the inset map with a new GraphicsOverlay based on the renderer. GraphicsOverlay insetMapOverlay = new GraphicsOverlay { Renderer = renderer2D }; _insetMapView.GraphicsOverlays.Add(insetMapOverlay); // Create placeholder graphic for showing the mission route in the inset map. SimpleLineSymbol routeSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Red, 2); _routeGraphic = new Graphic { Symbol = routeSymbol }; insetMapOverlay.Graphics.Add(_routeGraphic); // Create the plane graphic; this is symbolized as a blue triangle because of renderer implemented above. Dictionary <string, object> plane2DAttributes = new Dictionary <string, object> { // Set the angle for the plane graphic. ["ANGLE"] = 0f }; // Create the graphic from the attributes and the initial point. _plane2D = new Graphic(new MapPoint(0, 0, SpatialReferences.Wgs84), plane2DAttributes); // Add the plane graphic to the inset map via the overlay. insetMapOverlay.Graphics.Add(_plane2D); try { // Create the model graphic for the plane. string modelPath = DataManager.GetDataFolder("681d6f7694644709a7c830ec57a2d72b", "Bristol.dae"); // Create the scene symbol from the path to the model. ModelSceneSymbol plane3DSymbol = await ModelSceneSymbol.CreateAsync(new Uri(modelPath), 1.0); // Create the graphic with an initial location and the plane symbol. _plane3D = new Graphic(new MapPoint(0, 0, 0, SpatialReferences.Wgs84), plane3DSymbol); // Add the plane to the overlay. sceneOverlay.Graphics.Add(_plane3D); // Create the orbit camera controller to follow the plane. _orbitCameraController = new OrbitGeoElementCameraController(_plane3D, 20.0) { CameraPitchOffset = 75.0 }; _mySceneView.CameraController = _orbitCameraController; // Create a timer; this animates the plane. // The value is the duration of the timer in milliseconds. This controls the speed of the animation (fps). _animationTimer = new Timer(60) { AutoReset = true }; // Set the initial mission for when the sample loads. ChangeMission(_missionToItemId.Keys.First()); } catch (Exception e) { new UIAlertView("Error", e.ToString(), (IUIAlertViewDelegate)null, "OK", null).Show(); } }
private async Task Initialize() { // Apply appropriate maps to the scene and the inset map view _insetMapView.Map = new Map(Basemap.CreateImagery()); _insetMapView.IsAttributionTextVisible = false; _mySceneView.Scene = new Scene(Basemap.CreateImagery()); // Apply the elevation source Surface surface = new Surface(); ElevationSource elevationSource = new ArcGISTiledElevationSource(_elevationServiceUrl); surface.ElevationSources.Add(elevationSource); _mySceneView.Scene.BaseSurface = surface; // Create and add the graphics overlay GraphicsOverlay sceneOverlay = new GraphicsOverlay { SceneProperties = { SurfacePlacement = SurfacePlacement.Absolute } }; _mySceneView.GraphicsOverlays.Add(sceneOverlay); // Create a renderer to handle updating plane's orientation SimpleRenderer renderer3D = new SimpleRenderer(); RendererSceneProperties renderProperties = renderer3D.SceneProperties; // Use expressions to keep the renderer properties updated as parameters of the rendered object renderProperties.HeadingExpression = "[HEADING]"; renderProperties.PitchExpression = "[PITCH]"; renderProperties.RollExpression = "[ROLL]"; // Apply the renderer to the scene view's overlay sceneOverlay.Renderer = renderer3D; // Create renderer to symbolize plane and update plane orientation in the inset map SimpleRenderer renderer2D = new SimpleRenderer(); // Create the symbol that will be used for the plane SimpleMarkerSymbol plane2DSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Triangle, Color.Blue, 10); // Apply the symbol to the renderer renderer2D.Symbol = plane2DSymbol; // Apply a rotation expression to the renderer renderer2D.RotationExpression = "[ANGLE]"; // Update the inset map with a new GraphicsOverlay based on the renderer GraphicsOverlay insetMapOperlay = new GraphicsOverlay { Renderer = renderer2D }; _insetMapView.GraphicsOverlays.Add(insetMapOperlay); // Create placeholder graphic for showing the mission route in the inset map SimpleLineSymbol routeSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Red, 2); _routeGraphic = new Graphic { Symbol = routeSymbol }; insetMapOperlay.Graphics.Add(_routeGraphic); // Create the plane graphic; this is symbolized as a blue triangle because of renderer implemented above // Create the attribute dictionary Dictionary <string, object> plane2DAttributes = new Dictionary <string, object>(); // Set the angle for the plane graphic plane2DAttributes["ANGLE"] = 0f; // Create the graphic from the attributes and the initial point _plane2D = new Graphic(new MapPoint(0, 0, SpatialReferences.Wgs84), plane2DAttributes); // Add the plane graphic to the inset map via the overlay insetMapOperlay.Graphics.Add(_plane2D); // Create the model graphic for the plane // Get the path to the 3D model string modelPath = await GetModelPath(); // Create the scene symbol from the path to the model ModelSceneSymbol plane3DSymbol = await ModelSceneSymbol.CreateAsync(new Uri(modelPath), 1.0); // Create the graphic with an initial location and the plane symbol _plane3D = new Graphic(new MapPoint(0, 0, 0, SpatialReferences.Wgs84), plane3DSymbol); // Add the plane to the overlay sceneOverlay.Graphics.Add(_plane3D); // Create the orbit camera controller to follow the plane _orbitCameraController = new OrbitGeoElementCameraController(_plane3D, 20.0) { CameraPitchOffset = 75.0 }; _mySceneView.CameraController = _orbitCameraController; // Create a timer; this animates the plane // The value is the duration of the timer in milliseconds. This controls the speed of the animation (fps) _animationTimer = new Timer(60) { AutoReset = true }; // Call the animation method every time the timer expires (once every 60ms per above) _animationTimer.Elapsed += (sender, args) => AnimatePlane(); // Set the initial mission for when the sample loads await ChangeMission(_missionToItemId.Keys.First()); }