Skip to content

Commit 86834b5

Browse files
committed
Allow fixing a set of zoom levels
to close #312
1 parent e138078 commit 86834b5

File tree

7 files changed

+54
-1
lines changed

7 files changed

+54
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ mapbox.token
66
worldmap/ml3d.html
77
worldmap/unitgenerator.html
88
*.pmtiles
9+
worldmap/images/world-110m-flat.json

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
### Change Log for Node-RED Worldmap
22

3+
- v5.4.0 - Let msg.payload.command.zoomLevels set an array of acceptable zoom levels. Issue #312
34
- v5.3.0 - Let msg.payload.popupOptions object set Leaflet popup options so it can be customised. Issue #311
45
- v5.2.0 - Allow left click send back co-ords. Let Button be replaceable more easily and take value property. Issue #308 and #309
56
- v5.1.6 - Let Cot __milsym set the SIDC if present.

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Feel free to [![](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%
1313

1414
### Updates
1515

16+
- v5.4.0 - Let msg.payload.command.zoomLevels set an array of acceptable zoom levels. Issue #312
1617
- v5.3.0 - Let msg.payload.popupOptions object set Leaflet popup options so it can be customised. Issue #311
1718
- v5.2.0 - Allow left click send back co-ords. Let Button be replaceable more easily and take value property. Issue #308 and #309
1819
- v5.1.6 - Let Cot __milsym set the SIDC if present.
@@ -377,6 +378,7 @@ Optional properties for **msg.payload.command** include
377378
- **lat** - move map to specified latitude.
378379
- **lon** - move map to specified longitude.
379380
- **zoom** - move map to specified zoom level (1 - world, 13 to 20 max zoom depending on map).
381+
- **zoomLevels** - an array of accepted zoom levels to switch between if you map only supports certain scalings - set to null to clear.
380382
- **bounds** - if set to an array `[ [ lat(S), lon(W) ], [lat(N), lon(E)] ]` - sets the overall map bounds.
381383
- **rotation** - rotate the base map to the specified compass angle.
382384
- **layer** - set map to specified base layer name - `{"command":{"layer":"Esri"}}`

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "node-red-contrib-web-worldmap",
3-
"version": "5.3.0",
3+
"version": "5.4.0",
44
"description": "A Node-RED node to provide a web page of a world map for plotting things on.",
55
"dependencies": {
66
"@turf/bezier-spline": "~7.2.0",

worldmap/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
<script src="leaflet/esri-leaflet.js"></script>
7979
<script src="leaflet/protomaps-leaflet.min.js"></script>
8080
<script src="leaflet/Semicircle.js"></script>
81+
<script src="leaflet/Leaflet.LimitZoom.js"></script>
8182
<script src="leaflet/leaflet-arc.min.js"></script>
8283
<script src="leaflet/leaflet.antimeridian-src.js"></script>
8384
<script src="leaflet/L.TileLayer.PixelFilter.js"></script>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Limit leaflet map zoom to a list of variants
2+
// Written by Ilya Zverev, licensed WTFPL
3+
4+
L.Map.mergeOptions({
5+
zooms: [] // array of integers
6+
});
7+
8+
L.Map.include({
9+
_limitZoom: function (zoom) {
10+
var zooms = this.options.zooms;
11+
if (!zooms || !('length' in zooms) || !zooms.length) {
12+
var min = this.getMinZoom(),
13+
max = this.getMaxZoom(),
14+
snap = L.Browser.any3d ? this.options.zoomSnap : 1;
15+
if (snap) {
16+
zoom = Math.round(zoom / snap) * snap;
17+
}
18+
return Math.max(min, Math.min(max, zoom));
19+
} else {
20+
var z, d = 100, i, dist;
21+
var dz = -1, dd = 100, dir = zoom - this._zoom;
22+
var snap = L.Browser.any3d ? this.options.zoomSnap : 1;
23+
if (snap) {
24+
zoom = Math.round(zoom / snap) * snap;
25+
}
26+
for (i = 0; i < zooms.length; i++) {
27+
dist = Math.abs(zooms[i] - zoom);
28+
if (dist < d) {
29+
z = zooms[i];
30+
d = dist;
31+
}
32+
if (dir * (zooms[i] - this._zoom) > 0 && dist < dd) {
33+
dz = zooms[i];
34+
dd = dist;
35+
}
36+
}
37+
return dz < 0 ? z : dz;
38+
}
39+
}
40+
});

worldmap/worldmap.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3127,6 +3127,14 @@ function doCommand(cmd) {
31273127
document.getElementById("lockit").checked = lockit;
31283128
}
31293129
// if (cmd.hasOwnProperty("panlock") && lockit === true) { doLock(true); }
3130+
3131+
if (cmd.hasOwnProperty("zoomLevels")) {
3132+
if (Array.isArray(cmd.zoomLevels) && cmd?.zoomLevels.length > 0) {
3133+
map.options.zooms = cmd.zoomLevels;
3134+
}
3135+
else { delete map.options.zooms; }
3136+
}
3137+
31303138
// Move to a new position
31313139
var clat = map.getCenter().lat;
31323140
var clon = map.getCenter().lng;

0 commit comments

Comments
 (0)