parent
071007f11c
commit
3e51895d45
@ -1,5 +1,7 @@
|
|||||||
### Change Log for Node-RED Worldmap
|
### Change Log for Node-RED Worldmap
|
||||||
|
|
||||||
|
- v1.5.16 - Allow setting panlock, zoomlock and hiderightclick via commands - Issue #60
|
||||||
|
- v1.5.15 - Allow setting clusterAt to 0 to fully disable it - Issue #61
|
||||||
- v1.5.14 - Stop delete marker feedback to allow updating multiple maps - Issue #59
|
- v1.5.14 - Stop delete marker feedback to allow updating multiple maps - Issue #59
|
||||||
- v1.5.13 - Send click message to websocket on marker click - Issue #56, #57
|
- v1.5.13 - Send click message to websocket on marker click - Issue #56, #57
|
||||||
- v1.5.11 - Let search also try geocoding lookup if not found in marks.
|
- v1.5.11 - Let search also try geocoding lookup if not found in marks.
|
||||||
|
@ -9,6 +9,7 @@ map web page for plotting "things" on.
|
|||||||
|
|
||||||
### Updates
|
### Updates
|
||||||
|
|
||||||
|
- v1.5.16 - Allow setting panlock, zoomlock and hiderightclick via commands - Issue #60
|
||||||
- v1.5.15 - Allow setting clusterAt to 0 to fully disable it - Issue #61
|
- v1.5.15 - Allow setting clusterAt to 0 to fully disable it - Issue #61
|
||||||
- v1.5.14 - Stop delete marker feedback to allow updating multiple maps - Issue #59
|
- v1.5.14 - Stop delete marker feedback to allow updating multiple maps - Issue #59
|
||||||
- v1.5.13 - Send click message to websocket on marker click - Issue #56, #57
|
- v1.5.13 - Send click message to websocket on marker click - Issue #56, #57
|
||||||
@ -231,7 +232,7 @@ All these events generate messages that can be received by using a **worldmap in
|
|||||||
|
|
||||||
## Control
|
## Control
|
||||||
|
|
||||||
You can also control the map via the node, by sending in a msg.payload containing a **command** object.
|
You can also control the map via the node, by sending in a msg.payload containing a **command** object. Multiple parameters can be specified in one command.
|
||||||
|
|
||||||
Optional properties include
|
Optional properties include
|
||||||
|
|
||||||
@ -252,6 +253,9 @@ Optional properties include
|
|||||||
- **bounds** - sets the bounds of an Overlay-Image. 2 Dimensional Array that defines the top-left and bottom-right Corners (lat/lng Points)
|
- **bounds** - sets the bounds of an Overlay-Image. 2 Dimensional Array that defines the top-left and bottom-right Corners (lat/lng Points)
|
||||||
- **heatmap** - set heatmap options object see https://github.com/Leaflet/Leaflet.heat#reference
|
- **heatmap** - set heatmap options object see https://github.com/Leaflet/Leaflet.heat#reference
|
||||||
- **clear** - layer name - to clear a complete layer and remove from layer menu
|
- **clear** - layer name - to clear a complete layer and remove from layer menu
|
||||||
|
- **panlock** - lock the map area to the current visible area. - `{command:{panlock:true}}`
|
||||||
|
- **zoomlock** - locks the zoom control to the current value and removes zoom control - `{command:{zoomlock:true}}`
|
||||||
|
- **hiderightclick** - disables the right click that allows adding points to the map - `{command:{hiderightclick:true}}`
|
||||||
|
|
||||||
#### To switch layer, move map and zoom
|
#### To switch layer, move map and zoom
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "node-red-contrib-web-worldmap",
|
"name": "node-red-contrib-web-worldmap",
|
||||||
"version": "1.5.15",
|
"version": "1.5.16",
|
||||||
"description": "A Node-RED node to provide a web page of a world map for plotting things on.",
|
"description": "A Node-RED node to provide a web page of a world map for plotting things on.",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cgi": "0.3.1",
|
"cgi": "0.3.1",
|
||||||
|
@ -51,19 +51,31 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-usermenu"><i class="fa fa-user"></i> User menu</label>
|
<label for="node-input-usermenu"><i class="fa fa-user"></i> User menu</label>
|
||||||
<select id="node-input-usermenu" style="width:80px;">
|
<select id="node-input-usermenu" style="width:64px;">
|
||||||
<option value="show">Show</option>
|
<option value="show">Show</option>
|
||||||
<option value="hide">Hide</option>
|
<option value="hide">Hide</option>
|
||||||
</select>
|
</select>
|
||||||
<i class="fa fa-bars" style="margin-left:30px;"></i> Layer menu
|
<i class="fa fa-bars" style="margin-left:30px;"></i> Layer menu
|
||||||
<select id="node-input-layers" style="width:80px;">
|
<select id="node-input-layers" style="width:64px;">
|
||||||
<option value="show">Show</option>
|
<option value="show">Show</option>
|
||||||
<option value="hide">Hide</option>
|
<option value="hide">Hide</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="node-input-panlock"><i class="fa fa-lock"></i> Lock map</label>
|
||||||
|
<select id="node-input-panlock" style="width:64px;">
|
||||||
|
<option value="false">False</option>
|
||||||
|
<option value="true">True</option>
|
||||||
|
</select>
|
||||||
|
<i class="fa fa-lock" style="margin-left:30px;"></i> Lock zoom
|
||||||
|
<select id="node-input-zoomlock" style="width:64px;">
|
||||||
|
<option value="false">False</option>
|
||||||
|
<option value="true">True</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-panit"><i class="fa fa-arrows-alt"></i> Auto-pan</label>
|
<label for="node-input-panit"><i class="fa fa-arrows-alt"></i> Auto-pan</label>
|
||||||
<select id="node-input-panit" style="width:80px;">
|
<select id="node-input-panit" style="width:64px;">
|
||||||
<option value="false">False</option>
|
<option value="false">False</option>
|
||||||
<option value="true">True</option>
|
<option value="true">True</option>
|
||||||
</select>
|
</select>
|
||||||
@ -76,7 +88,7 @@
|
|||||||
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
|
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
|
||||||
<input type="text" id="node-input-name" placeholder="name">
|
<input type="text" id="node-input-name" placeholder="name">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-tips">Set clusterAt to 0 to disable.</div><br/>If <i>Path</i> is left empty,
|
<div class="form-tips">Set <i>Cluster if</i> to 0 to disable clustering of points.<br/>If <i>Path</i> is left empty,
|
||||||
then by default <code>⌘⇧m</code> - <code>ctrl-shift-m</code> will load the map in a new tab.</div>
|
then by default <code>⌘⇧m</code> - <code>ctrl-shift-m</code> will load the map in a new tab.</div>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -94,7 +106,7 @@ then by default <code>⌘⇧m</code> - <code>ctrl-shift-m</code> will load the m
|
|||||||
<li><code>speed</code> : combined with bearing, draws a vector.</li>
|
<li><code>speed</code> : combined with bearing, draws a vector.</li>
|
||||||
<li><code>bearing</code> : combined with speed, draws a vector.</li>
|
<li><code>bearing</code> : combined with speed, draws a vector.</li>
|
||||||
<li><code>accuracy</code> : combined with bearing, draws a polygon of possible direction.</li>
|
<li><code>accuracy</code> : combined with bearing, draws a polygon of possible direction.</li>
|
||||||
<li><code>icon</code> : <a href="http://fortawesome.github.io/Font-Awesome/icons/" target="_new">font awesome</a> icon name</li>
|
<li><code>icon</code> : <a href="https://fontawesome.com/v4.7.0/icons/" target="_new">font awesome</a> icon name</li>
|
||||||
<li><code>iconColor</code> : standard CSS color name or #rrggbb hex value.</li>
|
<li><code>iconColor</code> : standard CSS color name or #rrggbb hex value.</li>
|
||||||
<li><code>SIDC</code> : NATO symbology code (instead of icon).</li>
|
<li><code>SIDC</code> : NATO symbology code (instead of icon).</li>
|
||||||
<li><code>bulding</code> : OSMBuildings GeoJSON object.</li>
|
<li><code>bulding</code> : OSMBuildings GeoJSON object.</li>
|
||||||
@ -107,7 +119,7 @@ then by default <code>⌘⇧m</code> - <code>ctrl-shift-m</code> will load the m
|
|||||||
<p>Any other sub-properties of <code>msg.payload</code> will be added to the icon popup text box as extra information.</p>
|
<p>Any other sub-properties of <code>msg.payload</code> will be added to the icon popup text box as extra information.</p>
|
||||||
<p>Icons of type <i>plane</i>, <i>ship</i>, <i>car</i>, <i>uav</i> or <i>arrow</i> will use built in SVG icons that align to the
|
<p>Icons of type <i>plane</i>, <i>ship</i>, <i>car</i>, <i>uav</i> or <i>arrow</i> will use built in SVG icons that align to the
|
||||||
<code>bearing</code> value.</p>
|
<code>bearing</code> value.</p>
|
||||||
<p>Font Awesome (fa-icons 4.7) can also be used, as can NATO symbology codes (SIDC).</p>
|
<p>Font Awesome (<a href="https://fontawesome.com/v4.7.0/icons/" target="_new">fa-icons 4.7</a>) can also be used, as can NATO symbology codes (SIDC).</p>
|
||||||
<p>See the <a href="https://www.npmjs.com/package/node-red-contrib-web-worldmap" target="_new">README</a> for further
|
<p>See the <a href="https://www.npmjs.com/package/node-red-contrib-web-worldmap" target="_new">README</a> for further
|
||||||
details and examples of icons and commands for drawing <b>lines</b> and <b>areas</b>, and to <b>add layers</b> and
|
details and examples of icons and commands for drawing <b>lines</b> and <b>areas</b>, and to <b>add layers</b> and
|
||||||
to <b>control</b> the map remotely, including how to use a local map server.</p>
|
to <b>control</b> the map remotely, including how to use a local map server.</p>
|
||||||
@ -137,6 +149,8 @@ then by default <code>⌘⇧m</code> - <code>ctrl-shift-m</code> will load the m
|
|||||||
usermenu: {value:"show"},
|
usermenu: {value:"show"},
|
||||||
layers: {value:"show"},
|
layers: {value:"show"},
|
||||||
panit: {value:"false"},
|
panit: {value:"false"},
|
||||||
|
panlock: {value:"false"},
|
||||||
|
zoomlock: {value:"false"},
|
||||||
path: {value:"/worldmap"}
|
path: {value:"/worldmap"}
|
||||||
},
|
},
|
||||||
inputs:1,
|
inputs:1,
|
||||||
|
@ -32,8 +32,10 @@ module.exports = function(RED) {
|
|||||||
this.cluster = n.cluster || "";
|
this.cluster = n.cluster || "";
|
||||||
this.maxage = n.maxage || "";
|
this.maxage = n.maxage || "";
|
||||||
this.showmenu = n.usermenu || "show";
|
this.showmenu = n.usermenu || "show";
|
||||||
this.panit = n.panit || "false";
|
|
||||||
this.layers = n.layers || "show";
|
this.layers = n.layers || "show";
|
||||||
|
this.panlock = n.panlock || "false";
|
||||||
|
this.zoomlock = n.zoomlock || "false";
|
||||||
|
this.panit = n.panit || "false";
|
||||||
this.path = n.path || "/worldmap";
|
this.path = n.path || "/worldmap";
|
||||||
if (this.path.charAt(0) != "/") { this.path = "/" + this.path; }
|
if (this.path.charAt(0) != "/") { this.path = "/" + this.path; }
|
||||||
if (!sockets[this.path]) {
|
if (!sockets[this.path]) {
|
||||||
@ -63,6 +65,8 @@ module.exports = function(RED) {
|
|||||||
if (node.maxage && node.maxage.length > 0) { c.maxage = node.maxage; }
|
if (node.maxage && node.maxage.length > 0) { c.maxage = node.maxage; }
|
||||||
c.showmenu = node.showmenu;
|
c.showmenu = node.showmenu;
|
||||||
c.panit = node.panit;
|
c.panit = node.panit;
|
||||||
|
c.panlock = node.panlock;
|
||||||
|
c.zoomlock = node.zoomlock;
|
||||||
c.showlayers = node.layers;
|
c.showlayers = node.layers;
|
||||||
client.write(JSON.stringify({command:c}));
|
client.write(JSON.stringify({command:c}));
|
||||||
}
|
}
|
||||||
|
@ -307,7 +307,7 @@ function doHeatAll() {
|
|||||||
var lockit = false;
|
var lockit = false;
|
||||||
var mb = new L.LatLngBounds([[-120,-360],[120,360]]);
|
var mb = new L.LatLngBounds([[-120,-360],[120,360]]);
|
||||||
function doLock() {
|
function doLock() {
|
||||||
if (lockit) {
|
if (lockit === true) {
|
||||||
lockit = false;
|
lockit = false;
|
||||||
mb = new L.LatLngBounds([[-120,-360],[120,360]]);
|
mb = new L.LatLngBounds([[-120,-360],[120,360]]);
|
||||||
}
|
}
|
||||||
@ -595,6 +595,7 @@ map.on('zoomend', function() {
|
|||||||
var rightmenuMap = L.popup({keepInView:true, minWidth:250}).setContent("<b>Add marker</b><br><input type='text' id='rinput' autofocus onkeydown='if (event.keyCode == 13) addThing();' placeholder='name (,icon, layer, colour)'/>");
|
var rightmenuMap = L.popup({keepInView:true, minWidth:250}).setContent("<b>Add marker</b><br><input type='text' id='rinput' autofocus onkeydown='if (event.keyCode == 13) addThing();' placeholder='name (,icon, layer, colour)'/>");
|
||||||
|
|
||||||
var rclk;
|
var rclk;
|
||||||
|
var hiderightclick = false;
|
||||||
var addThing = function() {
|
var addThing = function() {
|
||||||
var thing = document.getElementById('rinput').value;
|
var thing = document.getElementById('rinput').value;
|
||||||
map.closePopup();
|
map.closePopup();
|
||||||
@ -618,7 +619,7 @@ var addThing = function() {
|
|||||||
map.addLayer(layers[lay]);
|
map.addLayer(layers[lay]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// allow double right click to zoom out
|
// allow double right click to zoom out (if enabled)
|
||||||
// single right click opens a message window that adds a marker
|
// single right click opens a message window that adds a marker
|
||||||
var rclicked = false;
|
var rclicked = false;
|
||||||
var rtout = null;
|
var rtout = null;
|
||||||
@ -626,18 +627,22 @@ map.on('contextmenu', function(e) {
|
|||||||
if (rclicked) {
|
if (rclicked) {
|
||||||
rclicked = false;
|
rclicked = false;
|
||||||
clearTimeout(rtout);
|
clearTimeout(rtout);
|
||||||
|
if (map.doubleClickZoom.enabled()) {
|
||||||
map.zoomOut();
|
map.zoomOut();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
rclicked = true;
|
rclicked = true;
|
||||||
rtout = setTimeout( function() {
|
rtout = setTimeout( function() {
|
||||||
rclicked = false;
|
rclicked = false;
|
||||||
|
if (hiderightclick !== true) {
|
||||||
rclk = e.latlng;
|
rclk = e.latlng;
|
||||||
rightmenuMap.setLatLng(e.latlng);
|
rightmenuMap.setLatLng(e.latlng);
|
||||||
map.openPopup(rightmenuMap);
|
map.openPopup(rightmenuMap);
|
||||||
setTimeout( function() {
|
setTimeout( function() {
|
||||||
document.getElementById('rinput').focus();
|
document.getElementById('rinput').focus();
|
||||||
}, 200);
|
}, 200);
|
||||||
|
}
|
||||||
}, 300);
|
}, 300);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1357,6 +1362,28 @@ function doCommand(cmd) {
|
|||||||
else { panit = false; }
|
else { panit = false; }
|
||||||
document.getElementById("panit").checked = panit;
|
document.getElementById("panit").checked = panit;
|
||||||
}
|
}
|
||||||
|
if (cmd.hasOwnProperty("panlock")) {
|
||||||
|
if (cmd.panlock == "true" || cmd.panlock == true) { lockit = false; }
|
||||||
|
else { lockit = true; }
|
||||||
|
doLock();
|
||||||
|
document.getElementById("lockit").checked = !lockit;
|
||||||
|
}
|
||||||
|
if (cmd.hasOwnProperty("hiderightclick")) {
|
||||||
|
if (cmd.hiderightclick == "true" || cmd.hiderightclick == true) { hiderightclick = true; }
|
||||||
|
else { hiderightclick = false; }
|
||||||
|
}
|
||||||
|
if (cmd.hasOwnProperty("zoomlock")) {
|
||||||
|
if (cmd.zoomlock == "true" || cmd.zoomlock == true) {
|
||||||
|
if (map.doubleClickZoom.enabled()) { map.removeControl(map.zoomControl); }
|
||||||
|
map.doubleClickZoom.disable();
|
||||||
|
map.scrollWheelZoom.disable();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!map.doubleClickZoom.enabled()) { map.addControl(map.zoomControl); }
|
||||||
|
map.doubleClickZoom.enable();
|
||||||
|
map.scrollWheelZoom.enable();
|
||||||
|
}
|
||||||
|
}
|
||||||
if (cmd.hasOwnProperty("showmenu")) {
|
if (cmd.hasOwnProperty("showmenu")) {
|
||||||
if ((cmd.showmenu === "hide") && (showUserMenu === true)) {
|
if ((cmd.showmenu === "hide") && (showUserMenu === true)) {
|
||||||
showUserMenu = false;
|
showUserMenu = false;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
CACHE MANIFEST
|
CACHE MANIFEST
|
||||||
# date: Dec 22nd 2018 - v1.5.15
|
# date: Dec 23rd 2018 - v1.5.16
|
||||||
|
|
||||||
CACHE:
|
CACHE:
|
||||||
index.html
|
index.html
|
||||||
|
Loading…
Reference in New Issue
Block a user