mapbox-gl-shadow-simulator 0.61.1 → 0.62.0

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 (34) hide show
  1. package/README.md +18 -1
  2. package/dist/mapbox-gl-shadow-simulator.d.ts +3 -0
  3. package/dist/mapbox-gl-shadow-simulator.esm.js +2 -2
  4. package/dist/mapbox-gl-shadow-simulator.umd.min.js +2 -2
  5. package/examples/map.html +246 -196
  6. package/examples/maplibre.html +257 -214
  7. package/examples/markers-maplibre.html +304 -0
  8. package/examples/markers.html +197 -0
  9. package/package.json +1 -1
  10. package/dist/leaflet-shademap/leaflet-shademap/dist/ShadeMap.d.ts +0 -122
  11. package/dist/leaflet-shademap/leaflet-shademap/dist/ShadeMapLeaflet.d.ts +0 -17
  12. package/dist/leaflet-shademap/leaflet-shademap/dist/ShadeMapMapbox.d.ts +0 -29
  13. package/dist/leaflet-shademap/leaflet-shademap/dist/buildings/BuildingRasterizer.d.ts +0 -42
  14. package/dist/leaflet-shademap/leaflet-shademap/dist/buildings/fetch-buildings.d.ts +0 -12
  15. package/dist/leaflet-shademap/leaflet-shademap/dist/buildings/normalize-buildings.d.ts +0 -8
  16. package/dist/leaflet-shademap/leaflet-shademap/dist/components/CanvasOverlay.d.ts +0 -11
  17. package/dist/leaflet-shademap/leaflet-shademap/dist/index.d.ts +0 -7
  18. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/EventEmitter.d.ts +0 -10
  19. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/TileMerger.d.ts +0 -49
  20. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/heightMap.d.ts +0 -33
  21. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/helpers.d.ts +0 -33
  22. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/image.d.ts +0 -13
  23. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/projection.d.ts +0 -3
  24. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/shadowMap.d.ts +0 -17
  25. package/dist/leaflet-shademap/leaflet-shademap/dist/lib/webgl.d.ts +0 -13
  26. package/dist/leaflet-shademap/leaflet-shademap/dist/map/geometryLeaflet.d.ts +0 -11
  27. package/dist/leaflet-shademap/leaflet-shademap/dist/map/umap.d.ts +0 -26
  28. package/dist/leaflet-shademap/leaflet-shademap/dist/shader/gpu.d.ts +0 -35
  29. package/dist/leaflet-shademap/leaflet-shademap/dist/shader/kernel.d.ts +0 -72
  30. package/dist/leaflet-shademap/leaflet-shademap/dist/types/color.d.ts +0 -5
  31. package/dist/leaflet-shademap/leaflet-shademap/dist/types/constants.d.ts +0 -3
  32. package/dist/leaflet-shademap/leaflet-shademap/dist/types/quality.d.ts +0 -5
  33. package/dist/leaflet-shademap/leaflet-shademap/dist/types/shadeMapOptions.d.ts +0 -46
  34. package/dist/leaflet-shademap/leaflet-shademap/dist/types/shadow3DData.d.ts +0 -21
package/examples/map.html CHANGED
@@ -1,198 +1,248 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
-
4
- <head>
5
- <meta charset="UTF-8" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <meta http-equiv="X-UA-Compatible" content="ie=edge" />
8
- <link href='https://api.mapbox.com/mapbox-gl-js/v2.8.2/mapbox-gl.css' rel='stylesheet' />
9
- <script src='https://api.mapbox.com/mapbox-gl-js/v2.8.2/mapbox-gl.js'></script>
10
- <script src='https://www.unpkg.com/suncalc@1.9.0/suncalc.js'></script>
11
- <script src="../dist/mapbox-gl-shadow-simulator.umd.min.js"></script>
12
- <style>
13
- body {
14
- padding: 0px;
15
- margin: 0px;
16
- }
17
-
18
- #mapid {
19
- height: 100vh;
20
- }
21
-
22
- .mapbox-control-time {
23
- padding: 20px;
24
- background-color: white;
25
- }
26
-
27
- #exposure-gradient-container {
28
- display: none;
29
- background-color: white;
30
- padding: 0 10px 5px;
31
- }
32
-
33
- #exposure-gradient {
34
- height: 20px;
35
- background-image: linear-gradient(to right, rgb(0 0 255/ 0.5), rgb(0 255 0 / 0.5), rgb(255 0 0 / 0.5));
36
- display: flex;
37
- }
38
-
39
- #exposure-gradient>div {
40
- flex: 1;
41
- border: 1px solid white;
42
- text-align: center;
43
- font-weight: bold;
44
- }
45
- </style>
46
- <title>Shade Map Mapbox example</title>
47
- </head>
48
-
49
- <body>
50
- <div id="mapid">
51
- <div class="mapboxgl-control-container" style="z-index: 2000; pointer-events: auto;">
52
- <div class="mapboxgl-ctrl-top-left">
53
- <div class="mapbox-control-time" style="pointer-events: auto;">
54
- <button id="decrement">-1 hour</button>
55
- <button id="increment">+1 hour</button>
56
- <button id="play">Play</button>
57
- <button id="stop">Stop</button>
58
- <label><input id="exposure" type="checkbox" autocomplete="off" />Full-day sun exposure</label>
59
- <button>
60
- <a href="https://shademap.app/about" target="_blank">Get API key</a>
61
- </button>
62
- <span id="loader" style="padding: 3px;"></span>
63
- </div>
64
- <div id="exposure-gradient-container">
65
- <div>Hours of sunlight</div>
66
- <div id="exposure-gradient"></div>
67
- </div>
68
- </div>
69
- </div>
70
- </div>
71
- <script>
72
- const mapLoaded = (map) => {
73
- return new Promise((res, rej) => {
74
- function cb() {
75
- if (!map.loaded()) {
76
- return;
77
- }
78
- map.off("render", cb);
79
- res();
80
- }
81
- map.on("render", cb);
82
- cb();
83
- });
84
- };
85
- /* Mapbox setup */
86
- mapboxgl.accessToken = 'pk.eyJ1IjoidHBwaW90cm93c2tpIiwiYSI6ImNsNGVpdzMxYzAzenUzb28zYXZ4MXdlc2EifQ.M4IHx7SY0Wv5Zt6xzvKeBQ';
87
- const map = new mapboxgl.Map({
88
- container: 'mapid',
89
- style: 'mapbox://styles/mapbox/streets-v11',
90
- center: { lng: -122.18578164139899, lat: 47.694878957368815 },
91
- zoom: 8, // starting zoom
92
- hash: true
93
- });
94
- /* End Mapbox setup */
95
-
96
- /* ShadeMap setup */
97
- const loaderEl = document.getElementById('loader');
98
- let now = new Date((SunCalc.getTimes(new Date(), 47.694878957368815, -122.18578164139899).sunrise).getTime() + 60 * 60 * 1000);
99
- let shadeMap;
100
- map.on('load', () => {
101
- shadeMap = new ShadeMap({
102
- apiKey: "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRwcGlvdHJvd3NraUBzaGFkZW1hcC5hcHAiLCJjcmVhdGVkIjoxNjYyNDkzMDY2Nzk0LCJpYXQiOjE2NjI0OTMwNjZ9.ovCrLTYsdKFTF6TW3DuODxCaAtGQ3qhcmqj3DWcol5g",
103
- date: now,
104
- color: '#01112f',
105
- opacity: 0.7,
106
- terrainSource: {
107
- maxZoom: 15,
108
- tileSize: 256,
109
- getSourceUrl: ({ x, y, z }) => `https://s3.amazonaws.com/elevation-tiles-prod/terrarium/${z}/${x}/${y}.png`,
110
- getElevation: ({ r, g, b, a }) => (r * 256 + g + b / 256) - 32768,
111
- _overzoom: 18,
112
- },
113
- getFeatures: async () => {
114
- await mapLoaded(map);
115
- const buildingData = map.querySourceFeatures('composite', { sourceLayer: 'building' }).filter((feature) => {
116
- return feature.properties && feature.properties.underground !== "true" && (feature.properties.height || feature.properties.render_height)
117
- });
118
- return buildingData;
119
- },
120
- debug: (msg) => { console.log(new Date().toISOString(), msg) }
121
- }).addTo(map);
122
-
123
- shadeMap.on('tileloaded', (loadedTiles, totalTiles) => {
124
- loaderEl.innerText = `Loading: ${(loadedTiles / totalTiles * 100).toFixed(0)}%`;
125
- });
126
- });
127
- /* End ShadeMap setup */
128
-
129
- /* Controls setup */
130
- let intervalTimer;
131
-
132
- const increment = document.getElementById('increment');
133
- const decrement = document.getElementById('decrement');
134
- const play = document.getElementById('play');
135
- const stop = document.getElementById('stop');
136
- const exposure = document.getElementById('exposure');
137
- const exposureGradientContainer = document.getElementById('exposure-gradient-container');
138
- const exposureGradient = document.getElementById('exposure-gradient');
139
-
140
- increment.addEventListener('click', () => {
141
- now = new Date(now.getTime() + 3600000);
142
- shadeMap && shadeMap.setDate(now);
143
- }, false);
144
-
145
- decrement.addEventListener('click', () => {
146
- now = new Date(now.getTime() - 3600000);
147
- shadeMap && shadeMap.setDate(now);
148
- }, false);
149
-
150
- play.addEventListener('click', () => {
151
- intervalTimer = setInterval(() => {
152
- now = new Date(now.getTime() + 60000);
153
- shadeMap && shadeMap.setDate(now);
154
- }, 100);
155
- });
156
-
157
- stop.addEventListener('click', () => {
158
- clearInterval(intervalTimer);
159
- })
160
-
161
- exposure.addEventListener('click', (e) => {
162
- clearInterval(intervalTimer);
163
- const target = e.target;
164
- if (!target.checked) {
165
- shadeMap && shadeMap.setSunExposure(false);
166
- increment.disabled = false;
167
- decrement.disabled = false;
168
- play.disabled = false;
169
- stop.disabled = false;
170
- exposureGradientContainer.style.display = 'none';
171
- } else {
172
- const { lat, lng } = map.getCenter();
173
- const { sunrise, sunset } = SunCalc.getTimes(now, lat, lng);
174
- shadeMap && shadeMap.setSunExposure(true, {
175
- startDate: sunrise,
176
- endDate: sunset
177
- });
178
- increment.disabled = true
179
- decrement.disabled = true;
180
- play.disabled = true;
181
- stop.disabled = true;
182
-
183
- const hours = (sunset - sunrise) / 1000 / 3600;
184
- const partial = hours - Math.floor(hours);
185
- const html = [];
186
- for (let i = 0; i < hours; i++) {
187
- html.push(`<div>${i + 1}</div>`)
188
- }
189
- html.push(`<div style="flex: ${partial}"></div>`);
190
- exposureGradientContainer.style.display = 'block';
191
- exposureGradient.innerHTML = html.join('');
192
- }
193
- })
194
- /* End controls setup */
195
- </script>
196
- </body>
197
-
198
- </html>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta http-equiv="X-UA-Compatible" content="ie=edge" />
7
+ <link
8
+ href="https://api.mapbox.com/mapbox-gl-js/v2.8.2/mapbox-gl.css"
9
+ rel="stylesheet"
10
+ />
11
+ <script src="https://api.mapbox.com/mapbox-gl-js/v2.8.2/mapbox-gl.js"></script>
12
+ <script src="https://www.unpkg.com/suncalc@1.9.0/suncalc.js"></script>
13
+ <script src="../dist/mapbox-gl-shadow-simulator.umd.min.js"></script>
14
+ <style>
15
+ body {
16
+ padding: 0px;
17
+ margin: 0px;
18
+ }
19
+
20
+ #mapid {
21
+ height: 100vh;
22
+ }
23
+
24
+ .mapbox-control-time {
25
+ padding: 20px;
26
+ background-color: white;
27
+ }
28
+
29
+ #exposure-gradient-container {
30
+ display: none;
31
+ background-color: white;
32
+ padding: 0 10px 5px;
33
+ }
34
+
35
+ #exposure-gradient {
36
+ height: 20px;
37
+ background-image: linear-gradient(
38
+ to right,
39
+ rgb(0 0 255/ 0.5),
40
+ rgb(0 255 0 / 0.5),
41
+ rgb(255 0 0 / 0.5)
42
+ );
43
+ display: flex;
44
+ }
45
+
46
+ #exposure-gradient > div {
47
+ flex: 1;
48
+ border: 1px solid white;
49
+ text-align: center;
50
+ font-weight: bold;
51
+ }
52
+ </style>
53
+ <title>mapbox-gl-shadow-simulator Mapbox Example</title>
54
+ </head>
55
+
56
+ <body>
57
+ <div id="mapid">
58
+ <div
59
+ class="mapboxgl-control-container"
60
+ style="z-index: 2000; pointer-events: auto"
61
+ >
62
+ <div class="mapboxgl-ctrl-top-left">
63
+ <div class="mapbox-control-time" style="pointer-events: auto">
64
+ <button id="decrement">-1 hour</button>
65
+ <button id="increment">+1 hour</button>
66
+ <button id="play">Play</button>
67
+ <button id="stop">Stop</button>
68
+ <label
69
+ ><input
70
+ id="exposure"
71
+ type="checkbox"
72
+ autocomplete="off"
73
+ />Full-day sun exposure</label
74
+ >
75
+ <button>
76
+ <a href="https://shademap.app/about" target="_blank"
77
+ >Get API key</a
78
+ >
79
+ </button>
80
+ <span id="loader" style="padding: 3px"></span>
81
+ </div>
82
+ <div id="exposure-gradient-container">
83
+ <div>Hours of sunlight</div>
84
+ <div id="exposure-gradient"></div>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ <script>
90
+ const mapLoaded = (map) => {
91
+ return new Promise((res, rej) => {
92
+ function cb() {
93
+ if (!map.loaded()) {
94
+ return;
95
+ }
96
+ map.off("render", cb);
97
+ res();
98
+ }
99
+ map.on("render", cb);
100
+ cb();
101
+ });
102
+ };
103
+ /* Mapbox setup */
104
+ mapboxgl.accessToken =
105
+ "pk.eyJ1IjoidHBwaW90cm93c2tpIiwiYSI6ImNsNGVpdzMxYzAzenUzb28zYXZ4MXdlc2EifQ.M4IHx7SY0Wv5Zt6xzvKeBQ";
106
+ const map = new mapboxgl.Map({
107
+ container: "mapid",
108
+ style: "mapbox://styles/mapbox/streets-v11",
109
+ center: { lng: -122.18578164139899, lat: 47.694878957368815 },
110
+ zoom: 8, // starting zoom
111
+ hash: true,
112
+ });
113
+ /* End Mapbox setup */
114
+
115
+ /* ShadeMap setup */
116
+ const loaderEl = document.getElementById("loader");
117
+ let now = new Date(
118
+ SunCalc.getTimes(
119
+ new Date(),
120
+ 47.694878957368815,
121
+ -122.18578164139899
122
+ ).sunrise.getTime() +
123
+ 60 * 60 * 1000
124
+ );
125
+ let shadeMap;
126
+ map.on("load", () => {
127
+ shadeMap = new ShadeMap({
128
+ apiKey:
129
+ "eyJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRwcGlvdHJvd3NraUBzaGFkZW1hcC5hcHAiLCJjcmVhdGVkIjoxNjYyNDkzMDY2Nzk0LCJpYXQiOjE2NjI0OTMwNjZ9.ovCrLTYsdKFTF6TW3DuODxCaAtGQ3qhcmqj3DWcol5g",
130
+ date: now,
131
+ color: "#01112f",
132
+ opacity: 0.7,
133
+ terrainSource: {
134
+ maxZoom: 15,
135
+ tileSize: 256,
136
+ getSourceUrl: ({ x, y, z }) =>
137
+ `https://s3.amazonaws.com/elevation-tiles-prod/terrarium/${z}/${x}/${y}.png`,
138
+ getElevation: ({ r, g, b, a }) => r * 256 + g + b / 256 - 32768,
139
+ _overzoom: 18,
140
+ },
141
+ getFeatures: async () => {
142
+ await mapLoaded(map);
143
+ const buildingData = map
144
+ .querySourceFeatures("composite", { sourceLayer: "building" })
145
+ .filter((feature) => {
146
+ return (
147
+ feature.properties &&
148
+ feature.properties.underground !== "true" &&
149
+ (feature.properties.height ||
150
+ feature.properties.render_height)
151
+ );
152
+ });
153
+ return buildingData;
154
+ },
155
+ debug: (msg) => {
156
+ console.log(new Date().toISOString(), msg);
157
+ },
158
+ }).addTo(map);
159
+
160
+ shadeMap.on("tileloaded", (loadedTiles, totalTiles) => {
161
+ loaderEl.innerText = `Loading: ${(
162
+ (loadedTiles / totalTiles) *
163
+ 100
164
+ ).toFixed(0)}%`;
165
+ });
166
+ });
167
+ /* End ShadeMap setup */
168
+
169
+ /* Controls setup */
170
+ let intervalTimer;
171
+
172
+ const increment = document.getElementById("increment");
173
+ const decrement = document.getElementById("decrement");
174
+ const play = document.getElementById("play");
175
+ const stop = document.getElementById("stop");
176
+ const exposure = document.getElementById("exposure");
177
+ const exposureGradientContainer = document.getElementById(
178
+ "exposure-gradient-container"
179
+ );
180
+ const exposureGradient = document.getElementById("exposure-gradient");
181
+
182
+ increment.addEventListener(
183
+ "click",
184
+ () => {
185
+ now = new Date(now.getTime() + 3600000);
186
+ shadeMap && shadeMap.setDate(now);
187
+ },
188
+ false
189
+ );
190
+
191
+ decrement.addEventListener(
192
+ "click",
193
+ () => {
194
+ now = new Date(now.getTime() - 3600000);
195
+ shadeMap && shadeMap.setDate(now);
196
+ },
197
+ false
198
+ );
199
+
200
+ play.addEventListener("click", () => {
201
+ intervalTimer = setInterval(() => {
202
+ now = new Date(now.getTime() + 60000);
203
+ shadeMap && shadeMap.setDate(now);
204
+ }, 100);
205
+ });
206
+
207
+ stop.addEventListener("click", () => {
208
+ clearInterval(intervalTimer);
209
+ });
210
+
211
+ exposure.addEventListener("click", (e) => {
212
+ clearInterval(intervalTimer);
213
+ const target = e.target;
214
+ if (!target.checked) {
215
+ shadeMap && shadeMap.setSunExposure(false);
216
+ increment.disabled = false;
217
+ decrement.disabled = false;
218
+ play.disabled = false;
219
+ stop.disabled = false;
220
+ exposureGradientContainer.style.display = "none";
221
+ } else {
222
+ const { lat, lng } = map.getCenter();
223
+ const { sunrise, sunset } = SunCalc.getTimes(now, lat, lng);
224
+ shadeMap &&
225
+ shadeMap.setSunExposure(true, {
226
+ startDate: sunrise,
227
+ endDate: sunset,
228
+ });
229
+ increment.disabled = true;
230
+ decrement.disabled = true;
231
+ play.disabled = true;
232
+ stop.disabled = true;
233
+
234
+ const hours = (sunset - sunrise) / 1000 / 3600;
235
+ const partial = hours - Math.floor(hours);
236
+ const html = [];
237
+ for (let i = 0; i < hours; i++) {
238
+ html.push(`<div>${i + 1}</div>`);
239
+ }
240
+ html.push(`<div style="flex: ${partial}"></div>`);
241
+ exposureGradientContainer.style.display = "block";
242
+ exposureGradient.innerHTML = html.join("");
243
+ }
244
+ });
245
+ /* End controls setup */
246
+ </script>
247
+ </body>
248
+ </html>