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.
- package/README.md +18 -1
- package/dist/mapbox-gl-shadow-simulator.d.ts +3 -0
- package/dist/mapbox-gl-shadow-simulator.esm.js +2 -2
- package/dist/mapbox-gl-shadow-simulator.umd.min.js +2 -2
- package/examples/map.html +246 -196
- package/examples/maplibre.html +257 -214
- package/examples/markers-maplibre.html +304 -0
- package/examples/markers.html +197 -0
- package/package.json +1 -1
- package/dist/leaflet-shademap/leaflet-shademap/dist/ShadeMap.d.ts +0 -122
- package/dist/leaflet-shademap/leaflet-shademap/dist/ShadeMapLeaflet.d.ts +0 -17
- package/dist/leaflet-shademap/leaflet-shademap/dist/ShadeMapMapbox.d.ts +0 -29
- package/dist/leaflet-shademap/leaflet-shademap/dist/buildings/BuildingRasterizer.d.ts +0 -42
- package/dist/leaflet-shademap/leaflet-shademap/dist/buildings/fetch-buildings.d.ts +0 -12
- package/dist/leaflet-shademap/leaflet-shademap/dist/buildings/normalize-buildings.d.ts +0 -8
- package/dist/leaflet-shademap/leaflet-shademap/dist/components/CanvasOverlay.d.ts +0 -11
- package/dist/leaflet-shademap/leaflet-shademap/dist/index.d.ts +0 -7
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/EventEmitter.d.ts +0 -10
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/TileMerger.d.ts +0 -49
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/heightMap.d.ts +0 -33
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/helpers.d.ts +0 -33
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/image.d.ts +0 -13
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/projection.d.ts +0 -3
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/shadowMap.d.ts +0 -17
- package/dist/leaflet-shademap/leaflet-shademap/dist/lib/webgl.d.ts +0 -13
- package/dist/leaflet-shademap/leaflet-shademap/dist/map/geometryLeaflet.d.ts +0 -11
- package/dist/leaflet-shademap/leaflet-shademap/dist/map/umap.d.ts +0 -26
- package/dist/leaflet-shademap/leaflet-shademap/dist/shader/gpu.d.ts +0 -35
- package/dist/leaflet-shademap/leaflet-shademap/dist/shader/kernel.d.ts +0 -72
- package/dist/leaflet-shademap/leaflet-shademap/dist/types/color.d.ts +0 -5
- package/dist/leaflet-shademap/leaflet-shademap/dist/types/constants.d.ts +0 -3
- package/dist/leaflet-shademap/leaflet-shademap/dist/types/quality.d.ts +0 -5
- package/dist/leaflet-shademap/leaflet-shademap/dist/types/shadeMapOptions.d.ts +0 -46
- 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
|
-
<
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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>
|