forked from Esri/arcgis-maps-sdk-dotnet-samples
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathViewshedCamera.cs
121 lines (98 loc) · 5.28 KB
/
ViewshedCamera.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
114
115
116
117
118
119
120
121
// Copyright 2017 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 System;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.UI.Controls;
using Esri.ArcGISRuntime.UI.GeoAnalysis;
using Foundation;
using UIKit;
namespace ArcGISRuntime.Samples.ViewshedCamera
{
[Register("ViewshedCamera")]
[ArcGISRuntime.Samples.Shared.Attributes.Sample(
"Viewshed for camera",
"Analysis",
"This sample demonstrates how to create a `LocationViewshed` to display interactive viewshed results in the scene view. The viewshed observer is defined by the scene view camera to evaluate visible and obstructed areas of the scene from that location.",
"", "Featured")]
public class ViewshedCamera : UIViewController
{
// Hold a reference to the SceneView.
private SceneView _mySceneView;
// URL for a scene service of buildings in Brest, France.
private const string BuildingsServiceUrl = "https://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/Buildings_Brest/SceneServer/layers/0";
// URL for an image service to use as an elevation source.
private const string ElevationSourceUrl = "https://scene.arcgis.com/arcgis/rest/services/BREST_DTM_1M/ImageServer";
// Location viewshed analysis to show visible and obstructed areas from the camera.
private LocationViewshed _viewshedForCamera;
public ViewshedCamera()
{
Title = "Viewshed from camera";
}
private void Initialize()
{
// Create a new Scene with an imagery basemap.
Scene myScene = new Scene(Basemap.CreateImagery());
// Create a scene layer to show buildings in the Scene.
myScene.OperationalLayers.Add(new ArcGISSceneLayer(new Uri(BuildingsServiceUrl)));
// Create an elevation source for the Scene.
myScene.BaseSurface.ElevationSources.Add(new ArcGISTiledElevationSource(new Uri(ElevationSourceUrl)));
// Add the Scene to the SceneView.
_mySceneView.Scene = myScene;
// Set the viewpoint with a new camera focused on the castle in Brest.
Camera observerCamera = new Camera(new MapPoint(-4.49492, 48.3808, 48.2511, SpatialReferences.Wgs84), 344.488, 74.1212, 0.0);
_mySceneView.SetViewpointCameraAsync(observerCamera);
// Create a LocationViewshed analysis using the camera as the observer.
_viewshedForCamera = new LocationViewshed(observerCamera, 1, 1000);
// Create an analysis overlay to contain the viewshed analysis results.
AnalysisOverlay viewshedOverlay = new AnalysisOverlay();
// Add the location viewshed analysis to the analysis overlay, then add the overlay to the scene view.
viewshedOverlay.Analyses.Add(_viewshedForCamera);
_mySceneView.AnalysisOverlays.Add(viewshedOverlay);
}
private void UpdateObserverWithCamera(object sender, EventArgs e)
{
// Use the current camera to update the observer for the location viewshed analysis.
_viewshedForCamera.UpdateFromCamera(_mySceneView.Camera);
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
Initialize();
}
public override void LoadView()
{
// Create the views.
View = new UIView {BackgroundColor = UIColor.White};
_mySceneView = new SceneView();
_mySceneView.TranslatesAutoresizingMaskIntoConstraints = false;
UIToolbar toolbar = new UIToolbar();
toolbar.TranslatesAutoresizingMaskIntoConstraints = false;
toolbar.Items = new[]
{
new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace),
new UIBarButtonItem("Viewshed from here", UIBarButtonItemStyle.Plain, UpdateObserverWithCamera),
new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace)
};
// Add the views.
View.AddSubviews(_mySceneView, toolbar);
// Lay out the views.
NSLayoutConstraint.ActivateConstraints(new []
{
_mySceneView.TopAnchor.ConstraintEqualTo(View.SafeAreaLayoutGuide.TopAnchor),
_mySceneView.LeadingAnchor.ConstraintEqualTo(View.LeadingAnchor),
_mySceneView.TrailingAnchor.ConstraintEqualTo(View.TrailingAnchor),
_mySceneView.BottomAnchor.ConstraintEqualTo(toolbar.TopAnchor),
toolbar.BottomAnchor.ConstraintEqualTo(View.SafeAreaLayoutGuide.BottomAnchor),
toolbar.LeadingAnchor.ConstraintEqualTo(View.LeadingAnchor),
toolbar.TrailingAnchor.ConstraintEqualTo(View.TrailingAnchor)
});
}
}
}