Let circles be clickable, and better ellipses.

This commit is contained in:
Dave Conway-Jones 2019-04-23 23:56:14 +01:00
parent 2e35345be1
commit f9a0e7bb28
No known key found for this signature in database
GPG Key ID: 9E7F9C73F5168CD4
4 changed files with 27 additions and 15 deletions

View File

@ -1,5 +1,6 @@
### Change Log for Node-RED Worldmap ### Change Log for Node-RED Worldmap
- v2.0.3-beta - Let circles have popups. Better drawing of ellipses
- v2.0.2-beta - Let lines and areas also have popups - v2.0.2-beta - Let lines and areas also have popups
- v2.0.1-beta - Add optional graticule. - v2.0.1-beta - Add optional graticule.
- v2.0.0-beta - Move to leaflet 1.4.x plus all plugins updated - v2.0.0-beta - Move to leaflet 1.4.x plus all plugins updated

View File

@ -9,6 +9,7 @@ map web page for plotting "things" on.
### Updates ### Updates
- v2.0.3-beta - Let circles have popups. Better drawing of ellipses
- v2.0.2-beta - Let lines and areas also have popups - v2.0.2-beta - Let lines and areas also have popups
- v2.0.1-beta - Add optional graticule - v2.0.1-beta - Add optional graticule
- v2.0.0-beta - Move to leaflet 1.4.x plus all plugins updated - v2.0.0-beta - Move to leaflet 1.4.x plus all plugins updated
@ -200,7 +201,7 @@ then rather than draw a point and icon it draws the polygon. Likewise if it cont
- **clickable** : boolean - set to true to allow click to show popup. - **clickable** : boolean - set to true to allow click to show popup.
- **popup** : html string to display in popup (as well as name). - **popup** : html string to display in popup (as well as name).
### Circles ### Circles and Ellipses
If the msg.payload contains a **radius** property, as well as name, lat and lon, then rather If the msg.payload contains a **radius** property, as well as name, lat and lon, then rather
than draw a point it will draw a circle. The *radius* property is specified in meters. than draw a point it will draw a circle. The *radius* property is specified in meters.
@ -209,8 +210,11 @@ than draw a point it will draw a circle. The *radius* property is specified in m
As per Areas and Lines you may also specify *color*, *fillColor*, and *layer*. As per Areas and Lines you may also specify *color*, *fillColor*, and *layer*.
If the payload contains a **sdlat** and **sdlon** property instead of *radius* an ellipse will be drawn. The sdlat and sdlon propertys specify the semi-axes of the ellipse. If the **radius** property is an array of two numbers, these specify the minor and major radii
These are specified in the Latitude/Longitude format. of an ellipse, in meters. A **tilt** property can also be applied to rotate the ellipse by
a number of degrees.
msg.payload = { "name":"Bristol Channel", "lat":51.5, "lon":-2.9, "radius":[30000,70000], "tilt":45 };
### Options ### Options
@ -224,7 +228,7 @@ Areas, Lines and Circles can also specify more optional properties:
- fillOpacity - fillOpacity
- dashArray - dashArray
- clickable - if true sets the passed in name as popup - clickable - if true sets the passed in name as popup
- popup - extra html string to display as part of popup - popup - extra html string to display inside the popup
## Drawing ## Drawing

View File

@ -1,6 +1,6 @@
{ {
"name": "node-red-contrib-web-worldmap", "name": "node-red-contrib-web-worldmap",
"version": "2.0.2-beta", "version": "2.0.3-beta",
"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",

View File

@ -1035,7 +1035,7 @@ function setMarker(data) {
if (!data.hasOwnProperty("weight")) { opt.weight = 3; } //Standard settings different for lines if (!data.hasOwnProperty("weight")) { opt.weight = 3; } //Standard settings different for lines
if (!data.hasOwnProperty("opacity")) { opt.opacity = 0.8; } if (!data.hasOwnProperty("opacity")) { opt.opacity = 0.8; }
var polyln = L.polyline(data.line, opt); var polyln = L.polyline(data.line, opt);
if (opt.clickable) { if (opt.clickable) {
var words = "<b>"+data.name+"</b>"; var words = "<b>"+data.name+"</b>";
if (data.popup) { var words = words + "<br/>" + data.popup; } if (data.popup) { var words = words + "<br/>" + data.popup; }
polyln.bindPopup(words, {autoClose:false, closeButton:true, closeOnClick:false, minWidth:200}); polyln.bindPopup(words, {autoClose:false, closeButton:true, closeOnClick:false, minWidth:200});
@ -1060,13 +1060,10 @@ function setMarker(data) {
if (!data.hasOwnProperty("fillColor")) { opt.fillColor = "blue"; } if (!data.hasOwnProperty("fillColor")) { opt.fillColor = "blue"; }
delete opt.clickable; delete opt.clickable;
var ellipse = L.ellipse(new L.LatLng((data.lat*1), (data.lon*1)), [200000*data.sdlon*Math.cos(data.lat*Math.PI/180), 200000*data.sdlat], 0, opt); var ellipse = L.ellipse(new L.LatLng((data.lat*1), (data.lon*1)), [200000*data.sdlon*Math.cos(data.lat*Math.PI/180), 200000*data.sdlat], 0, opt);
if (data.clickable != false) { if (opt.clickable) {
ellipse.on('click', function(e) { var words = "<b>"+data.name+"</b>";
var popup = L.popup() if (data.popup) { var words = words + "<br/>" + data.popup; }
.setLatLng(new L.LatLng((data.lat*1), (data.lon*1))) ellipse.bindPopup(words, {autoClose:false, closeButton:true, closeOnClick:false, minWidth:200});
.setContent('<p><b>'+data.name+'</b><br/>lat : '+data.lat+'<br/>lon : '+data.lon+'</p>')
.openOn(map);
});
} }
polygons[data.name] = ellipse; polygons[data.name] = ellipse;
polygons[data.name].lay = lay; polygons[data.name].lay = lay;
@ -1075,8 +1072,18 @@ function setMarker(data) {
else { else {
if (data.hasOwnProperty("radius")) { if (data.hasOwnProperty("radius")) {
if (data.hasOwnProperty("lat") && data.hasOwnProperty("lon")) { if (data.hasOwnProperty("lat") && data.hasOwnProperty("lon")) {
var polycirc = L.circle(new L.LatLng((data.lat*1), (data.lon*1)), data.radius*1, opt); var polycirc;
if (opt.clickable) { polycirc.bindPopup(data.name); } if (Array.isArray(data.radius)) {
polycirc = L.ellipse(new L.LatLng((data.lat*1), (data.lon*1)), [data.radius[0]*Math.cos(data.lat*Math.PI/180), data.radius[1]], data.tilt || 0, opt);
}
else {
polycirc = L.circle(new L.LatLng((data.lat*1), (data.lon*1)), data.radius*1, opt);
}
if (opt.clickable) {
var words = "<b>"+data.name+"</b>";
if (data.popup) { var words = words + "<br/>" + data.popup; }
polycirc.bindPopup(words, {autoClose:false, closeButton:true, closeOnClick:false, minWidth:200});
}
polygons[data.name] = polycirc; polygons[data.name] = polycirc;
polygons[data.name].lay = lay; polygons[data.name].lay = lay;
layers[lay].addLayer(polycirc); layers[lay].addLayer(polycirc);