-
Notifications
You must be signed in to change notification settings - Fork 525
/
Copy pathUseDistanceCompositeSym.xaml.cs
113 lines (95 loc) · 5.29 KB
/
UseDistanceCompositeSym.xaml.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright 2022 Esri.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
// language governing permissions and limitations under the License.
using ArcGIS.Samples.Managers;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Symbology;
using Esri.ArcGISRuntime.UI;
using Colors = System.Drawing.Color;
namespace ArcGIS.Samples.UseDistanceCompositeSym
{
[ArcGIS.Samples.Shared.Attributes.Sample(
name: "Distance composite scene symbol",
category: "Symbology",
description: "Change a graphic's symbol based on the camera's proximity to it.",
instructions: "The sample starts looking at a plane. Zoom out from the plane to see it turn into a cone. Keeping zooming out and it will turn into a point.",
tags: new[] { "3D", "data", "graphic", "range", "symbol" })]
[ArcGIS.Samples.Shared.Attributes.OfflineData("681d6f7694644709a7c830ec57a2d72b")]
public partial class UseDistanceCompositeSym : ContentPage
{
public UseDistanceCompositeSym()
{
InitializeComponent();
// Create the Scene, basemap, graphic, and composite symbol.
_ = Initialize();
}
private async Task Initialize()
{
try
{
// Create a new Scene with an imagery basemap.
Scene myScene = new Scene(BasemapStyle.ArcGISImageryStandard);
// Add the Scene to the SceneView.
MySceneView.Scene = myScene;
// Create a new GraphicsOverlay and add it to the SceneView.
GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
graphicsOverlay.SceneProperties.SurfacePlacement = SurfacePlacement.Relative;
MySceneView.GraphicsOverlays.Add(graphicsOverlay);
// Call a function to create a new distance composite symbol with three ranges.
DistanceCompositeSceneSymbol compositeSymbol = await CreateCompositeSymbol();
// Create a new point graphic with the composite symbol, add it to the graphics overlay.
MapPoint locationPoint = new MapPoint(-2.708471, 56.096575, 5000, SpatialReferences.Wgs84);
Graphic pointGraphic = new Graphic(locationPoint, compositeSymbol);
graphicsOverlay.Graphics.Add(pointGraphic);
// Add an orbit camera controller to lock the camera to the graphic.
OrbitGeoElementCameraController cameraController = new OrbitGeoElementCameraController(pointGraphic, 20)
{
CameraPitchOffset = 80,
CameraHeadingOffset = -30
};
MySceneView.CameraController = cameraController;
}
catch (Exception e)
{
await Application.Current.Windows[0].Page.DisplayAlert("Error", e.ToString(), "OK");
}
}
private async Task<DistanceCompositeSceneSymbol> CreateCompositeSymbol()
{
// Get the path to the 3D model.
string modelPath = GetModelPath();
// Create three symbols for displaying a feature according to its distance from the camera.
// First, a 3D model symbol (airplane) for when the camera is near the feature.
ModelSceneSymbol plane3DSymbol = await ModelSceneSymbol.CreateAsync(new System.Uri(modelPath), 1.0);
// 3D (blue cone) symbol for when the feature is at an intermediate range.
SimpleMarkerSceneSymbol coneSym = new SimpleMarkerSceneSymbol(SimpleMarkerSceneSymbolStyle.Cone, Colors.LightSkyBlue, 15, 6, 3, SceneSymbolAnchorPosition.Center)
{
// The cone will point in the same direction as the plane.
Pitch = -90
};
// Simple marker symbol (circle) when the feature is far from the camera.
SimpleMarkerSymbol markerSym = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Circle, Colors.LightSkyBlue, 10.0);
// Create three new ranges for displaying each symbol.
DistanceSymbolRange closeRange = new DistanceSymbolRange(plane3DSymbol, 0, 100);
DistanceSymbolRange midRange = new DistanceSymbolRange(coneSym, 100, 500);
DistanceSymbolRange farRange = new DistanceSymbolRange(markerSym, 500, 0);
// Create a new DistanceCompositeSceneSymbol and add the ranges.
DistanceCompositeSceneSymbol compositeSymbol = new DistanceCompositeSceneSymbol();
compositeSymbol.Ranges.Add(closeRange);
compositeSymbol.Ranges.Add(midRange);
compositeSymbol.Ranges.Add(farRange);
// Return the new composite symbol.
return compositeSymbol;
}
private static string GetModelPath()
{
return DataManager.GetDataFolder("681d6f7694644709a7c830ec57a2d72b", "Bristol.dae");
}
}
}