You can programmatically create different types of 3D symbols and add them to a scene at specified locations. You could do this to call attention to the prominence of a location.
How to use the sample
When the scene loads, note the different types of 3D symbols that you can create.
How it works
Create a GraphicsOverlay.
Create various simple marker scene symbols by specifying different styles and colors, and a height, width, depth, and anchor position of each.
Create a Graphic for each symbol.
Add the graphics to the graphics overlay.
Add the graphics overlay to the SceneView.
Relevant API
SceneSymbol::anchorPosition
SimpleMarkerSceneSymbol
SimpleMarkerSceneSymbol::style
About the data
This sample shows arbitrary symbols in an empty scene with imagery basemap.
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
// [WriteFile Name=Symbols, Category=Scenes]// [Legal]// Copyright 2016 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.// [Legal]#ifdef PCH_BUILD#include"pch.hpp"#endif// PCH_BUILD#include"Symbols.h"#include"Scene.h"#include"SceneQuickView.h"#include"Basemap.h"#include"ArcGISTiledElevationSource.h"#include"SimpleMarkerSceneSymbol.h"#include"Camera.h"#include"MapTypes.h"#include"SymbolTypes.h"#include"GraphicsOverlayListModel.h"#include"GraphicsOverlay.h"#include"GraphicListModel.h"#include"Graphic.h"#include"Point.h"#include"Surface.h"#include"ElevationSourceListModel.h"#include"LayerSceneProperties.h"#include"SceneViewTypes.h"#include"SpatialReference.h"usingnamespace Esri::ArcGISRuntime;
Symbols::Symbols(QQuickItem* parent) :
QQuickItem(parent)
{
}
Symbols::~Symbols() = default;
voidSymbols::init(){
qmlRegisterType<SceneQuickView>("Esri.Samples", 1, 0, "SceneView");
qmlRegisterType<Symbols>("Esri.Samples", 1, 0, "SymbolsSample");
}
voidSymbols::componentComplete(){
QQuickItem::componentComplete();
// find QML SceneView component m_sceneView = findChild<SceneQuickView*>("sceneView");
// create a new basemap instance Basemap* basemap = newBasemap(BasemapStyle::ArcGISImageryStandard, this);
// create a new scene instance m_scene = newScene(basemap, this);
// set scene on the scene view m_sceneView->setArcGISScene(m_scene);
// create a new elevation source ArcGISTiledElevationSource* elevationSource = newArcGISTiledElevationSource(QUrl("https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer"), this);
// add the elevation source to the scene to display elevation m_scene->baseSurface()->elevationSources()->append(elevationSource);
// create a cameraCamera camera(34, 45, 6000, 0, 0, 0);
// set the viewpoint m_sceneView->setViewpointCameraAndWait(camera);
// create a graphics overlay GraphicsOverlay* graphicsOverlay = newGraphicsOverlay(this);
graphicsOverlay->setSceneProperties(LayerSceneProperties(SurfacePlacement::Absolute));
// add the graphics overlay to the scene view m_sceneView->graphicsOverlays()->append(graphicsOverlay);
// create a map of the symbol styles and color QMap<SimpleMarkerSceneSymbolStyle, QColor> symbolStyles;
symbolStyles.insert(SimpleMarkerSceneSymbolStyle::Cone, QColor("red"));
symbolStyles.insert(SimpleMarkerSceneSymbolStyle::Cube, QColor("white"));
symbolStyles.insert(SimpleMarkerSceneSymbolStyle::Cylinder, QColor("purple"));
symbolStyles.insert(SimpleMarkerSceneSymbolStyle::Diamond, QColor("turquoise"));
symbolStyles.insert(SimpleMarkerSceneSymbolStyle::Sphere, QColor("blue"));
symbolStyles.insert(SimpleMarkerSceneSymbolStyle::Tetrahedron, QColor("yellow"));
QMapIterator<SimpleMarkerSceneSymbolStyle, QColor> i(symbolStyles);
constexprdouble x = 44.975;
constexprdouble y = 34.0;
constexprdouble z = 500.0;
int counter = 0;
// iterate over the mapwhile (i.hasNext())
{
i.next();
// create a scene symbol based on the current type SimpleMarkerSceneSymbol* smss = newSimpleMarkerSceneSymbol(i.key(), i.value(), 200, 200, 200, SceneSymbolAnchorPosition::Center, this);
// create a graphic using the symbol above and a point location Graphic* graphic = newGraphic(Point(x + 0.01 * counter++, y, z, m_sceneView->spatialReference()), smss, this);
// add the graphic to the graphics overlay graphicsOverlay->graphics()->append(graphic);
}
}