maplibre-gl-components 0.3.0 → 0.4.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 +174 -6
- package/dist/Terrain-1bxohZJX.cjs +2812 -0
- package/dist/Terrain-1bxohZJX.cjs.map +1 -0
- package/dist/Terrain-BbC-hVIs.js +2813 -0
- package/dist/Terrain-BbC-hVIs.js.map +1 -0
- package/dist/index.cjs +45 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +37 -27
- package/dist/maplibre-gl-components.css +327 -0
- package/dist/react.cjs +297 -13
- package/dist/react.cjs.map +1 -1
- package/dist/react.mjs +295 -11
- package/dist/react.mjs.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/core/Basemap.d.ts +206 -0
- package/dist/types/lib/core/Basemap.d.ts.map +1 -0
- package/dist/types/lib/core/BasemapReact.d.ts +32 -0
- package/dist/types/lib/core/BasemapReact.d.ts.map +1 -0
- package/dist/types/lib/core/Terrain.d.ts +165 -0
- package/dist/types/lib/core/Terrain.d.ts.map +1 -0
- package/dist/types/lib/core/TerrainReact.d.ts +32 -0
- package/dist/types/lib/core/TerrainReact.d.ts.map +1 -0
- package/dist/types/lib/core/types.d.ts +202 -0
- package/dist/types/lib/core/types.d.ts.map +1 -1
- package/dist/types/lib/hooks/index.d.ts +2 -0
- package/dist/types/lib/hooks/index.d.ts.map +1 -1
- package/dist/types/lib/hooks/useBasemap.d.ts +43 -0
- package/dist/types/lib/hooks/useBasemap.d.ts.map +1 -0
- package/dist/types/lib/hooks/useTerrain.d.ts +43 -0
- package/dist/types/lib/hooks/useTerrain.d.ts.map +1 -0
- package/dist/types/lib/utils/index.d.ts +1 -0
- package/dist/types/lib/utils/index.d.ts.map +1 -1
- package/dist/types/lib/utils/providers.d.ts +46 -0
- package/dist/types/lib/utils/providers.d.ts.map +1 -0
- package/dist/types/react.d.ts +4 -2
- package/dist/types/react.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/HtmlControl-CxD6T9bG.js +0 -1380
- package/dist/HtmlControl-CxD6T9bG.js.map +0 -1
- package/dist/HtmlControl-CzXIBk1H.cjs +0 -1379
- package/dist/HtmlControl-CzXIBk1H.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# maplibre-gl-components
|
|
2
2
|
|
|
3
|
-
Legend, colorbar, and HTML control components for MapLibre GL JS maps.
|
|
3
|
+
Legend, colorbar, basemap switcher, terrain toggle, and HTML control components for MapLibre GL JS maps.
|
|
4
4
|
|
|
5
5
|
[](https://badge.fury.io/js/maplibre-gl-components)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
@@ -9,6 +9,8 @@ Legend, colorbar, and HTML control components for MapLibre GL JS maps.
|
|
|
9
9
|
|
|
10
10
|
- **Colorbar** - Continuous gradient legends with built-in matplotlib colormaps
|
|
11
11
|
- **Legend** - Categorical legends with color swatches and labels
|
|
12
|
+
- **BasemapControl** - Interactive basemap switcher with 100+ providers from xyzservices
|
|
13
|
+
- **TerrainControl** - Toggle 3D terrain on/off using free AWS Terrarium elevation tiles
|
|
12
14
|
- **HtmlControl** - Flexible HTML content control for custom info panels
|
|
13
15
|
- **Zoom-based Visibility** - Show/hide components at specific zoom levels with `minzoom`/`maxzoom`
|
|
14
16
|
- **React Support** - First-class React components and hooks
|
|
@@ -27,7 +29,7 @@ npm install maplibre-gl-components
|
|
|
27
29
|
|
|
28
30
|
```typescript
|
|
29
31
|
import maplibregl from 'maplibre-gl';
|
|
30
|
-
import { Colorbar, Legend, HtmlControl } from 'maplibre-gl-components';
|
|
32
|
+
import { Colorbar, Legend, HtmlControl, BasemapControl, TerrainControl } from 'maplibre-gl-components';
|
|
31
33
|
import 'maplibre-gl-components/style.css';
|
|
32
34
|
|
|
33
35
|
const map = new maplibregl.Map({
|
|
@@ -37,6 +39,21 @@ const map = new maplibregl.Map({
|
|
|
37
39
|
zoom: 4,
|
|
38
40
|
});
|
|
39
41
|
|
|
42
|
+
// Add a terrain toggle control
|
|
43
|
+
const terrainControl = new TerrainControl({
|
|
44
|
+
exaggeration: 1.5,
|
|
45
|
+
hillshade: true,
|
|
46
|
+
});
|
|
47
|
+
map.addControl(terrainControl, 'top-right');
|
|
48
|
+
|
|
49
|
+
// Add a basemap switcher
|
|
50
|
+
const basemapControl = new BasemapControl({
|
|
51
|
+
defaultBasemap: 'OpenStreetMap.Mapnik',
|
|
52
|
+
showSearch: true,
|
|
53
|
+
filterGroups: ['OpenStreetMap', 'CartoDB', 'Stadia', 'Esri'],
|
|
54
|
+
});
|
|
55
|
+
map.addControl(basemapControl, 'top-left');
|
|
56
|
+
|
|
40
57
|
// Add a colorbar
|
|
41
58
|
const colorbar = new Colorbar({
|
|
42
59
|
colormap: 'viridis',
|
|
@@ -75,7 +92,7 @@ htmlControl.setHtml('<div><strong>Stats:</strong> 5,678 features</div>');
|
|
|
75
92
|
```tsx
|
|
76
93
|
import { useState, useEffect, useRef } from 'react';
|
|
77
94
|
import maplibregl from 'maplibre-gl';
|
|
78
|
-
import { ColorbarReact, LegendReact, HtmlControlReact } from 'maplibre-gl-components/react';
|
|
95
|
+
import { ColorbarReact, LegendReact, HtmlControlReact, BasemapReact, TerrainReact } from 'maplibre-gl-components/react';
|
|
79
96
|
import 'maplibre-gl-components/style.css';
|
|
80
97
|
|
|
81
98
|
function MyMap() {
|
|
@@ -104,6 +121,22 @@ function MyMap() {
|
|
|
104
121
|
|
|
105
122
|
{map && (
|
|
106
123
|
<>
|
|
124
|
+
<TerrainReact
|
|
125
|
+
map={map}
|
|
126
|
+
exaggeration={1.5}
|
|
127
|
+
hillshade
|
|
128
|
+
position="top-right"
|
|
129
|
+
onTerrainChange={(enabled) => console.log('Terrain:', enabled)}
|
|
130
|
+
/>
|
|
131
|
+
|
|
132
|
+
<BasemapReact
|
|
133
|
+
map={map}
|
|
134
|
+
defaultBasemap="OpenStreetMap.Mapnik"
|
|
135
|
+
showSearch
|
|
136
|
+
filterGroups={['OpenStreetMap', 'CartoDB', 'Stadia']}
|
|
137
|
+
position="top-left"
|
|
138
|
+
/>
|
|
139
|
+
|
|
107
140
|
<ColorbarReact
|
|
108
141
|
map={map}
|
|
109
142
|
colormap="viridis"
|
|
@@ -248,6 +281,113 @@ htmlControl.update(options)
|
|
|
248
281
|
htmlControl.getState()
|
|
249
282
|
```
|
|
250
283
|
|
|
284
|
+
### BasemapControl
|
|
285
|
+
|
|
286
|
+
An interactive basemap switcher that loads providers from [xyzservices](https://github.com/geopandas/xyzservices).
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
interface BasemapControlOptions {
|
|
290
|
+
basemaps?: BasemapItem[]; // Custom basemaps array
|
|
291
|
+
providersUrl?: string; // URL to fetch providers.json (defaults to xyzservices)
|
|
292
|
+
defaultBasemap?: string; // Initial basemap ID (e.g., 'OpenStreetMap.Mapnik')
|
|
293
|
+
position?: ControlPosition;
|
|
294
|
+
visible?: boolean;
|
|
295
|
+
collapsible?: boolean; // Whether control is collapsible (default: true)
|
|
296
|
+
collapsed?: boolean; // Whether control starts collapsed (default: true)
|
|
297
|
+
displayMode?: 'dropdown' | 'gallery' | 'list'; // UI mode (default: 'dropdown')
|
|
298
|
+
showSearch?: boolean; // Show search input (default: true)
|
|
299
|
+
filterGroups?: string[]; // Only include these provider groups
|
|
300
|
+
excludeGroups?: string[]; // Exclude these provider groups
|
|
301
|
+
excludeBroken?: boolean; // Exclude broken providers (default: true)
|
|
302
|
+
backgroundColor?: string;
|
|
303
|
+
maxWidth?: number;
|
|
304
|
+
maxHeight?: number;
|
|
305
|
+
fontSize?: number;
|
|
306
|
+
fontColor?: string;
|
|
307
|
+
minzoom?: number;
|
|
308
|
+
maxzoom?: number;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
interface BasemapItem {
|
|
312
|
+
id: string; // Unique identifier
|
|
313
|
+
name: string; // Display name
|
|
314
|
+
group?: string; // Provider group (e.g., 'OpenStreetMap')
|
|
315
|
+
url?: string; // XYZ tile URL template
|
|
316
|
+
style?: string; // MapLibre style URL
|
|
317
|
+
attribution?: string;
|
|
318
|
+
thumbnail?: string; // Preview image URL
|
|
319
|
+
maxZoom?: number;
|
|
320
|
+
minZoom?: number;
|
|
321
|
+
requiresApiKey?: boolean;
|
|
322
|
+
apiKey?: string;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Methods
|
|
326
|
+
basemapControl.show()
|
|
327
|
+
basemapControl.hide()
|
|
328
|
+
basemapControl.expand()
|
|
329
|
+
basemapControl.collapse()
|
|
330
|
+
basemapControl.toggle()
|
|
331
|
+
basemapControl.setBasemap(basemapId) // Switch to a basemap
|
|
332
|
+
basemapControl.getBasemaps() // Get available basemaps
|
|
333
|
+
basemapControl.addBasemap(basemap) // Add a custom basemap
|
|
334
|
+
basemapControl.removeBasemap(id) // Remove a basemap
|
|
335
|
+
basemapControl.setApiKey(id, key) // Set API key for a basemap
|
|
336
|
+
basemapControl.getSelectedBasemap() // Get currently selected basemap
|
|
337
|
+
basemapControl.update(options)
|
|
338
|
+
basemapControl.getState()
|
|
339
|
+
basemapControl.on('basemapchange', handler) // Listen for basemap changes
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**Available Provider Groups:**
|
|
343
|
+
- OpenStreetMap, CartoDB, Stadia, Esri, OpenTopoMap
|
|
344
|
+
- Thunderforest, MapBox, MapTiler (require API keys)
|
|
345
|
+
- NASAGIBS, OpenSeaMap, and 20+ more
|
|
346
|
+
|
|
347
|
+
### TerrainControl
|
|
348
|
+
|
|
349
|
+
A toggle control for 3D terrain rendering using free AWS Terrarium elevation tiles.
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
interface TerrainControlOptions {
|
|
353
|
+
sourceUrl?: string; // Terrain tile URL (default: AWS Terrarium)
|
|
354
|
+
encoding?: 'terrarium' | 'mapbox'; // Terrain encoding (default: 'terrarium')
|
|
355
|
+
exaggeration?: number; // Vertical scale factor (default: 1.0)
|
|
356
|
+
enabled?: boolean; // Initial terrain state (default: false)
|
|
357
|
+
hillshade?: boolean; // Add hillshade layer (default: true)
|
|
358
|
+
hillshadeExaggeration?: number; // Hillshade intensity (default: 0.5)
|
|
359
|
+
position?: ControlPosition;
|
|
360
|
+
visible?: boolean;
|
|
361
|
+
backgroundColor?: string;
|
|
362
|
+
borderRadius?: number;
|
|
363
|
+
opacity?: number;
|
|
364
|
+
minzoom?: number; // Min zoom level to show (default: 0)
|
|
365
|
+
maxzoom?: number; // Max zoom level to show (default: 24)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Methods
|
|
369
|
+
terrainControl.show()
|
|
370
|
+
terrainControl.hide()
|
|
371
|
+
terrainControl.enable() // Enable terrain
|
|
372
|
+
terrainControl.disable() // Disable terrain
|
|
373
|
+
terrainControl.toggle() // Toggle terrain on/off
|
|
374
|
+
terrainControl.isEnabled() // Check if terrain is enabled
|
|
375
|
+
terrainControl.setExaggeration(value) // Set vertical exaggeration (0.1 - 10.0)
|
|
376
|
+
terrainControl.getExaggeration() // Get current exaggeration
|
|
377
|
+
terrainControl.enableHillshade() // Enable hillshade layer
|
|
378
|
+
terrainControl.disableHillshade() // Disable hillshade layer
|
|
379
|
+
terrainControl.toggleHillshade() // Toggle hillshade layer
|
|
380
|
+
terrainControl.update(options)
|
|
381
|
+
terrainControl.getState()
|
|
382
|
+
terrainControl.on('terrainchange', handler) // Listen for terrain toggle
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**Terrain Source:**
|
|
386
|
+
The control uses free terrain tiles from AWS:
|
|
387
|
+
- URL: `https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png`
|
|
388
|
+
- Encoding: Terrarium RGB-encoded elevation data
|
|
389
|
+
- No API key required
|
|
390
|
+
|
|
251
391
|
## Built-in Colormaps
|
|
252
392
|
|
|
253
393
|
### Sequential
|
|
@@ -353,12 +493,14 @@ const colorbar = new Colorbar({
|
|
|
353
493
|
## React Hooks
|
|
354
494
|
|
|
355
495
|
```typescript
|
|
356
|
-
import { useColorbar, useLegend, useHtmlControl } from 'maplibre-gl-components/react';
|
|
496
|
+
import { useColorbar, useLegend, useHtmlControl, useBasemap, useTerrain } from 'maplibre-gl-components/react';
|
|
357
497
|
|
|
358
498
|
function MyComponent() {
|
|
359
499
|
const colorbar = useColorbar({ colormap: 'viridis', vmin: 0, vmax: 100 });
|
|
360
500
|
const legend = useLegend({ items: [...] });
|
|
361
501
|
const htmlControl = useHtmlControl({ html: '...' });
|
|
502
|
+
const basemap = useBasemap({ selectedBasemap: 'OpenStreetMap.Mapnik' });
|
|
503
|
+
const terrain = useTerrain({ enabled: false, exaggeration: 1.5 });
|
|
362
504
|
|
|
363
505
|
return (
|
|
364
506
|
<>
|
|
@@ -368,10 +510,26 @@ function MyComponent() {
|
|
|
368
510
|
<button onClick={() => legend.toggle()}>
|
|
369
511
|
Toggle Legend
|
|
370
512
|
</button>
|
|
371
|
-
<button onClick={() =>
|
|
372
|
-
|
|
513
|
+
<button onClick={() => basemap.setBasemap('CartoDB.Positron')}>
|
|
514
|
+
Change Basemap
|
|
515
|
+
</button>
|
|
516
|
+
<button onClick={() => terrain.toggle()}>
|
|
517
|
+
Toggle Terrain
|
|
373
518
|
</button>
|
|
374
519
|
|
|
520
|
+
<TerrainReact
|
|
521
|
+
map={map}
|
|
522
|
+
enabled={terrain.state.enabled}
|
|
523
|
+
exaggeration={terrain.state.exaggeration}
|
|
524
|
+
onTerrainChange={(enabled) => terrain.setEnabled(enabled)}
|
|
525
|
+
/>
|
|
526
|
+
|
|
527
|
+
<BasemapReact
|
|
528
|
+
map={map}
|
|
529
|
+
defaultBasemap={basemap.state.selectedBasemap}
|
|
530
|
+
onBasemapChange={(b) => basemap.setBasemap(b.id)}
|
|
531
|
+
/>
|
|
532
|
+
|
|
375
533
|
<ColorbarReact
|
|
376
534
|
map={map}
|
|
377
535
|
{...colorbar.state}
|
|
@@ -404,6 +562,16 @@ The default styles can be customized using CSS:
|
|
|
404
562
|
.maplibre-gl-html-control {
|
|
405
563
|
max-width: 400px;
|
|
406
564
|
}
|
|
565
|
+
|
|
566
|
+
/* Override basemap control styles */
|
|
567
|
+
.maplibre-gl-basemap {
|
|
568
|
+
max-width: 300px;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/* Override terrain control styles */
|
|
572
|
+
.maplibre-gl-terrain-button {
|
|
573
|
+
color: #0078d7;
|
|
574
|
+
}
|
|
407
575
|
```
|
|
408
576
|
|
|
409
577
|
## Examples
|