itowns 2.37.0 → 2.38.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +12 -1
  2. package/changelog.md +101 -0
  3. package/dist/debug.js +1 -1
  4. package/dist/debug.js.LICENSE.txt +2 -2
  5. package/dist/debug.js.map +1 -1
  6. package/dist/itowns.js +1 -1
  7. package/dist/itowns.js.LICENSE.txt +2 -2
  8. package/dist/itowns.js.map +1 -1
  9. package/dist/itowns_widgets.js +1 -1
  10. package/dist/itowns_widgets.js.map +1 -1
  11. package/examples/config.json +4 -1
  12. package/examples/css/example.css +21 -1
  13. package/examples/css/widgets.css +118 -6
  14. package/examples/images/code-logo.svg +43 -0
  15. package/examples/index.html +5 -5
  16. package/examples/mars.html +0 -1
  17. package/examples/misc_orthographic_camera.html +7 -19
  18. package/examples/vector_tile_3d_mesh.html +155 -0
  19. package/examples/vector_tile_raster_3d.html +0 -5
  20. package/examples/view_25d_map.html +6 -19
  21. package/examples/view_2d_map.html +6 -19
  22. package/examples/view_3d_map.html +106 -81
  23. package/examples/widgets_minimap.html +3 -1
  24. package/examples/widgets_navigation.html +6 -1
  25. package/examples/widgets_scale.html +96 -0
  26. package/examples/widgets_searchbar.html +124 -0
  27. package/lib/Controls/PlanarControls.js +10 -42
  28. package/lib/Converter/Feature2Mesh.js +225 -61
  29. package/lib/Converter/Feature2Texture.js +4 -3
  30. package/lib/Converter/convertToTile.js +10 -5
  31. package/lib/Core/Feature.js +57 -30
  32. package/lib/Core/MainLoop.js +136 -62
  33. package/lib/Core/TileMesh.js +21 -5
  34. package/lib/Core/View.js +46 -15
  35. package/lib/Layer/FeatureGeometryLayer.js +37 -10
  36. package/lib/Layer/GeoidLayer.js +17 -6
  37. package/lib/Layer/GeometryLayer.js +6 -54
  38. package/lib/Layer/OrientedImageLayer.js +1 -0
  39. package/lib/Layer/RasterLayer.js +3 -1
  40. package/lib/Layer/ReferencingLayerProperties.js +50 -0
  41. package/lib/Main.js +1 -1
  42. package/lib/Parser/B3dmParser.js +3 -2
  43. package/lib/Parser/GeoJsonParser.js +29 -7
  44. package/lib/Parser/VectorTileParser.js +5 -4
  45. package/lib/Parser/deprecated/LegacyGLTFLoader.js +3 -3
  46. package/lib/Process/3dTilesProcessing.js +3 -3
  47. package/lib/Process/FeatureProcessing.js +36 -86
  48. package/lib/Process/LayeredMaterialNodeProcessing.js +9 -3
  49. package/lib/Process/ObjectRemovalHelper.js +4 -0
  50. package/lib/Provider/3dTilesProvider.js +2 -7
  51. package/lib/Provider/Fetcher.js +5 -2
  52. package/lib/Provider/TileProvider.js +18 -2
  53. package/lib/Renderer/Camera.js +33 -12
  54. package/lib/Renderer/ColorLayersOrdering.js +3 -1
  55. package/lib/Renderer/LayeredMaterial.js +32 -7
  56. package/lib/Renderer/OBB.js +8 -4
  57. package/lib/Renderer/OrientedImageMaterial.js +8 -5
  58. package/lib/Renderer/PointsMaterial.js +1 -0
  59. package/lib/Renderer/RenderMode.js +3 -1
  60. package/lib/Renderer/Shader/ShaderChunk.js +5 -1
  61. package/lib/Renderer/c3DEngine.js +9 -6
  62. package/lib/Source/FileSource.js +8 -1
  63. package/lib/Source/VectorTilesSource.js +5 -0
  64. package/lib/Source/WFSSource.js +9 -3
  65. package/lib/ThreeExtended/{WebGL.js → capabilities/WebGL.js} +8 -7
  66. package/lib/ThreeExtended/loaders/GLTFLoader.js +3 -4
  67. package/lib/Utils/DEMUtils.js +3 -1
  68. package/lib/Utils/gui/Main.js +39 -0
  69. package/lib/Utils/gui/Minimap.js +195 -0
  70. package/lib/Utils/gui/Navigation.js +322 -0
  71. package/lib/Utils/gui/Scale.js +154 -0
  72. package/lib/Utils/gui/Searchbar.js +299 -0
  73. package/lib/Utils/gui/Widget.js +119 -0
  74. package/package.json +27 -22
  75. package/examples/images/compass.svg +0 -60
  76. package/examples/images/widget-logo.svg +0 -66
  77. package/examples/js/Scale.js +0 -41
@@ -5,6 +5,7 @@
5
5
 
6
6
  <link rel="stylesheet" type="text/css" href="css/example.css">
7
7
  <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
8
+ <link rel="stylesheet" type="text/css" href="css/widgets.css">
8
9
 
9
10
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
11
  <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script>
@@ -20,13 +21,12 @@
20
21
  </ul>
21
22
  </div>
22
23
  <div id="viewerDiv"></div>
23
- <span id="divScaleWidget"> Scale </span>
24
24
 
25
25
  <script src="../dist/itowns.js"></script>
26
26
  <script src="../dist/debug.js"></script>
27
+ <script src="../dist/itowns_widgets.js"></script>
27
28
  <script src="js/GUI/LoadingScreen.js"></script>
28
29
  <script src="js/GUI/GuiTools.js"></script>
29
- <script src="js/Scale.js"></script>
30
30
  <script type="text/javascript">
31
31
  /* global itowns, setupLoadingScreen, GuiTools, debug */
32
32
 
@@ -74,24 +74,12 @@
74
74
  });
75
75
  view.addLayer(wmsImageryLayer);
76
76
 
77
- // Initialize scale :
78
- const initialScaleSize = 200; // in pixel
79
- const divScaleWidget = document.getElementById('divScaleWidget');
80
- function updateScaleWidget() {
81
- let computedScale = roundPixelsFromMeters(view, initialScaleSize);
82
- let format = getMetersUnit(computedScale.meters);
83
- divScaleWidget.innerHTML = `${format.distance} ${format.unit}`;
84
- divScaleWidget.style.width = `${computedScale.pixels}`;
85
- }
86
- // Updates scale when needed :
87
- view.addEventListener(itowns.VIEW_EVENTS.INITIALIZED, function () {
88
- // eslint-disable-next-line no-console
89
- console.info('View initialized');
90
- updateScaleWidget();
77
+ // Add a scale :
78
+ const scale = new itowns_widgets.Scale(view, {
79
+ position: 'bottom-right',
80
+ translate: { x: -70 },
91
81
  });
92
- view.addEventListener(itowns.PLANAR_CONTROL_EVENT.MOVED, function () {
93
- updateScaleWidget();
94
- })
82
+
95
83
  // request redraw
96
84
  view.notifyChange();
97
85
 
@@ -0,0 +1,155 @@
1
+ <html>
2
+ <head>
3
+ <title>Itowns - Globe + vector-tiles 3d</title>
4
+
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+
8
+ <link rel="stylesheet" type="text/css" href="css/example.css">
9
+ <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
10
+ <link rel="stylesheet" type="text/css" href="css/widgets.css">
11
+
12
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script>
13
+ </head>
14
+ <body>
15
+ <div id="viewerDiv"></div>
16
+
17
+ <!-- Import iTowns source code -->
18
+ <script src="../dist/itowns.js"></script>
19
+ <script src="../dist/debug.js"></script>
20
+ <!-- Import iTowns LoadingScreen and GuiTools plugins -->
21
+ <script src="js/GUI/GuiTools.js"></script>
22
+ <script src="js/GUI/LoadingScreen.js"></script>
23
+
24
+ <script type="text/javascript">
25
+
26
+ // ---------- CREATE A GlobeView FOR SUPPORTING DATA VISUALIZATION : ----------
27
+
28
+ // Define camera initial position
29
+ const placement = {
30
+ coord: new itowns.Coordinates('EPSG:4326', 2.351323, 48.856712),
31
+ range: 5000,
32
+ tilt: 45,
33
+ };
34
+
35
+ // `viewerDiv` will contain iTowns' rendering area (`<canvas>`)
36
+ const viewerDiv = document.getElementById('viewerDiv');
37
+
38
+ // Create a GlobeView
39
+ const view = new itowns.GlobeView(viewerDiv, placement);
40
+
41
+ // Define poles texture
42
+ view.tileLayer.noTextureColor = new itowns.THREE.Color(0x95c1e1);
43
+
44
+ // Disable atmosphere lighting
45
+ view.getLayerById('atmosphere').visible = false;
46
+ view.getLayerById('atmosphere').fog.enable = false;
47
+
48
+ // Setup loading screen and debug menu
49
+ setupLoadingScreen(viewerDiv, view);
50
+ const debugMenu = new GuiTools('menuDiv', view, 300);
51
+
52
+
53
+
54
+ // ---------- DISPLAY CONTEXTUAL DATA : ----------
55
+
56
+ // Add two elevation layers, each with a different level of detail. Each layer's properties are defined in
57
+ // a json file.
58
+ function addElevationLayerFromConfig(config) {
59
+ config.source = new itowns.WMTSSource(config.source);
60
+ view.addLayer(
61
+ new itowns.ElevationLayer(config.id, config),
62
+ ).then(debugMenu.addLayerGUI.bind(debugMenu));
63
+ }
64
+ itowns.Fetcher.json('./layers/JSONLayers/WORLD_DTM.json').then(addElevationLayerFromConfig);
65
+ itowns.Fetcher.json('./layers/JSONLayers/IGN_MNT_HIGHRES.json').then(addElevationLayerFromConfig);
66
+
67
+ // ---------- DISPLAY VECTOR TILED MAP DATA AS A ColorLayer : ----------
68
+
69
+ // Define the source of the ColorLayer data : a vector tiled map from the geoportail.
70
+ const mapSource = new itowns.VectorTilesSource({
71
+ style: 'https://wxs.ign.fr/essentiels/static/vectorTiles/styles/PLAN.IGN/standard.json',
72
+ // We don't display mountains and parcels related data to ease visualisation. Also, we don't display
73
+ // buildings related data as it will be displayed in another Layer.
74
+ filter: (layer) => {
75
+ return !layer['source-layer'].includes('bati_surf')
76
+ && !layer['source-layer'].includes('oro_')
77
+ && !layer['source-layer'].includes('routier_ponc')
78
+ && !layer['source-layer'].includes('parcellaire')
79
+ }
80
+ });
81
+
82
+ // Create a ColorLayer to support map data.
83
+ const mapLayer = new itowns.ColorLayer('MVT', {
84
+ source: mapSource,
85
+ effect_type: itowns.colorLayerEffects.removeLightColor,
86
+ effect_parameter: 2.5,
87
+ addLabelLayer: true,
88
+ style: new itowns.Style({
89
+ text: {
90
+ color: '#000000',
91
+ haloColor: '#ffffff',
92
+ haloWidth: 3,
93
+ haloBlur: 2,
94
+ }
95
+ })
96
+ });
97
+
98
+ // Add the ColorLayer to the scene and to the debug menu.
99
+ view.addLayer(mapLayer).then(debugMenu.addLayerGUI.bind(debugMenu));
100
+
101
+
102
+ // ---------- DISPLAY ORTHO-IMAGES : ----------
103
+
104
+ const ortho = itowns.Fetcher.json('./layers/JSONLayers/Ortho.json').then(function _(config) {
105
+ config.source = new itowns.WMTSSource(config.source);
106
+ var layer = new itowns.ColorLayer('Ortho', config);
107
+ return view.addLayer(layer);
108
+ });
109
+
110
+ // ---------- DISPLAY VECTOR TILED BUILDING DATA AS 3D MESHES : ----------
111
+
112
+ // Define the source of the building data : those are vector tiled data from the geoportail.
113
+ const buildingsSource = new itowns.VectorTilesSource({
114
+ style: 'https://wxs.ign.fr/essentiels/static/vectorTiles/styles/PLAN.IGN/standard.json',
115
+ // We only want to display buildings related data.
116
+ filter: (layer) => {
117
+ return layer['source-layer'].includes('bati_surf')
118
+ && layer.paint["fill-color"];
119
+ },
120
+ });
121
+
122
+ // Create a FeatureGeometryLayer to support building data.
123
+ var buildingsLayer = new itowns.FeatureGeometryLayer('VTBuilding',{
124
+ source: buildingsSource,
125
+ zoom: { min: 15 },
126
+ accurate: false,
127
+ style: new itowns.Style({
128
+ fill: {
129
+ base_altitude: (p) => p.alti_sol || 0,
130
+ extrusion_height: (p) => p.hauteur || 0,
131
+ }
132
+ })
133
+ });
134
+
135
+ // Add the FeatureGeometryLayer to the scene and to the debug menu.
136
+ view.addLayer(buildingsLayer).then((layer) => {
137
+ const gui = debug.GeometryDebug.createGeometryDebugUI(debugMenu.gui, view, layer);
138
+ debug.GeometryDebug.addWireFrameCheckbox(gui, view, layer);
139
+ })
140
+
141
+
142
+
143
+ // ---------- DEBUG TOOLS : ----------
144
+
145
+ debug.createTileDebugUI(debugMenu.gui, view);
146
+
147
+ view.addEventListener(itowns.GLOBE_VIEW_EVENTS.GLOBE_INITIALIZED, function () {
148
+ ortho.then(function () {
149
+ itowns.ColorLayersOrdering.moveLayerToIndex(view, 'Ortho', 0);
150
+ }).catch(console.error);
151
+ });
152
+
153
+ </script>
154
+ </body>
155
+ </html>
@@ -47,11 +47,6 @@
47
47
  return view.addLayer(layer);
48
48
  }));
49
49
 
50
- // Add a vector tile layer
51
- function inter(z) {
52
- return z - (z % 5);
53
- }
54
-
55
50
  // Define a VectorTilesSource to load Vector Tiles data from the geoportail
56
51
  var mvtSource = new itowns.VectorTilesSource({
57
52
  style: 'https://wxs.ign.fr/essentiels/static/vectorTiles/styles/PLAN.IGN/standard.json',
@@ -5,6 +5,7 @@
5
5
  <meta charset="UTF-8">
6
6
  <link rel="stylesheet" type="text/css" href="css/example.css">
7
7
  <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
8
+ <link rel="stylesheet" type="text/css" href="css/widgets.css">
8
9
 
9
10
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
11
  <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script>
@@ -23,13 +24,12 @@
23
24
  </ul>
24
25
  </div>
25
26
  <div id="viewerDiv" class="viewer"></div>
26
- <span id="divScaleWidget"> Scale </span>
27
27
 
28
28
  <script src="../dist/itowns.js"></script>
29
29
  <script src="js/GUI/LoadingScreen.js"></script>
30
30
  <script src="../dist/debug.js"></script>
31
+ <script src="../dist/itowns_widgets.js"></script>
31
32
  <script src="js/GUI/GuiTools.js"></script>
32
- <script src="js/Scale.js"></script>
33
33
  <script type="text/javascript">
34
34
  // Define crs projection that we will use (taken from https://epsg.io/3946, Proj4js section)
35
35
  itowns.proj4.defs('EPSG:3946', '+proj=lcc +lat_1=45.25 +lat_2=46.75 +lat_0=46 +lon_0=3 +x_0=1700000 +y_0=5200000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs');
@@ -125,23 +125,10 @@
125
125
 
126
126
  view.addLayer(wfsCartoLayer);
127
127
 
128
- // Initialize scale :
129
- const initialScaleSize = 200; // in pixel
130
- const divScaleWidget = document.getElementById('divScaleWidget');
131
- function updateScaleWidget() {
132
- let computedScale = roundPixelsFromMeters(view, initialScaleSize);
133
- let format = getMetersUnit(computedScale.meters);
134
- divScaleWidget.innerHTML = `${format.distance} ${format.unit}`;
135
- divScaleWidget.style.width = `${computedScale.pixels}`;
136
- }
137
- // Updates scale when needed :
138
- view.addEventListener(itowns.VIEW_EVENTS.INITIALIZED, function () {
139
- // eslint-disable-next-line no-console
140
- console.info('view initialized');
141
- updateScaleWidget();
142
- });
143
- view.addEventListener(itowns.PLANAR_CONTROL_EVENT.MOVED, function () {
144
- updateScaleWidget();
128
+ // Add a scale :
129
+ const scale = new itowns_widgets.Scale(view, {
130
+ position: 'bottom-right',
131
+ translate: { x: -70 },
145
132
  });
146
133
 
147
134
  // Request redraw
@@ -5,16 +5,16 @@
5
5
  <meta charset="UTF-8">
6
6
  <link rel="stylesheet" type="text/css" href="css/example.css">
7
7
  <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
8
+ <link rel="stylesheet" type="text/css" href="css/widgets.css">
8
9
 
9
10
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
11
  </head>
11
12
  <body>
12
13
  <div id="viewerDiv"></div>
13
- <span id="divScaleWidget"> Scale </span>
14
14
 
15
15
  <script src="../dist/itowns.js"></script>
16
+ <script src="../dist/itowns_widgets.js"></script>
16
17
  <script src="js/GUI/LoadingScreen.js"></script>
17
- <script src="js/Scale.js"></script>
18
18
  <script type="text/javascript">
19
19
  // # Orthographic viewer
20
20
 
@@ -67,24 +67,11 @@
67
67
 
68
68
  view.addLayer(opensmLayer);
69
69
 
70
- // Initialize scale :
71
- const initialScaleSize = 200; // in pixel
72
- const divScaleWidget = document.getElementById('divScaleWidget');
73
- function updateScaleWidget() {
74
- let computedScale = roundPixelsFromMeters(view, initialScaleSize);
75
- let format = getMetersUnit(computedScale.meters);
76
- divScaleWidget.innerHTML = `${format.distance} ${format.unit}`;
77
- divScaleWidget.style.width = `${computedScale.pixels}`;
78
- }
79
- // Updates scale when needed :
80
- view.addEventListener(itowns.VIEW_EVENTS.INITIALIZED, function () {
81
- // eslint-disable-next-line no-console
82
- console.info('View initialized');
83
- updateScaleWidget();
70
+ // Add a scale :
71
+ const scale = new itowns_widgets.Scale(view, {
72
+ position: 'bottom-right',
73
+ translate: { x: -70 },
84
74
  });
85
- view.addEventListener(itowns.PLANAR_CONTROL_EVENT.MOVED, function () {
86
- updateScaleWidget();
87
- })
88
75
 
89
76
  // Request redraw
90
77
  view.notifyChange();
@@ -3,130 +3,155 @@
3
3
  <title>Itowns - Globe</title>
4
4
 
5
5
  <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+
6
8
  <link rel="stylesheet" type="text/css" href="css/example.css">
7
9
  <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
10
+ <link rel="stylesheet" type="text/css" href="css/widgets.css">
8
11
 
9
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
12
  <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script>
11
13
  </head>
12
14
  <body>
13
15
  <div id="viewerDiv"></div>
14
- <span id="divScaleWidget"> Scale </span>
15
- <div id="miniDiv"></div>
16
16
 
17
- <script src="js/GUI/GuiTools.js"></script>
17
+ <!-- Import iTowns source code -->
18
18
  <script src="../dist/itowns.js"></script>
19
- <script src="js/GUI/LoadingScreen.js"></script>
20
19
  <script src="../dist/debug.js"></script>
20
+ <!-- Import iTowns Widgets plugin -->
21
+ <script src="../dist/itowns_widgets.js"></script>
22
+ <!-- Import iTowns LoadingScreen and GuiTools plugins -->
23
+ <script src="js/GUI/GuiTools.js"></script>
24
+ <script src="js/GUI/LoadingScreen.js"></script>
25
+
26
+
21
27
  <script type="text/javascript">
22
- // # Simple Globe viewer
23
- // Define initial camera position
24
- var placement = {
28
+
29
+
30
+
31
+ // ---------- CREATE A GlobeView FOR SUPPORTING DATA VISUALIZATION : ----------
32
+
33
+ // Define camera initial position
34
+ const placement = {
25
35
  coord: new itowns.Coordinates('EPSG:4326', 2.351323, 48.856712),
26
36
  range: 25000000,
27
37
  }
28
- var miniView;
29
- var minDistance = 10000000;
30
- var maxDistance = 30000000;
31
38
 
32
39
  // `viewerDiv` will contain iTowns' rendering area (`<canvas>`)
33
- var viewerDiv = document.getElementById('viewerDiv');
34
- var miniDiv = document.getElementById('miniDiv');
40
+ const viewerDiv = document.getElementById('viewerDiv');
41
+
42
+ // Create a GlobeView
43
+ const view = new itowns.GlobeView(viewerDiv, placement);
35
44
 
36
- // Instanciate iTowns GlobeView*
37
- var view = new itowns.GlobeView(viewerDiv, placement);
45
+ // Setup loading screen and debug menu
38
46
  setupLoadingScreen(viewerDiv, view);
47
+ const debugMenu = new GuiTools('menuDiv', view);
39
48
 
40
- // Dont' instance mini viewer if it's Test env
41
- miniView = new itowns.GlobeView(miniDiv, placement, {
42
- // `limit globe' subdivision level:
43
- // we're don't need a precise globe model
44
- // since the mini globe will always be seen from a far point of view (see minDistance above)
45
- maxSubdivisionLevel: 2,
46
- // Don't instance default controls since miniview's camera will be synced
47
- // on the main view's one (see view.addFrameRequester)
48
- noControls: true,
49
- });
50
49
 
51
- // Set a 0 alpha clear value (instead of the default '1')
52
- // because we want a transparent background for the miniglobe view to be able
53
- // to see the main view "behind"
54
- miniView.mainLoop.gfxEngine.renderer.setClearColor(0x000000, 0);
55
-
56
- // update miniview's camera with the view's camera position
57
- view.addFrameRequester(itowns.MAIN_LOOP_EVENTS.AFTER_RENDER, function updateMiniView() {
58
- // clamp distance camera from globe
59
- var distanceCamera = view.camera.camera3D.position.length();
60
- var distance = Math.min(Math.max(distanceCamera * 1.5, minDistance), maxDistance);
61
- var camera = miniView.camera.camera3D;
62
- var cameraTargetPosition = view.controls.getCameraTargetPosition();
63
- // Update target miniview's camera
64
- camera.position.copy(cameraTargetPosition).setLength(distance);
65
- camera.lookAt(cameraTargetPosition);
66
- miniView.notifyChange(camera);
67
- });
68
50
 
51
+ // ---------- DISPLAY ORTHO-IMAGES : ----------
69
52
 
70
- // Add one imagery layer to the scene and the miniView
71
- // This layer is defined in a json file but it could be defined as a plain js
72
- // object. See Layer* for more info.
53
+ // Add one imagery layer to the scene. This layer's properties are defined in a json file, but it could be
54
+ // defined as a plain js object. See `Layer` documentation for more info.
73
55
  itowns.Fetcher.json('./layers/JSONLayers/Ortho.json').then(function _(config) {
74
56
  config.source = new itowns.WMTSSource(config.source);
75
- var layer = new itowns.ColorLayer('Ortho', config);
76
- view.addLayer(layer).then(menuGlobe.addLayerGUI.bind(menuGlobe));
77
-
78
- var miniLayer = new itowns.ColorLayer('OrthoMini', config);
79
- miniView.addLayer(miniLayer);
57
+ view.addLayer(
58
+ new itowns.ColorLayer('Ortho', config),
59
+ ).then(debugMenu.addLayerGUI.bind(debugMenu));
80
60
  });
81
- // Add two elevation layers.
82
- // These will deform iTowns globe geometry to represent terrain elevation.
61
+
62
+
63
+
64
+ // ---------- DISPLAY A DIGITAL ELEVATION MODEL : ----------
65
+
66
+ // Add two elevation layers, each with a different level of detail. Here again, each layer's properties are
67
+ // defined in a json file.
83
68
  function addElevationLayerFromConfig(config) {
84
69
  config.source = new itowns.WMTSSource(config.source);
85
- var layer = new itowns.ElevationLayer(config.id, config);
86
- view.addLayer(layer).then(menuGlobe.addLayerGUI.bind(menuGlobe));
70
+ view.addLayer(
71
+ new itowns.ElevationLayer(config.id, config),
72
+ ).then(debugMenu.addLayerGUI.bind(debugMenu));
87
73
  }
88
74
  itowns.Fetcher.json('./layers/JSONLayers/WORLD_DTM.json').then(addElevationLayerFromConfig);
89
75
  itowns.Fetcher.json('./layers/JSONLayers/IGN_MNT_HIGHRES.json').then(addElevationLayerFromConfig);
90
76
 
91
- var menuGlobe = new GuiTools('menuDiv', view);
92
- var divScaleWidget = document.getElementById('divScaleWidget');
93
-
94
- function updateScaleWidget() {
95
- var value = view.getPixelsToMeters(200);
96
- value = Math.floor(value);
97
- var digit = Math.pow(10, value.toString().length - 1);
98
- value = Math.round(value / digit) * digit;
99
- var pix = view.getMetersToPixels(value);
100
- var unit = 'm';
101
- if (value >= 1000) {
102
- value /= 1000;
103
- unit = 'km';
104
- }
105
- divScaleWidget.innerHTML = `${value} ${unit}`;
106
- divScaleWidget.style.width = `${pix}px`;
107
- }
108
77
 
109
- // Listen for globe full initialisation event
110
- view.addEventListener(itowns.GLOBE_VIEW_EVENTS.GLOBE_INITIALIZED, function () {
111
- // eslint-disable-next-line no-console
112
- console.info('Globe initialized');
113
- updateScaleWidget();
78
+
79
+ // ---------- ADD SOME WIDGETS : ----------
80
+
81
+ // ADD A SCALE :
82
+ const scale = new itowns_widgets.Scale(view, { position: 'bottom-right', translate: { x: -80 } });
83
+
84
+ // ADD A MINIMAP :
85
+ const minimap = new itowns_widgets.Minimap(
86
+ view,
87
+ new itowns.ColorLayer('minimap', {
88
+ source: new itowns.VectorTilesSource({
89
+ style: 'https://wxs.ign.fr/essentiels/static/vectorTiles/styles/PLAN.IGN/gris.json',
90
+ // We don't display mountains and plot related data to ease visualisation
91
+ filter: (layer) => !layer['source-layer'].includes('oro_')
92
+ && !layer['source-layer'].includes('parcellaire'),
93
+ }),
94
+ addLabelLayer: true,
95
+ }),
96
+ { cursor: '+' },
97
+ );
98
+
99
+ // ADD NAVIGATION TOOLS :
100
+ const navigation = new itowns_widgets.Navigation(view, {
101
+ position: 'bottom-right',
102
+ translate: { y: -40 },
114
103
  });
115
- view.controls.addEventListener(itowns.CONTROL_EVENTS.RANGE_CHANGED, () => {
116
- updateScaleWidget();
104
+
105
+ // ADD A SEARCH BAR :
106
+
107
+ // You can find more precise explanation on searchbar options in the doc
108
+ // (http://www.itowns-project.org/itowns/docs/#api/Widgets/Searchbar) and in the searchbar example
109
+ // (https://www.itowns-project.org/itowns/examples/#widgets_searchbar)
110
+
111
+ // Define options for geocoding service that should be used by the searchbar.
112
+ const geocodingOptions = {
113
+ url: new URL(
114
+ 'https://wxs.ign.fr/ayxvok72rcocdyn8xyvy32og/ols/apis/completion?text=&type=StreetAddress,' +
115
+ 'PositionOfInterest',
116
+ ),
117
+ parser: (response) => {
118
+ const map = new Map();
119
+ response.results.forEach(location => {
120
+ map.set(location.fulltext, new itowns.Coordinates('EPSG:4326', location.x, location.y));
121
+ });
122
+ return map;
123
+ },
124
+ onSelected: (coordinates) => {
125
+ view.controls.lookAtCoordinate({ coord: coordinates, range: 20000, tilt: 45, heading: 0 });
126
+ },
127
+ }
128
+
129
+ // Create the searchbar
130
+ const searchbar = new itowns_widgets.Searchbar(view, geocodingOptions, {
131
+ maxSuggestionNumber: 15,
132
+ placeholder: 'Search a location in France',
133
+ position: 'top-right',
117
134
  });
118
135
 
136
+
137
+
138
+ // ---------- DISPLAY ATMOSPHERIC LIGHTING : ----------
139
+
119
140
  const atmosphere = view.getLayerById('atmosphere');
120
141
  atmosphere.setRealisticOn(!view.isDebugMode);
121
142
 
122
- const cRL = menuGlobe.addGUI('RealisticLighting', !view.isDebugMode, function (v) {
143
+
144
+
145
+ // ---------- DEBUG TOOLS : ----------
146
+
147
+ // Toggle atmospheric lighting on/off.
148
+ const cRL = debugMenu.addGUI('RealisticLighting', !view.isDebugMode, function (v) {
123
149
  atmosphere.setRealisticOn(v);
124
150
  view.notifyChange(atmosphere);
125
151
  });
126
152
 
127
- window.addEventListener('resize', updateScaleWidget);
153
+ debug.createTileDebugUI(debugMenu.gui, view);
128
154
 
129
- debug.createTileDebugUI(menuGlobe.gui, view);
130
155
  </script>
131
156
  </body>
132
157
  </html>
@@ -8,7 +8,9 @@
8
8
  <link rel="stylesheet" type="text/css" href="css/example.css">
9
9
  <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
10
10
 
11
- <!-- Import stylesheet for itowns Widgets plugin -->
11
+ <!-- Import stylesheet for itowns Widgets plugin. This stylesheet is included in the bundles if you downloaded
12
+ them, or it can be found in `node_modules/itowns/examples/css` if you installed iTowns with npm. Otherwise, it
13
+ can be found here : https://raw.githubusercontent.com/iTowns/itowns/master/examples/css/widgets.css -->
12
14
  <link rel="stylesheet" type="text/css" href="css/widgets.css">
13
15
 
14
16
  <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script>
@@ -8,7 +8,9 @@
8
8
  <link rel="stylesheet" type="text/css" href="css/example.css">
9
9
  <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
10
10
 
11
- <!-- Import stylesheet for itowns Widgets plugin -->
11
+ <!-- Import stylesheet for itowns Widgets plugin. This stylesheet is included in the bundles if you downloaded
12
+ them, or it can be found in `node_modules/itowns/examples/css` if you installed iTowns with npm. Otherwise, it
13
+ can be found here : https://raw.githubusercontent.com/iTowns/itowns/master/examples/css/widgets.css -->
12
14
  <link rel="stylesheet" type="text/css" href="css/widgets.css">
13
15
 
14
16
  <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script>
@@ -83,6 +85,7 @@
83
85
  widgets.addButton(
84
86
  'rotate-up',
85
87
  '<p style="font-size: 20px">&#8595</p>',
88
+ 'rotate camera up',
86
89
  () => {
87
90
  view.controls.lookAtCoordinate({
88
91
  tilt: view.controls.getTilt() - 10,
@@ -94,6 +97,7 @@
94
97
  widgets.addButton(
95
98
  'rotate-down',
96
99
  '<p style="font-size: 20px">&#8593</p>',
100
+ 'rotate camera down',
97
101
  () => {
98
102
  view.controls.lookAtCoordinate({
99
103
  tilt: view.controls.getTilt() + 10,
@@ -105,6 +109,7 @@
105
109
  widgets.addButton(
106
110
  'reset-position',
107
111
  '&#8634',
112
+ 'reset position',
108
113
  () => { view.controls.lookAtCoordinate(placement) },
109
114
  );
110
115