Load pmtiles from userdir rather than node_modules to survive an upgrade

Bump to 4.5.0
master
Dave Conway-Jones 10 months ago
parent eb012fee7a
commit b881ca0f30
No known key found for this signature in database
GPG Key ID: 1DDB0E91A28C2643

@ -1,5 +1,6 @@
### Change Log for Node-RED Worldmap
- v4.5.0 - Fix pmtiles to look for maps in userdir rather than modules
- v4.4.0 - Add quad(copter) drone icon.
- v4.3.3 - Fix for objects changing layers.
- v4.3.2 - Fix geojson popup missing label name.

@ -13,6 +13,7 @@ Feel free to [![](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%
### Updates
- v4.5.0 - Fix pmtiles to look for maps in userdir rather than modules
- v4.4.0 - Add quad(copter) drone icon.
- v4.3.3 - Fix for objects changing layers.
- v4.3.2 - Fix geojson popup missing label name.
@ -720,7 +721,7 @@ You can use a PMtiles format map archive file from [Protomaps](https://docs.prot
**Note**: the whole planet file is over 100GB so be warned both for local storage and your download speed. You can download or extract just a portion of it if you use the **pmtiles** command line with the extract option. Use `pmtiles extract --help` to see the options.
Copy, or create an alias to, your .pmtiles file(s) into your `~/.node-red/node_modules/node-red-contrib-web-worldmap/worldmap/` directory. On re-starting Node-RED the node will detect the file(s) and add them to the base map layer menu, using the file name as the layer name.
Copy your .pmtiles file(s) into your `~/.node-red` user directory. On re-starting Node-RED the node will detect the file(s) and add them to the base map layer menu, using the file name as the layer name.
### Using a Docker Map Server

@ -1,6 +1,6 @@
{
"name": "node-red-contrib-web-worldmap",
"version": "4.4.0",
"version": "4.5.0",
"description": "A Node-RED node to provide a web page of a world map for plotting things on.",
"dependencies": {
"@turf/bezier-spline": "~6.5.0",

@ -1,4 +1,8 @@
<script type="text/html" data-template-name="worldmap">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
<div class="form-row">
<table border="0" width="96%">
<tr><td width="100px"><i class="fa fa-globe"></i> Start<td>Latitude</td><td>Longitude</td><td width="60px">Zoom</td></tr>
@ -108,10 +112,6 @@
<option value="true">Enable</option>
</select>
</div>
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
<div class="form-tips">Set <i>Cluster when</i> to 0 to disable clustering of points.<br/>
If <i>Web 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>
</script>
@ -155,6 +155,10 @@ If <i>Web Path</i> is left empty, then by default <code>⌘⇧m</code> - <code>c
<script type="text/html" data-template-name="ui_worldmap">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
<div class="form-row" id="template-row-group">
<label for="node-input-group"><i class="fa fa-table"></i> Group</span></label>
<input type="text" id="node-input-group">
@ -274,10 +278,6 @@ If <i>Web Path</i> is left empty, then by default <code>⌘⇧m</code> - <code>c
<option value="true">Enable</option>
</select>
</div>
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
<div class="form-tips">Set <i>Cluster when</i> to 0 to disable clustering of points.<br/>
If <i>Web 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>
</script>
@ -593,6 +593,10 @@ If <i>Web Path</i> is left empty, then by default <code>⌘⇧m</code> - <code>c
<script type="text/html" data-template-name="worldmap in">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
<div class="form-row">
<label for="node-input-path"><i class="fa fa-globe"></i> Web Path</label>
<input type="text" id="node-input-path" placeholder="worldmap">
@ -601,10 +605,6 @@ If <i>Web Path</i> is left empty, then by default <code>⌘⇧m</code> - <code>c
<label for="node-input-events"><i class="fa fa-sign-out"></i> Events</label>
<input type="text" id="node-input-events" placeholder="select events">
</div>
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
</script>
<script type="text/html" data-help-name="worldmap in">
@ -679,6 +679,10 @@ If <i>Web Path</i> is left empty, then by default <code>⌘⇧m</code> - <code>c
<script type="text/html" data-template-name="worldmap-tracks">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
<div class="form-row">
<label for="node-input-depth"><i class="fa fa-map-marker"></i> Number of</label>
points in track <input type="text" id="node-input-depth" style="width:50%" placeholder="number - default 20">
@ -696,10 +700,6 @@ If <i>Web Path</i> is left empty, then by default <code>⌘⇧m</code> - <code>c
<input type="checkbox" id="node-input-smooth" style="display:inline-block; width:auto; vertical-align:top;">
<label for="node-input-smooth" style="width:70%;">Smooth tracks using bezier curves.</label>
</div>
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
</script>
<script type="text/html" data-help-name="worldmap-tracks">
@ -739,14 +739,14 @@ If <i>Web Path</i> is left empty, then by default <code>⌘⇧m</code> - <code>c
<script type="text/html" data-template-name="worldmap-hull">
<div class="form-row">
<label for="node-input-prop"><i class="fa fa-ellipsis-h"></i> Property</label>
<input type="text" id="node-input-prop" placeholder="payload property to group">
</div>
<div class="form-row">
<label for="node-input-name"><i class="fa fa-file"></i> Name</label>
<input type="text" id="node-input-name" placeholder="name">
</div>
<div class="form-row">
<label for="node-input-prop"><i class="fa fa-ellipsis-h"></i> Property</label>
<input type="text" id="node-input-prop" placeholder="payload property to group">
</div>
</script>
<script type="text/html" data-help-name="worldmap-hull">

@ -13,7 +13,8 @@ module.exports = function(RED) {
if (fs.existsSync((__dirname + '/mapserv'))) {
RED.httpNode.use("/cgi-bin/mapserv", require('cgi')(__dirname + '/mapserv'));
}
var pmtiles = fs.readdirSync(__dirname + '/worldmap').filter(fn => fn.endsWith('.pmtiles'));
//var pmtiles = fs.readdirSync(__dirname + '/worldmap').filter(fn => fn.endsWith('.pmtiles'));
var pmtiles = fs.readdirSync(RED.settings.userDir).filter(fn => fn.endsWith('.pmtiles'));
function worldMap(node, n) {
var allPoints = {};
@ -121,7 +122,14 @@ module.exports = function(RED) {
//console.log("INIT",c)
client.write(JSON.stringify({command:c}));
for (var p=0; p<pmtiles.length; p++) {
client.write(JSON.stringify({command: {map: {name:pmtiles[p].split('.')[0], pmtiles:pmtiles[p] }}}));
fs.symlink(RED.settings.userDir+'/'+pmtiles[p], __dirname+'/worldmap/'+pmtiles[p], 'file', (err) => {
if (err) {
if (err.code !== "EEXIST") { console.log(err); }
}
else {
client.write(JSON.stringify({command: {map: {name:pmtiles[p].split('.')[0], pmtiles:pmtiles[p] }}}));
}
})
}
var o = Object.values(allPoints);
o.map(v => delete v.tout);

Loading…
Cancel
Save