[{"data":1,"prerenderedAt":470},["ShallowReactive",2],{"integration-node-red-contrib-web-worldmap\u002F":3},{"_id":4,"categories":5,"author":8,"description":12,"npmOwners":13,"npmScope":15,"name":4,"ffCertified":16,"downloads":17,"version":19,"updatedAt":20,"maintainers":21,"homepage":23,"bugs":24,"repository":26,"time":29,"lastUpdated":20,"created":30,"license":376,"githubOwner":14,"githubRepo":377,"examples":378,"readme":469},"node-red-contrib-web-worldmap",[6,7],"catalogue_ui","catalogue",{"url":9,"name":10,"email":11},"http:\u002F\u002Fnodered.org","Dave Conway-Jones","dceejay@gmail.com","A Node-RED node to provide a web page of a world map for plotting things on.",[14],"dceejay",null,false,{"week":18},2330,"5.8.2","2026-10-12T14:30:28.425Z",[22],{"name":14,"email":11},"https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap#readme",{"url":25},"https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fissues",{"url":27,"type":28},"git+https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap.git","git",{"created":30,"modified":20,"0.0.8":30,"0.0.9":31,"0.0.10":32,"0.0.11":33,"0.0.12":34,"0.0.13":35,"0.0.14":36,"0.0.15":37,"1.0.0":38,"1.0.1":39,"1.0.2":40,"1.0.3":41,"1.0.4":42,"1.0.5":43,"1.0.6":44,"1.0.7":45,"1.0.8":46,"1.0.9":47,"1.0.10":48,"1.0.11":49,"1.0.12":50,"1.0.13":51,"1.0.14":52,"1.0.15":53,"1.0.16":54,"1.0.17":55,"1.0.18":56,"1.0.19":57,"1.0.20":58,"1.0.21":59,"1.0.22":60,"1.0.23":61,"1.0.24":62,"1.0.25":63,"1.0.26":64,"1.0.28":65,"1.0.29":66,"1.0.30":67,"1.0.31":68,"1.0.32":69,"1.0.33":70,"1.0.34":71,"1.0.35":72,"1.1.1":73,"1.1.2":74,"1.1.3":75,"1.1.4":76,"1.1.5":77,"1.1.6":78,"1.1.7":79,"1.1.9":80,"1.1.11":81,"1.1.12":82,"1.1.13":83,"1.1.14":84,"1.1.15":85,"1.1.16":86,"1.2.0":87,"1.2.1":88,"1.2.2":89,"1.2.3":90,"1.2.4":91,"1.3.0":92,"1.3.1":93,"1.3.2":94,"1.3.3":95,"1.3.4":96,"1.3.5":97,"1.3.6":98,"1.3.7":99,"1.3.8":100,"1.4.0":101,"1.4.1":102,"1.4.2":103,"1.4.3":104,"1.4.4":105,"1.4.5":106,"1.4.6":107,"1.5.0":108,"1.5.1":109,"1.5.2":110,"1.5.3":111,"1.5.5":112,"1.5.6":113,"1.5.7":114,"1.5.8":115,"1.5.9":116,"1.5.10":117,"1.5.11":118,"1.5.12":119,"1.5.13":120,"1.5.14":121,"1.5.15":122,"1.5.16":123,"1.5.17":124,"1.5.18":125,"1.5.19":126,"1.5.20":127,"1.5.21":128,"1.5.22":129,"1.5.23":130,"1.5.24":131,"1.5.25":132,"1.5.26":133,"1.5.27":134,"1.5.28":135,"1.5.29":136,"1.5.30":137,"1.5.31":138,"1.5.32":139,"1.5.33":140,"1.5.34":141,"1.5.35":142,"1.5.36":143,"1.5.37":144,"1.5.38":145,"1.5.39":146,"1.5.40":147,"2.0.0-beta":148,"2.0.1-beta":149,"2.0.2-beta":150,"2.0.3-beta":151,"2.0.4-beta":152,"2.0.5-beta":153,"2.0.6-beta":154,"2.0.7-beta":155,"2.0.8":156,"2.0.9":157,"2.0.10":158,"2.0.11":159,"2.0.12":160,"2.0.13":161,"2.0.14":162,"2.0.16":163,"2.0.17":164,"2.0.18":165,"2.0.19":166,"2.0.20":167,"2.0.21":168,"2.0.22":169,"2.1.0":170,"2.1.1":171,"2.1.2":172,"2.1.3":173,"2.1.4":174,"2.1.6":175,"2.2.0":176,"2.2.1":177,"2.3.0":178,"2.3.1":179,"2.3.2":180,"2.3.3":181,"2.3.4":182,"2.3.5":183,"2.3.6":184,"2.3.7":185,"2.3.8":186,"2.3.9":187,"2.3.10":188,"2.3.11":189,"2.3.12":190,"2.3.13":191,"2.3.14":192,"2.3.15":193,"2.4.0":194,"2.4.1":195,"2.4.2":196,"2.5.1":197,"2.5.2":198,"2.5.3":199,"2.5.4":200,"2.5.5":201,"2.5.6":202,"2.5.7":203,"2.5.8":204,"2.5.9":205,"2.6.0":206,"2.7.0":207,"2.7.1":208,"2.8.0":209,"2.8.1":210,"2.8.2":211,"2.8.3":212,"2.8.4":213,"2.8.5":214,"2.8.6":215,"2.8.7":216,"2.8.8":217,"2.9.0":218,"2.10.0":219,"2.11.0":220,"2.11.1":221,"2.11.2":222,"2.12.0":223,"2.12.1":224,"2.13.0":225,"2.13.1":226,"2.13.2":227,"2.13.3":228,"2.13.4":229,"2.14.0":230,"2.15.0":231,"2.15.1":232,"2.15.2":233,"2.15.3":234,"2.15.4":235,"2.15.5":236,"2.15.6":237,"2.15.7":238,"2.15.8":239,"2.16.0":240,"2.16.1":241,"2.16.2":242,"2.17.0":243,"2.17.1":244,"2.17.2":245,"2.17.3":246,"2.18.0":247,"2.19.0":248,"2.20.0":249,"2.21.0":250,"2.21.1":251,"2.21.2":252,"2.21.3":253,"2.21.4":254,"2.21.5":255,"2.21.6":256,"2.21.7":257,"2.21.8":258,"2.21.9":259,"2.22.0":260,"2.22.1":261,"2.22.2":262,"2.22.3":263,"2.23.0":264,"2.23.1":265,"2.23.2":266,"2.23.3":267,"2.23.4":268,"2.23.5":269,"2.24.0":270,"2.24.1":271,"2.24.2":272,"2.24.3":273,"2.25.0":274,"2.26.0":275,"2.26.1":276,"2.27.0":277,"2.27.1":278,"2.27.2":279,"2.27.3":280,"2.28.0":281,"2.28.1":282,"2.28.2":283,"2.28.3":284,"2.29.0":285,"2.30.1":286,"2.30.2":287,"2.30.3":288,"2.31.0":289,"2.31.1":290,"2.31.2":291,"2.31.3":292,"2.32.0":293,"2.32.2":294,"2.32.3":295,"2.33.0":296,"2.34.0":297,"2.35.0":298,"2.36.0":299,"2.37.0":300,"2.37.1":301,"2.37.2":302,"2.37.3":303,"2.37.4":304,"2.38.0":305,"2.38.1":306,"2.38.2":307,"2.38.3":308,"2.39.0":309,"2.40.0":310,"2.40.1":311,"2.41.0":312,"2.42.0":313,"2.42.1":314,"2.42.2":315,"2.42.3":316,"3.0.0":317,"3.1.0":318,"4.0.0":319,"4.2.0":320,"4.2.1":321,"4.3.0":322,"4.3.1":323,"4.3.2":324,"4.3.3":325,"4.4.0":326,"4.5.0":327,"4.5.1":328,"4.5.2":329,"4.6.0":330,"4.6.1":331,"4.6.2":332,"4.6.3":333,"4.6.4":334,"4.6.5":335,"4.7.0":336,"4.8.0":337,"4.8.1":338,"4.9.0":339,"5.0.0":340,"5.0.1":341,"5.0.3":342,"5.0.4":343,"5.0.5":344,"5.0.6":345,"5.0.7":346,"5.0.8":347,"5.0.9":348,"5.1.0":349,"5.1.1":350,"5.1.2":351,"5.1.3":352,"5.1.4":353,"5.1.5":354,"5.1.6":355,"5.2.0":356,"5.3.0":357,"5.4.0":358,"5.5.0":359,"5.5.1":360,"5.5.2":361,"5.5.3":362,"5.5.4":363,"5.5.6":364,"5.5.7":365,"5.5.8":366,"5.6.0":367,"5.6.1":368,"5.6.2":369,"5.7.0":370,"5.7.1":371,"5.7.2":372,"5.8.0":373,"5.8.1":374,"5.8.2":375},"2016-04-01T10:35:55.328Z","2016-04-01T10:43:03.000Z","2016-04-07T20:36:30.163Z","2016-04-18T15:58:04.424Z","2016-05-08T10:07:57.690Z","2016-05-16T15:07:45.719Z","2016-05-17T07:48:16.606Z","2016-05-17T11:22:25.785Z","2016-05-18T22:27:03.376Z","2016-05-20T15:41:39.528Z","2016-05-24T20:35:02.177Z","2016-05-25T22:06:32.617Z","2016-05-26T21:12:55.051Z","2016-05-31T08:21:40.891Z","2016-06-01T08:25:00.252Z","2016-06-01T13:13:03.315Z","2016-06-01T22:39:50.863Z","2016-06-02T11:35:26.531Z","2016-06-05T17:38:14.048Z","2016-06-08T21:08:41.924Z","2016-06-12T11:41:19.837Z","2016-06-15T11:57:11.782Z","2016-06-26T19:55:16.326Z","2016-06-27T10:55:11.372Z","2016-07-24T10:58:06.127Z","2016-08-17T08:24:29.107Z","2016-09-03T15:09:14.081Z","2016-09-06T12:47:04.759Z","2016-10-18T21:37:58.121Z","2016-11-13T20:28:00.210Z","2016-11-22T08:23:20.812Z","2017-03-04T14:13:42.324Z","2017-03-20T16:05:02.611Z","2017-04-19T16:09:05.480Z","2017-04-20T12:46:21.156Z","2017-05-02T18:45:55.988Z","2017-05-11T17:44:10.647Z","2017-06-20T22:25:56.445Z","2017-06-26T15:19:19.164Z","2017-06-28T08:22:22.290Z","2017-07-12T17:00:06.799Z","2017-08-03T15:09:45.265Z","2017-08-10T15:19:23.917Z","2017-09-06T12:08:17.252Z","2017-09-06T13:40:28.190Z","2017-09-06T15:01:09.104Z","2017-10-10T22:52:39.371Z","2017-11-01T17:14:59.821Z","2017-11-19T22:37:38.060Z","2017-11-23T22:18:42.893Z","2018-01-03T08:30:28.328Z","2018-05-02T22:57:35.122Z","2018-05-18T09:02:32.194Z","2018-05-29T08:06:43.082Z","2018-05-31T16:32:45.044Z","2018-05-31T21:50:38.294Z","2018-06-04T20:09:48.473Z","2018-06-06T17:14:48.186Z","2018-06-06T22:46:41.450Z","2018-06-11T16:07:30.506Z","2018-06-13T16:39:33.368Z","2018-06-17T20:57:42.954Z","2018-07-01T15:36:27.755Z","2018-07-04T08:07:33.562Z","2018-07-09T12:32:36.917Z","2018-07-16T09:19:27.720Z","2018-07-16T14:52:52.544Z","2018-07-17T11:21:16.905Z","2018-08-21T13:45:00.390Z","2018-09-11T01:04:04.355Z","2018-09-11T15:02:23.809Z","2018-09-13T11:58:41.982Z","2018-09-13T12:01:31.465Z","2018-09-19T19:48:36.966Z","2018-09-20T21:27:13.866Z","2018-10-01T18:23:00.602Z","2018-10-02T09:43:14.958Z","2018-10-04T21:40:08.365Z","2018-10-12T23:08:52.394Z","2018-10-13T21:42:34.232Z","2018-10-15T08:56:21.707Z","2018-10-15T22:20:24.038Z","2018-10-23T07:34:26.592Z","2018-10-25T21:12:51.110Z","2018-10-30T22:23:09.289Z","2018-11-08T14:12:35.111Z","2018-11-09T11:17:13.746Z","2018-11-09T12:54:08.060Z","2018-11-17T10:53:19.805Z","2018-11-17T12:11:16.728Z","2018-12-07T11:27:20.602Z","2018-12-13T09:15:28.472Z","2018-12-22T17:05:40.095Z","2018-12-23T14:30:40.990Z","2019-01-11T11:12:13.141Z","2019-01-26T16:25:45.621Z","2019-02-05T15:02:00.387Z","2019-02-06T19:59:13.206Z","2019-02-07T21:31:20.238Z","2019-02-11T09:00:26.629Z","2019-02-13T22:52:43.591Z","2019-02-20T22:33:22.684Z","2019-02-21T12:23:54.412Z","2019-02-24T22:47:29.519Z","2019-02-27T22:05:41.784Z","2019-02-28T18:59:56.450Z","2019-03-02T16:12:22.332Z","2019-03-11T17:34:14.825Z","2019-03-14T23:30:56.844Z","2019-03-16T20:07:55.233Z","2019-03-17T18:18:43.235Z","2019-03-18T09:03:22.540Z","2019-03-19T13:53:18.822Z","2019-03-24T22:32:30.249Z","2019-04-01T11:17:57.926Z","2019-04-10T08:34:03.723Z","2019-04-12T08:51:17.601Z","2019-04-21T17:47:34.232Z","2019-04-21T17:51:20.044Z","2019-04-21T21:32:28.545Z","2019-04-23T16:22:53.663Z","2019-04-23T22:56:40.309Z","2019-04-25T23:09:45.503Z","2019-04-27T08:19:00.303Z","2019-05-01T11:37:52.947Z","2019-05-06T17:19:38.085Z","2019-05-09T15:41:05.275Z","2019-05-22T11:27:02.429Z","2019-05-23T07:41:11.844Z","2019-05-23T08:00:46.617Z","2019-05-23T08:02:10.195Z","2019-06-13T20:25:39.891Z","2019-06-14T15:43:37.379Z","2019-06-16T14:57:45.266Z","2019-06-20T22:12:46.037Z","2019-06-23T22:15:15.238Z","2019-08-07T20:56:40.289Z","2019-08-08T11:29:08.410Z","2019-08-16T16:25:55.719Z","2019-08-20T16:08:19.347Z","2019-09-04T21:30:06.002Z","2019-09-18T07:41:11.250Z","2019-09-18T14:38:14.467Z","2019-09-27T11:21:35.030Z","2019-10-16T09:20:50.119Z","2019-11-12T23:56:14.106Z","2019-11-26T11:32:07.325Z","2020-01-03T10:39:02.399Z","2020-03-11T12:18:37.215Z","2020-03-11T18:56:11.750Z","2020-03-24T11:54:22.578Z","2020-03-29T10:08:41.008Z","2020-04-01T16:53:43.166Z","2020-04-08T21:08:07.157Z","2020-04-14T12:47:35.125Z","2020-04-19T20:52:26.963Z","2020-04-22T18:55:01.548Z","2020-05-05T22:37:56.646Z","2020-05-06T14:52:30.221Z","2020-05-15T14:06:26.437Z","2020-05-28T20:15:02.746Z","2020-05-28T21:55:29.045Z","2020-06-30T19:11:18.673Z","2020-07-02T08:01:07.542Z","2020-07-07T18:48:43.787Z","2020-07-09T21:10:12.242Z","2020-07-25T16:43:04.675Z","2020-08-24T10:39:36.457Z","2020-08-25T17:14:13.069Z","2020-09-02T08:45:44.388Z","2020-09-02T15:38:10.503Z","2020-10-28T19:35:07.129Z","2020-10-28T22:34:47.566Z","2020-11-16T09:13:03.213Z","2020-11-17T14:46:06.616Z","2020-11-17T19:51:45.632Z","2020-11-19T11:49:07.906Z","2020-12-06T23:54:05.962Z","2020-12-07T17:37:57.188Z","2020-12-15T11:02:24.671Z","2021-01-23T11:57:04.477Z","2021-02-05T11:46:25.210Z","2021-02-20T14:03:16.383Z","2021-02-20T15:43:10.808Z","2021-02-20T15:53:05.650Z","2021-02-21T12:41:35.512Z","2021-02-23T09:39:38.052Z","2021-03-04T11:32:53.526Z","2021-03-07T17:08:07.439Z","2021-03-11T12:45:14.742Z","2021-03-15T13:25:06.102Z","2021-03-21T17:07:53.362Z","2021-03-24T17:46:56.162Z","2021-03-26T12:22:02.971Z","2021-03-26T17:11:59.662Z","2021-04-01T08:44:39.431Z","2021-04-12T16:42:20.478Z","2021-04-13T09:35:44.867Z","2021-04-20T14:09:05.420Z","2021-05-14T10:21:14.846Z","2021-05-19T18:00:18.897Z","2021-05-26T12:34:58.958Z","2021-06-04T09:35:51.806Z","2021-06-04T14:34:45.220Z","2021-06-09T08:32:40.033Z","2021-06-25T14:38:59.260Z","2021-07-02T12:44:24.947Z","2021-09-10T13:58:36.649Z","2021-09-16T15:37:33.536Z","2021-09-24T13:08:30.841Z","2021-09-24T15:22:50.914Z","2021-09-24T16:12:12.430Z","2021-09-28T16:58:38.168Z","2021-10-12T20:19:12.934Z","2021-10-13T21:44:31.976Z","2021-10-17T16:12:32.932Z","2021-10-21T16:51:43.436Z","2021-10-22T16:45:47.723Z","2021-10-25T08:57:57.701Z","2021-10-29T16:58:33.745Z","2021-11-02T16:18:22.027Z","2021-11-03T11:05:06.570Z","2021-11-03T15:14:18.179Z","2021-11-03T21:28:48.586Z","2021-11-06T12:04:19.576Z","2021-11-10T09:40:48.956Z","2021-11-19T11:42:46.680Z","2021-11-24T19:48:10.956Z","2021-11-24T20:19:05.652Z","2021-11-25T17:17:12.172Z","2021-11-26T12:48:41.844Z","2021-11-26T16:02:46.594Z","2021-11-28T19:38:46.319Z","2021-12-05T17:05:50.820Z","2021-12-05T17:06:58.516Z","2021-12-16T21:57:01.238Z","2021-12-17T16:38:51.206Z","2021-12-17T22:57:02.365Z","2021-12-21T13:29:51.404Z","2021-12-21T17:25:09.167Z","2021-12-30T12:29:22.326Z","2022-01-08T11:55:04.884Z","2022-01-11T20:24:05.980Z","2022-01-12T17:06:08.781Z","2022-01-16T15:36:32.367Z","2022-01-24T09:09:55.462Z","2022-01-25T10:49:23.535Z","2022-02-04T11:23:02.778Z","2022-02-06T17:19:19.070Z","2022-02-23T15:43:27.812Z","2022-02-24T21:31:33.424Z","2022-04-02T22:53:21.668Z","2022-04-08T10:53:27.776Z","2022-06-08T18:18:41.040Z","2022-06-10T13:06:24.441Z","2022-08-23T11:13:57.258Z","2022-10-26T16:18:19.028Z","2022-10-26T17:51:59.560Z","2022-10-27T09:42:26.331Z","2022-11-10T11:09:35.582Z","2022-11-23T10:22:56.011Z","2022-11-30T15:53:38.138Z","2022-12-01T12:49:18.053Z","2022-12-13T14:41:34.957Z","2022-12-31T13:58:57.550Z","2023-01-03T16:06:00.137Z","2023-01-21T13:39:03.901Z","2023-03-13T11:23:09.462Z","2023-03-26T14:07:00.787Z","2023-04-04T17:59:44.563Z","2023-04-11T13:56:33.928Z","2023-04-14T17:44:39.016Z","2023-04-26T09:53:35.220Z","2023-05-17T07:45:39.297Z","2023-05-27T10:16:24.028Z","2023-07-15T12:12:54.034Z","2023-07-28T08:18:02.073Z","2023-07-29T14:55:21.024Z","2023-07-29T15:28:41.376Z","2023-07-31T08:37:45.839Z","2023-08-11T14:22:03.268Z","2023-08-12T16:46:14.997Z","2023-08-14T08:25:46.232Z","2023-08-24T20:53:20.458Z","2023-08-25T13:35:01.214Z","2023-08-26T17:01:40.160Z","2023-09-01T12:29:03.582Z","2023-10-03T12:34:53.128Z","2023-10-05T14:02:12.935Z","2023-10-15T14:27:41.453Z","2023-11-01T09:33:06.751Z","2023-11-02T14:52:42.482Z","2023-11-06T13:53:36.704Z","2023-11-08T11:06:46.620Z","2023-11-09T10:40:34.556Z","2023-11-09T16:19:27.035Z","2023-11-27T17:27:31.830Z","2023-11-29T11:03:42.400Z","2023-11-29T11:43:46.538Z","2023-11-29T13:54:24.930Z","2023-12-13T15:30:39.433Z","2023-12-14T15:38:41.950Z","2024-02-08T11:45:11.111Z","2024-03-04T10:00:35.234Z","2024-03-12T11:27:55.588Z","2024-04-02T13:26:15.035Z","2024-05-03T09:26:04.869Z","2024-05-09T08:05:19.242Z","2024-07-09T10:16:02.455Z","2024-07-23T21:23:18.360Z","2024-10-02T13:43:40.681Z","2024-10-03T19:16:03.763Z","2024-10-10T14:59:35.190Z","2024-10-11T13:04:10.869Z","2024-11-22T16:30:24.617Z","2024-11-28T10:58:30.222Z","2024-11-28T20:21:15.188Z","2024-12-02T13:32:09.750Z","2025-01-07T12:48:35.915Z","2025-01-20T15:41:34.006Z","2025-01-23T21:47:49.625Z","2025-02-18T10:11:23.533Z","2025-04-01T08:39:32.084Z","2025-04-04T14:20:45.768Z","2025-05-16T20:27:42.621Z","2025-05-27T08:10:18.690Z","2025-07-14T18:15:44.199Z","2025-07-18T16:37:06.862Z","2025-07-25T14:23:47.253Z","2025-07-31T15:41:47.714Z","2025-08-02T16:12:11.009Z","2025-09-18T10:04:57.323Z","2025-10-30T14:03:03.444Z","2025-11-10T15:35:20.314Z","2026-01-15T12:41:36.002Z","2026-02-08T21:07:23.674Z","2026-02-17T11:12:03.928Z","2026-02-20T09:23:59.427Z","2026-02-26T09:00:06.662Z","2026-04-02T20:48:06.269Z","2026-05-06T11:39:34.640Z","2026-05-20T10:21:30.883Z","2026-05-23T13:21:21.091Z","2026-05-27T17:23:54.566Z","2026-06-11T09:14:30.089Z","2026-10-12T14:30:28.206Z","Apache-2.0","RedMap",[379,385,391,397,403,409,415,421,427,433,439,445,451,457,463],{"name":380,"path":381,"url":382,"downloadUrl":383,"flow":384},"Add Geojson Building","examples\u002FAdd Geojson Building.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FAdd%20Geojson%20Building.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FAdd%20Geojson%20Building.json","[{\"id\":\"9b909d29.07c24\",\"type\":\"inject\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"Museum\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":260,\"y\":100,\"wires\":[[\"bcd3e780.6c6438\"]]},{\"id\":\"bcd3e780.6c6438\",\"type\":\"http request\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"method\":\"GET\",\"ret\":\"obj\",\"url\":\"https:\u002F\u002Fgist.githubusercontent.com\u002Fryanbaumann\u002Fa7d970386ce59d11c16278b90dde094d\u002Fraw\u002F8c384b4e418670a35dc054ab7da6638ff4073a69\u002Findoor_3D_map_example.geojson\",\"tls\":\"\",\"x\":410,\"y\":100,\"wires\":[[\"d4ab8d40.31c81\"]]},{\"id\":\"d4ab8d40.31c81\",\"type\":\"function\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"func\":\"var m = {overlay:msg.topic, geojson:msg.payload, fit:true};\\n\\nmsg.payload = {command:{map:m, lat:41.86672, lon:-87.61751}};\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":570,\"y\":100,\"wires\":[[\"f64e5234.4402e\"]]},{\"id\":\"f64e5234.4402e\",\"type\":\"worldmap\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"none\",\"showgrid\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"x\":800,\"y\":100,\"wires\":[]}]",{"name":386,"path":387,"url":388,"downloadUrl":389,"flow":390},"Add Minimap","examples\u002FAdd Minimap.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FAdd%20Minimap.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FAdd%20Minimap.json","[{\"id\":\"fd654fbf.7e7db\",\"type\":\"worldmap\",\"z\":\"846d7832.3348c8\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"14\",\"layer\":\"\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"none\",\"showgrid\":\"false\",\"path\":\"\u002Fworldmap\",\"x\":500,\"y\":540,\"wires\":[]},{\"id\":\"3a9f5292.247a0e\",\"type\":\"inject\",\"z\":\"846d7832.3348c8\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":130,\"y\":540,\"wires\":[[\"e5161e3c.df6a1\"]]},{\"id\":\"e5161e3c.df6a1\",\"type\":\"function\",\"z\":\"846d7832.3348c8\",\"name\":\"Add minimap\",\"func\":\"msg.payload = {\\n    command: {\\n        map: {\\n            minimap: \\\"OSM\\\",\\n            opt: {\\n    \\t\\t\\tcenterFixed: [51.05, -1.35],\\n    \\t\\t\\ttoggleDisplay: true\\n    \\t\\t}\\n        }\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":310,\"y\":540,\"wires\":[[\"fd654fbf.7e7db\"]]},{\"id\":\"ebe0f256.5a1b7\",\"type\":\"inject\",\"z\":\"846d7832.3348c8\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":130,\"y\":580,\"wires\":[[\"a7e940a5.a24b6\"]]},{\"id\":\"a7e940a5.a24b6\",\"type\":\"function\",\"z\":\"846d7832.3348c8\",\"name\":\"Remove minimap\",\"func\":\"msg.payload = {\\n    command: {\\n        map: {\\n            minimap: false\\n        }\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"x\":330,\"y\":580,\"wires\":[[\"fd654fbf.7e7db\"]]}]",{"name":392,"path":393,"url":394,"downloadUrl":395,"flow":396},"Basic Map","examples\u002FBasic Map.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FBasic%20Map.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FBasic%20Map.json","[{\"id\":\"ec9da974.051b48\",\"type\":\"inject\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":170,\"y\":160,\"wires\":[[\"f77a7ed4.f955d\"]]},{\"id\":\"f77a7ed4.f955d\",\"type\":\"function\",\"z\":\"ce7dd95c.f41c\",\"name\":\"Add person to map\",\"func\":\"var thing = {\\n    name:\\\"Jason Isaacs\\\", \\n    lat:51, \\n    lon:-1.45,\\n    icon:\\\"car\\\",\\n    iconColor:\\\"darkred\\\",\\n    extrainfo:\\\"Hello to Jason Isaacs\\\"\\n};\\nmsg.payload = thing;\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":360,\"y\":160,\"wires\":[[\"f83930ff.b21488\"]]},{\"id\":\"cd09f7be.079518\",\"type\":\"comment\",\"z\":\"ce7dd95c.f41c\",\"name\":\"Simple map - click inject to send point to map.\",\"info\":\"Adds a map at http:\u002F\u002F(your-server-ip):1880\u002Fworldmap. \\n\\nThe `function` node creates an object with some basic properties required to add to a map.\",\"x\":300,\"y\":100,\"wires\":[]},{\"id\":\"f83930ff.b21488\",\"type\":\"worldmap\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"false\",\"showgrid\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"x\":600,\"y\":160,\"wires\":[]}]",{"name":398,"path":399,"url":400,"downloadUrl":401,"flow":402},"Convex Hull around points","examples\u002FConvex Hull around points.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FConvex%20Hull%20around%20points.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FConvex%20Hull%20around%20points.json","[{\"id\":\"a0cdb588.2ba408\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":90,\"wires\":[[\"d7a5c615.1e6578\"]],\"l\":false},{\"id\":\"d7a5c615.1e6578\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Add Dave\",\"func\":\"msg.payload = {\\n    name:\\\"Dave\\\",\\n    lat:51,\\n    lon:-1,\\n    layer:\\\"foo\\\"\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":300,\"y\":90,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"7dcb7d4e.f5faa4\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Add Bob\",\"func\":\"msg.payload = {\\n    name:\\\"Bob\\\",\\n    lat:52,\\n    lon:-1,\\n    layer:\\\"foo\\\"\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":300,\"y\":135,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"a498ec44.fde27\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Add Fred\",\"func\":\"msg.payload = {\\n    name:\\\"Fred\\\",\\n    lat:51,\\n    lon:-2,\\n    layer:\\\"foo\\\"\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":300,\"y\":180,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"5c92395d.d709f8\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Add Joe\",\"func\":\"msg.payload = {\\n    name:\\\"Joe\\\",\\n    lat:52,\\n    lon:-2,\\n    layer:\\\"foo\\\",\\n    iconColor:\\\"blue\\\"\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":300,\"y\":225,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"1836dc1e.3ec894\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Add Mark\",\"func\":\"msg.payload = {\\n    name:\\\"Mark\\\",\\n    lat:51.5,\\n    lon:-1.5,\\n    layer:\\\"foo\\\",\\n    iconColor:\\\"green\\\"\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":300,\"y\":270,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"d439a183.9d7ca\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Add John\",\"func\":\"msg.payload = {\\n    name:\\\"John\\\",\\n    lat:50.5,\\n    lon:-2.5,\\n    layer:\\\"foo\\\",\\n    iconColor:\\\"blue\\\"\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":300,\"y\":315,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"43bc41e8.0385a\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Remove Mark\",\"func\":\"msg.payload = {\\n    name:\\\"Mark\\\",\\n    layer:\\\"foo\\\",\\n    deleted:true\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":320,\"y\":570,\"wires\":[[\"fd654fbf.7e7db\",\"4b5f6be5.96c1f4\"]]},{\"id\":\"4b5f6be5.96c1f4\",\"type\":\"worldmap-hull\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"prop\":\"layer\",\"x\":595,\"y\":255,\"wires\":[[\"fd654fbf.7e7db\"]]},{\"id\":\"fd654fbf.7e7db\",\"type\":\"worldmap\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"8\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"none\",\"showgrid\":\"false\",\"path\":\"\u002Fworldmap\",\"overlist\":\"CO\",\"maplist\":\"OSMG,OSMC,OSMH,EsriC,EsriS,EsriT\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":600,\"y\":360,\"wires\":[]},{\"id\":\"38179d31.94a972\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Remove Dave\",\"func\":\"msg.payload = {\\n    name:\\\"Dave\\\",\\n    layer:\\\"foo\\\",\\n    deleted:true\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":320,\"y\":390,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"b4ebdd.d201a42\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Remove Bob\",\"func\":\"msg.payload = {\\n    name:\\\"Bob\\\",\\n    layer:\\\"foo\\\",\\n    deleted:true\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":310,\"y\":435,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"4ab765d5.d63b7c\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Remove Fred\",\"func\":\"msg.payload = {\\n    name:\\\"Fred\\\",\\n    layer:\\\"foo\\\",\\n    deleted:true\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":320,\"y\":480,\"wires\":[[\"fd654fbf.7e7db\",\"4b5f6be5.96c1f4\"]]},{\"id\":\"41fbcbe1.602224\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Remove Joe\",\"func\":\"msg.payload = {\\n    name:\\\"Joe\\\",\\n    layer:\\\"foo\\\",\\n    deleted:true\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":310,\"y\":525,\"wires\":[[\"4b5f6be5.96c1f4\",\"fd654fbf.7e7db\"]]},{\"id\":\"0f4e6585f9afbcd7\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":135,\"wires\":[[\"7dcb7d4e.f5faa4\"]],\"l\":false},{\"id\":\"6c436bd05eaaa4e3\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":180,\"wires\":[[\"a498ec44.fde27\"]],\"l\":false},{\"id\":\"e97b916faeca80c5\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":225,\"wires\":[[\"5c92395d.d709f8\"]],\"l\":false},{\"id\":\"611d3c4798865b0c\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":270,\"wires\":[[\"1836dc1e.3ec894\"]],\"l\":false},{\"id\":\"3c835edcbc03e15f\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":315,\"wires\":[[\"d439a183.9d7ca\"]],\"l\":false},{\"id\":\"029fdb18b1447049\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":390,\"wires\":[[\"38179d31.94a972\"]],\"l\":false},{\"id\":\"9d473630bf56f60d\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":435,\"wires\":[[\"b4ebdd.d201a42\"]],\"l\":false},{\"id\":\"0efe0d29dc967c6b\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":480,\"wires\":[[\"4ab765d5.d63b7c\"]],\"l\":false},{\"id\":\"c059eda796d691f4\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":525,\"wires\":[[\"41fbcbe1.602224\"]],\"l\":false},{\"id\":\"78fe9cfb7d147384\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":570,\"wires\":[[\"43bc41e8.0385a\"]],\"l\":false},{\"id\":\"26d08e189f6137c0\",\"type\":\"function\",\"z\":\"fc2b85b48b73e276\",\"name\":\"Remove John\",\"func\":\"msg.payload = {\\n    name:\\\"John\\\",\\n    layer:\\\"foo\\\",\\n    deleted:true\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":320,\"y\":615,\"wires\":[[\"fd654fbf.7e7db\",\"4b5f6be5.96c1f4\"]]},{\"id\":\"ba88e8b9f69dc254\",\"type\":\"inject\",\"z\":\"fc2b85b48b73e276\",\"name\":\"\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payloadType\":\"date\",\"x\":180,\"y\":615,\"wires\":[[\"26d08e189f6137c0\"]],\"l\":false}]",{"name":404,"path":405,"url":406,"downloadUrl":407,"flow":408},"Custom Tooltip","examples\u002FCustom Tooltip.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FCustom%20Tooltip.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FCustom%20Tooltip.json","[{\"id\":\"ec9da974.051b48\",\"type\":\"inject\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":1010,\"y\":560,\"wires\":[[\"f77a7ed4.f955d\"]]},{\"id\":\"f77a7ed4.f955d\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Car + Label\",\"func\":\"var thing = {\\n    name:\\\"Jason Isaacs\\\", \\n    lat:51, \\n    lon:-1.45,\\n    icon:\\\"car\\\",\\n    iconColor:\\\"darkred\\\",\\n    extrainfo:\\\"Hello to Jason Isaacs\\\",\\n    label:\\\"This is a custom label\\\",\\n    tooltipOptions: {\\\"offset\\\" : [-100,-100], \\\"permanent\\\" : true, \\\"opacity\\\" : 1, \\\"direction\\\" : \\\"top\\\", \\\"className\\\" : \\\"tooltip\\\"}\\n};\\nmsg.payload = thing;\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":1230,\"y\":560,\"wires\":[[\"f83930ff.b21488\"]]},{\"id\":\"cd09f7be.079518\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Simple map - click inject to send info to map.\",\"info\":\"Adds a map at http:\u002F\u002F(your-server-ip):1880\u002Fworldmap. \\n\\nThe `function` node creates an object with some basic properties required to add to a map.\",\"x\":1170,\"y\":500,\"wires\":[]},{\"id\":\"f83930ff.b21488\",\"type\":\"worldmap\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"none\",\"showgrid\":\"false\",\"showruler\":\"true\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"overlist\":\"DR,CO,RA,DN,HM\",\"maplist\":\"OSMG,OSMC,EsriC,EsriS,EsriT,EsriO,EsriDG,NatGeo,UKOS,OpTop\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":1400,\"y\":560,\"wires\":[]}]",{"name":410,"path":411,"url":412,"downloadUrl":413,"flow":414},"ESRI featurelayer overlay","examples\u002FESRI featurelayer overlay.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FESRI%20featurelayer%20overlay.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FESRI%20featurelayer%20overlay.json","[{\"id\":\"573ef3eef64ca4c1\",\"type\":\"worldmap\",\"z\":\"70a15c4047f2ce55\",\"name\":\"\",\"lat\":\"34\",\"lon\":\"-119\",\"zoom\":\"10\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"deg\",\"showgrid\":\"false\",\"showruler\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"overlist\":\"CO\",\"maplist\":\"OSMG,OSMH,EsriC,EsriS\",\"mapname\":\"LocalOSM\",\"mapurl\":\"http:\u002F\u002Flocalhost:1885\u002Fstyles\u002Flight\u002F{z}\u002F{x}\u002F{y}.png\",\"mapopt\":\"\",\"mapwms\":false,\"x\":680,\"y\":560,\"wires\":[]},{\"id\":\"db4b02196f09bc6f\",\"type\":\"inject\",\"z\":\"70a15c4047f2ce55\",\"name\":\"trailheads\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"x\":220,\"y\":560,\"wires\":[[\"8dbe012b2a894e9b\"]]},{\"id\":\"8dbe012b2a894e9b\",\"type\":\"function\",\"z\":\"70a15c4047f2ce55\",\"name\":\"function 2\",\"func\":\"\\nconst style = function () {\\n    return { color: \\\"#000091\\\", weight: 2 };\\n};\\n\\nconst pointToLayer = function (geojson, latlng) {\\n    console.log(\\\"Point geo\\\", latlng, geojson);\\n    return L.circleMarker(latlng).bindPopup(geojson.properties.TRL_NAME);\\n};\\n\\nconst onEachFeature = function (geojson, layer) {\\n    console.log(\\\"Feature\\\", layer, geojson);\\n};\\n\\nmsg.payload = {\\n    command : {\\n        map : {\\n            overlay : \\\"Trailheads\\\",\\n            esri: \\\"https:\u002F\u002Fservices3.arcgis.com\u002FGVgbJbqm8hXASVYi\u002Farcgis\u002Frest\u002Fservices\u002FTrailheads_Styled\u002FFeatureServer\u002F0\\\",\\n            opt: {\\n                style: style.toString(),\\n                pointToLayer: pointToLayer.toString(),\\n                onEachFeature: onEachFeature.toString()\\n            }\\n        }\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":5,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":400,\"y\":560,\"wires\":[[\"573ef3eef64ca4c1\"]]},{\"id\":\"310aa5b8f88c225c\",\"type\":\"inject\",\"z\":\"70a15c4047f2ce55\",\"name\":\"trails\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"x\":210,\"y\":600,\"wires\":[[\"ec8831289bfb117c\"]]},{\"id\":\"ec8831289bfb117c\",\"type\":\"function\",\"z\":\"70a15c4047f2ce55\",\"name\":\"function 3\",\"func\":\"\\nconst style = function () {\\n    return { color: \\\"#009100\\\", weight: 3 };\\n};\\n\\nconst onEachFeature = function (geojson, layer) {\\n    console.log(\\\"Feature\\\", layer, geojson);\\n};\\n\\nmsg.payload = {\\n    command : {\\n        map : {\\n            overlay : \\\"Trails\\\",\\n            esri: \\\"https:\u002F\u002Fservices3.arcgis.com\u002FGVgbJbqm8hXASVYi\u002Farcgis\u002Frest\u002Fservices\u002FTrails_Styled\u002FFeatureServer\u002F0\\\",\\n            opt: {\\n                style: style.toString(),\\n                onEachFeature: onEachFeature.toString()\\n            }\\n        }\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":400,\"y\":600,\"wires\":[[\"573ef3eef64ca4c1\"]]},{\"id\":\"55fb1ea255465f0e\",\"type\":\"inject\",\"z\":\"70a15c4047f2ce55\",\"name\":\"parks\",\"props\":[{\"p\":\"payload\"},{\"p\":\"topic\",\"vt\":\"str\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"x\":210,\"y\":640,\"wires\":[[\"f23b7921618df33e\"]]},{\"id\":\"f23b7921618df33e\",\"type\":\"function\",\"z\":\"70a15c4047f2ce55\",\"name\":\"function 4\",\"func\":\"\\nconst style = function () {\\n    return {\\n        color: \\\"#910000\\\", \\n        weight: 1,\\n        \\\"fillColor\\\": \\\"#808000\\\",\\n        \\\"fillOpacity\\\": 0.1 };\\n};\\n\\nconst onEachFeature = function (feature, layer) {\\n    console.log(\\\"Feature\\\", feature);\\n    layer.bindPopup(feature.properties.PARK_NAME)\\n};\\n\\nmsg.payload = {\\n    command : {\\n        map : {\\n            overlay : \\\"Parks\\\",\\n            esri: \\\"https:\u002F\u002Fservices3.arcgis.com\u002FGVgbJbqm8hXASVYi\u002Farcgis\u002Frest\u002Fservices\u002FParks_and_Open_Space_Styled\u002FFeatureServer\u002F0\\\",\\n            opt: {\\n                maxZoom: 13,\\n                minZoom: 9,\\n                style: style.toString(),\\n                onEachFeature: onEachFeature.toString()\\n            }\\n        }\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":400,\"y\":640,\"wires\":[[\"573ef3eef64ca4c1\"]]}]",{"name":416,"path":417,"url":418,"downloadUrl":419,"flow":420},"Earthquake","examples\u002FEarthquake.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FEarthquake.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FEarthquake.json","[{\"id\":\"86457344.50e6b\",\"type\":\"inject\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"none\",\"x\":210,\"y\":100,\"wires\":[[\"9a142026.fa47f\"]]},{\"id\":\"9a142026.fa47f\",\"type\":\"function\",\"z\":\"ce7dd95c.f41c\",\"name\":\"add new layer\",\"func\":\"msg.payload = {};\\nmsg.payload.command = {};\\n\\nvar u = 'http:\u002F\u002F{s}.tile.openstreetmap.fr\u002Fhot\u002F{z}\u002F{x}\u002F{y}.png';\\nvar o = { maxZoom: 19, attribution: '\\u0026copy; OpenStreetMap'};\\n\\nmsg.payload.command.map = {name:\\\"OSMhot\\\", url:u, opt:o};\\nmsg.payload.command.layer = \\\"OSMhot\\\";\\n\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":440,\"y\":100,\"wires\":[[\"95e05f39.53ab28\"]]},{\"id\":\"2998e233.4ba64e\",\"type\":\"function\",\"z\":\"ce7dd95c.f41c\",\"name\":\"USGS Quake monitor csv re-parse\",\"func\":\"msg.payload.lat = msg.payload.latitude;\\nmsg.payload.lon = msg.payload.longitude;\\nmsg.payload.layer = \\\"earthquake\\\";\\nmsg.payload.name = msg.payload.id;\\nmsg.payload.icon = \\\"globe\\\";\\nmsg.payload.iconColor = \\\"orange\\\";\\n\\ndelete msg.payload.latitude;\\ndelete msg.payload.longitude;\\t\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":560,\"y\":240,\"wires\":[[\"95e05f39.53ab28\"]]},{\"id\":\"e72c5732.9fa198\",\"type\":\"function\",\"z\":\"ce7dd95c.f41c\",\"name\":\"move and zoom\",\"func\":\"msg.payload = { command:{layer:\\\"Esri Terrain\\\",lat:0,lon:0,zoom:3} };\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":440,\"y\":140,\"wires\":[[\"95e05f39.53ab28\"]]},{\"id\":\"12317723.589249\",\"type\":\"csv\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"sep\":\",\",\"hdrin\":true,\"hdrout\":\"\",\"multi\":\"one\",\"ret\":\"\\\\n\",\"temp\":\"\",\"x\":410,\"y\":180,\"wires\":[[\"2998e233.4ba64e\"]]},{\"id\":\"10e5e5f0.8daeaa\",\"type\":\"inject\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"none\",\"x\":210,\"y\":140,\"wires\":[[\"e72c5732.9fa198\"]]},{\"id\":\"b6917d83.d1bac\",\"type\":\"http request\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"method\":\"GET\",\"url\":\"http:\u002F\u002Fearthquake.usgs.gov\u002Fearthquakes\u002Ffeed\u002Fv1.0\u002Fsummary\u002F2.5_day.csv\",\"x\":290,\"y\":240,\"wires\":[[\"12317723.589249\"]]},{\"id\":\"3842171.4d487e8\",\"type\":\"inject\",\"z\":\"ce7dd95c.f41c\",\"name\":\"Quakes\",\"repeat\":\"900\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"none\",\"x\":220,\"y\":180,\"wires\":[[\"b6917d83.d1bac\"]]},{\"id\":\"95e05f39.53ab28\",\"type\":\"worldmap\",\"z\":\"ce7dd95c.f41c\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"false\",\"showgrid\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"x\":780,\"y\":140,\"wires\":[]}]",{"name":422,"path":423,"url":424,"downloadUrl":425,"flow":426},"Feedback","examples\u002FFeedback.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FFeedback.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FFeedback.json","[{\"id\":\"c643e022.1816c\",\"type\":\"worldmap\",\"z\":\"46f4b9ae1c66c1ba\",\"name\":\"\",\"lat\":\"30\",\"lon\":\"0\",\"zoom\":\"3\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"deg\",\"showgrid\":\"false\",\"showruler\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"worldmap\",\"overlist\":\"DR,CO,RA,DN\",\"maplist\":\"OSMG,OSMH,EsriS\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":1000,\"y\":480,\"wires\":[]},{\"id\":\"4966f5218c3fe1df\",\"type\":\"inject\",\"z\":\"46f4b9ae1c66c1ba\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"none\",\"x\":530,\"y\":480,\"wires\":[[\"87dff974113c8c54\"]]},{\"id\":\"87dff974113c8c54\",\"type\":\"function\",\"z\":\"46f4b9ae1c66c1ba\",\"name\":\"add new rectangle\",\"func\":\"\\nmsg.payload = {\\\"command\\\":{\\\"bounds\\\":[[49.83682820280039,-4.019763692204326],[51.4723362586149,1.1741268015945219]]}};\\nnode.send(msg);\\nmsg.payload = {\\\"command\\\":{\\\"zoom\\\":9.7}};\\nnode.send(msg);\\n\\n\\nvar popup = \\\"\\u003cbutton name=\\\\\\\"B1name\\\\\\\" onclick='feedback(\\\\\\\"${name}\\\\\\\", this.name + \\\\\\\" sends {x} Hellow\\\\\\\",\\\\\\\"myAction\\\\\\\",true);'\\u003eHellow1 from ${name}\\u003c\u002Fbutton\\u003e\\\";\\npopup += \\\"\\u003cbutton name=\\\\\\\"B2name\\\\\\\" onclick='feedback(\\\\\\\"${name}\\\\\\\", this.name + \\\\\\\" sends {x} Hellow\\\\\\\",\\\\\\\"myAction\\\\\\\",true);'\\u003eHellow2 from ${name}\\u003c\u002Fbutton\\u003e\\\";\\n\\nvar points =  [ { \\\"lat\\\": 50.66, \\\"lng\\\": -1.59 }, { \\\"lat\\\": 50.60, \\\"lng\\\": -1.47 } ] ;\\nmsg.payload =  {\\n    popup: popup.replace(\u002F\\\\{x\\\\}\u002Fg,\\\"popup\\\"),\\n    contextmenu: popup.replace(\u002F\\\\{x\\\\}\u002Fg, \\\"context\\\"),\\n    name: \\\"myShape\\\",\\n    area: points,\\n    clickable:true,\\n };\\nnode.send(msg);\\n\\nmsg.payload = {\\n    popup: popup.replace(\u002F\\\\{x\\\\}\u002Fg,\\\"popup\\\"),\\n    contextmenu: popup.replace(\u002F\\\\{x\\\\}\u002Fg, \\\"context\\\"),\\n    name: \\\"myMarker\\\",\\n    lat: 50.40,\\n    lon: -1.0,\\n    weight: 1,\\n};\\nnode.send(msg);\\nmsg.payload.command = {\\n    contextmenu: popup.replace(\u002F\\\\{x\\\\}\u002Fg,\\\"context\\\")\\n};\\nnode.send(msg);\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":770,\"y\":480,\"wires\":[[\"c643e022.1816c\",\"34ad8daae96efd3e\"]]},{\"id\":\"32d7cc4d4db67f66\",\"type\":\"worldmap in\",\"z\":\"46f4b9ae1c66c1ba\",\"name\":\"\",\"path\":\"\u002Fworldmap\",\"events\":\"connect,disconnect,point,layer,bounds,files,draw,other\",\"x\":500,\"y\":540,\"wires\":[[\"32a2b83008623990\"]]},{\"id\":\"32a2b83008623990\",\"type\":\"debug\",\"z\":\"46f4b9ae1c66c1ba\",\"name\":\"debug 14\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":680,\"y\":540,\"wires\":[]},{\"id\":\"34ad8daae96efd3e\",\"type\":\"debug\",\"z\":\"46f4b9ae1c66c1ba\",\"name\":\"debug 15\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":980,\"y\":400,\"wires\":[]}]",{"name":428,"path":429,"url":430,"downloadUrl":431,"flow":432},"Map in Dashboard","examples\u002FMap in Dashboard.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FMap%20in%20Dashboard.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FMap%20in%20Dashboard.json","[{\"id\":\"1714967f.e691ea\",\"type\":\"inject\",\"z\":\"64eed394.c7935c\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":\"\",\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":180,\"y\":800,\"wires\":[[\"1b24ad2f.198453\"]]},{\"id\":\"1b24ad2f.198453\",\"type\":\"function\",\"z\":\"64eed394.c7935c\",\"name\":\"\",\"func\":\"\u002F\u002F create random position\\nvar lat = 51 + Math.random() * 0.2;\\nvar lon = -1.45 + Math.random() * 0.2;\\nmsg.payload={\\n    lat:lat, \\n    lon:lon, \\n    name:\\\"Mike\\\", \\n    icon:\\\"male\\\", \\n    color:\\\"#000\\\"};\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":360,\"y\":860,\"wires\":[[\"de5c4044.d4e0f\",\"e0ec963913cbf7a9\"]]},{\"id\":\"de3a90c8.8179c\",\"type\":\"ui_button\",\"z\":\"64eed394.c7935c\",\"name\":\"\",\"group\":\"cd81d08b.eebb3\",\"order\":0,\"width\":0,\"height\":0,\"passthru\":false,\"label\":\"Move Mike\",\"tooltip\":\"\",\"color\":\"\",\"bgcolor\":\"\",\"icon\":\"fa-male\",\"payload\":\"\",\"payloadType\":\"str\",\"topic\":\"\",\"topicType\":\"str\",\"x\":180,\"y\":860,\"wires\":[[\"1b24ad2f.198453\"]]},{\"id\":\"223f301c.54ea9\",\"type\":\"comment\",\"z\":\"64eed394.c7935c\",\"name\":\"How to embed Map in Dashboard\",\"info\":\"This example shows how to embed the Worldmap \\nwithin the `node-red-dashboard`\\n\\nThe  flow creates a dashboard button that \\ngenerates a randon position, with the required \\nicon, and passes that to the worldmap. The\\nmap is configured to automatically pan to the\\nposition of any point that arrives.\\n\",\"x\":230,\"y\":740,\"wires\":[]},{\"id\":\"de5c4044.d4e0f\",\"type\":\"worldmap-tracks\",\"z\":\"64eed394.c7935c\",\"name\":\"\",\"depth\":\"5\",\"layer\":\"combined\",\"x\":500,\"y\":820,\"wires\":[[\"e0ec963913cbf7a9\"]]},{\"id\":\"e0ec963913cbf7a9\",\"type\":\"ui_worldmap\",\"z\":\"64eed394.c7935c\",\"group\":\"cd81d08b.eebb3\",\"order\":4,\"width\":0,\"height\":0,\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"hide\",\"layers\":\"hide\",\"panit\":\"true\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"true\",\"coords\":\"none\",\"showgrid\":\"true\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"x\":660,\"y\":860,\"wires\":[]},{\"id\":\"cd81d08b.eebb3\",\"type\":\"ui_group\",\"z\":\"64eed394.c7935c\",\"name\":\"Default\",\"tab\":\"b34078e6.e60df8\",\"order\":1,\"disp\":true,\"width\":\"6\"},{\"id\":\"b34078e6.e60df8\",\"type\":\"ui_tab\",\"z\":\"64eed394.c7935c\",\"name\":\"Home\",\"icon\":\"dashboard\"}]",{"name":434,"path":435,"url":436,"downloadUrl":437,"flow":438},"MouseCoordinates","examples\u002FMouseCoordinates.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FMouseCoordinates.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FMouseCoordinates.json","[{\"id\":\"c643e022.1816c\",\"type\":\"worldmap\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"lat\":\"30\",\"lon\":\"0\",\"zoom\":\"3\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"deg\",\"showgrid\":\"false\",\"showruler\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"worldmap\",\"overlist\":\"DR,CO,RA,DN\",\"maplist\":\"OSMG,OSMH,EsriS\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":1480,\"y\":700,\"wires\":[]},{\"id\":\"32d7cc4d4db67f66\",\"type\":\"worldmap in\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"path\":\"\u002Fworldmap\",\"events\":\"connect,disconnect,point,layer,bounds,files,draw,other\",\"x\":900,\"y\":700,\"wires\":[[\"32a2b83008623990\"]]},{\"id\":\"32a2b83008623990\",\"type\":\"debug\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"debug 14\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":1060,\"y\":620,\"wires\":[]},{\"id\":\"34ad8daae96efd3e\",\"type\":\"debug\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"debug 15\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"false\",\"statusVal\":\"\",\"statusType\":\"auto\",\"x\":1480,\"y\":620,\"wires\":[]},{\"id\":\"4cf111b68098072d\",\"type\":\"inject\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Deg + DMS + UTM\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":\"0.5\",\"topic\":\"\",\"payload\":\" {\\\"command\\\": {\\\"coords\\\" : \\\"deg,dms,utm\\\"}}\",\"payloadType\":\"json\",\"x\":1270,\"y\":700,\"wires\":[[\"c643e022.1816c\",\"34ad8daae96efd3e\"]]},{\"id\":\"610e6795facbc3b7\",\"type\":\"inject\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Deg + UTM\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":\"0.5\",\"topic\":\"\",\"payload\":\" {\\\"command\\\": {\\\"coords\\\" : \\\"deg,utm\\\"}}\",\"payloadType\":\"json\",\"x\":1250,\"y\":760,\"wires\":[[\"c643e022.1816c\",\"34ad8daae96efd3e\"]]},{\"id\":\"9a238dc42949cb17\",\"type\":\"inject\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"None\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":\"0.5\",\"topic\":\"\",\"payload\":\" {\\\"command\\\": {\\\"coords\\\" : \\\"\\\"}}\",\"payloadType\":\"json\",\"x\":1230,\"y\":820,\"wires\":[[\"c643e022.1816c\",\"34ad8daae96efd3e\"]]}]",{"name":440,"path":441,"url":442,"downloadUrl":443,"flow":444},"Moving Icons Demo & Builder","examples\u002FMoving Icons Demo & Builder.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FMoving%20Icons%20Demo%20&%20Builder.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FMoving%20Icons%20Demo%20%26%20Builder.json","[{\"id\":\"f83930ff.b21488\",\"type\":\"worldmap\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"dms\",\"showgrid\":\"true\",\"showruler\":\"true\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"overlist\":\"DR,CO,RA,DN,HM\",\"maplist\":\"OSMG,OSMC,EsriC,EsriS,EsriT,EsriO,EsriDG,NatGeo,UKOS,OpTop\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":1760,\"y\":920,\"wires\":[]},{\"id\":\"9a57374d6e27c511\",\"type\":\"switch\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Get Map Actions\",\"property\":\"payload.action\",\"propertyType\":\"msg\",\"rules\":[{\"t\":\"eq\",\"v\":\"connected\",\"vt\":\"str\"},{\"t\":\"eq\",\"v\":\"disconnect\",\"vt\":\"str\"},{\"t\":\"eq\",\"v\":\"addObject\",\"vt\":\"str\"},{\"t\":\"eq\",\"v\":\"drawdelete\",\"vt\":\"str\"},{\"t\":\"eq\",\"v\":\"updateObject\",\"vt\":\"str\"},{\"t\":\"eq\",\"v\":\"move\",\"vt\":\"str\"}],\"checkall\":\"true\",\"repair\":false,\"outputs\":6,\"x\":260,\"y\":1000,\"wires\":[[\"47bd2da7d8d032c5\"],[\"762cf0202e6b8fb3\"],[\"d589c991d812517c\"],[\"1c6b932267082192\"],[\"79cff05c3692bc63\"],[\"a6633f7325bfc284\"]]},{\"id\":\"46fb64f7db15d138\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Map Context Menu (1; 2; 3; 4; 5)\",\"info\":\"\",\"x\":530,\"y\":860,\"wires\":[]},{\"id\":\"e480e2a7d19f3060\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Add to Store (8)\",\"info\":\"\",\"x\":480,\"y\":1000,\"wires\":[]},{\"id\":\"d589c991d812517c\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Add Object\",\"func\":\"\u002F\u002F Move attributes using destructuring\\nmsg.payload = {\\n  ...msg.payload,\\n  ...msg.payload.value,\\n};\\n\\n\u002F\u002F Optionally, delete the internal object\\ndelete msg.payload.value;\\ndelete msg.payload.action;\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":470,\"y\":1040,\"wires\":[[\"e6ebed7ef8df0dcd\"]]},{\"id\":\"e2b0cb7ac27e86d2\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"This example can be used as a marker builder.\\\\n It utilizes the map's context menu option to create a form for adding map elements,\\\\n displays the msg.payload value for the element creation, and generates the map icon. \\\\n The example also demonstrates the following Red Map features: \\\\n  1. Mapcontext menu\u002FObject Cotextmenu\\\\n  2. Usage of input fields\u002FHTML\u002FJavaScript in context menus\\\\n  3. Different icon types for Red Map markers (use SIDC link to generate SIDC string)\\\\n 4. Attributes of Red Map markers\\\\n  5. Feedback function\\\\n  6. Usage of the map input node\\\\n 7. Delete Objects\\\\n 8. Store list of objects\\\\n 9. Moving Objects\\\\n Usage: Sample data loaded, rightclick to update values\\\\n create multiple objects using rightclick on the map,\\\\n copy the payload field into function or change nodes to inject the icon from the backend\\\\n rightclick on any object to update its attributes or delete it\\\\n (contextmenu popup will stay open to allow payload copy)\",\"info\":\"\",\"x\":780,\"y\":420,\"wires\":[]},{\"id\":\"e6ebed7ef8df0dcd\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Save in Objects list\",\"func\":\"let objects = global.get(\\\"objects\\\");\\nif (objects === undefined) objects = [];\\n\\nlet index = objects.findIndex(obj =\\u003e obj.name === msg.payload.name);\\n\\nif (index == -1) {\\n    objects.push(msg.payload);\\n    global.set(\\\"objects\\\", objects);\\n} else {\\n    console.log(`Object ${msg.payload.name} already exists`);\\n    msg.payload = {};\\n}\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":710,\"y\":1040,\"wires\":[[\"d49d5d6e6b436813\"]]},{\"id\":\"d35078c8f9df08de\",\"type\":\"split\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Split Objects\",\"splt\":\"\\\\n\",\"spltType\":\"str\",\"arraySplt\":1,\"arraySpltType\":\"len\",\"stream\":false,\"addname\":\"\",\"property\":\"payload\",\"x\":1030,\"y\":780,\"wires\":[[\"94ae7a702138b59e\"]]},{\"id\":\"1c6b932267082192\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Delete Object\",\"func\":\"var objects = global.get(\\\"objects\\\");\\n\\nobjects = objects.filter(obj =\\u003e obj.name !== msg.payload.name);\\nglobal.set(\\\"objects\\\",objects);\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":480,\"y\":1120,\"wires\":[[\"eb0a9d4569cf7b06\"]]},{\"id\":\"eb0a9d4569cf7b06\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Delete \",\"func\":\"let objectName = msg.payload.name;\\nmsg.payload = {\\\"name\\\" : objectName, \\\"deleted\\\" : true};\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":670,\"y\":1140,\"wires\":[[\"d49d5d6e6b436813\"]]},{\"id\":\"8a911b867f46b866\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Input Node (6)\",\"info\":\"\",\"x\":90,\"y\":940,\"wires\":[]},{\"id\":\"f1d7f67c49c076ca\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Delete (from store)\",\"info\":\"\",\"x\":490,\"y\":1080,\"wires\":[]},{\"id\":\"6b5a7d3cfab068e8\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Delete (From Map) (7)\",\"info\":\"\",\"x\":700,\"y\":1100,\"wires\":[]},{\"id\":\"cfb3ba5e89438cd6\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Move (9)\",\"info\":\"\",\"x\":1180,\"y\":740,\"wires\":[]},{\"id\":\"79cff05c3692bc63\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Update Data\",\"func\":\"\\n\u002F\u002F Move attributes using destructuring\\nmsg.payload = {\\n  ...msg.payload,\\n  ...msg.payload.value\\n};\\n\\n\u002F\u002F Optionally, delete the internal object\\ndelete msg.payload.value;\\ndelete msg.payload.action;\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":470,\"y\":1200,\"wires\":[[\"d22c566910bce313\"]]},{\"id\":\"749d6b246ceb2048\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Update Object Data\",\"info\":\"\",\"x\":490,\"y\":1160,\"wires\":[]},{\"id\":\"eaea660f91589f0d\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Init - Set flow vars\",\"func\":\"\u002F\u002FCreate flow constants for reuse\\n\\n\u002F\u002F Utility function to capitalize first letter of a word\\nfunction capitalize(str) {\\n    return str.charAt(0).toUpperCase() + str.slice(1);\\n}\\n\u002F\u002F Icons samples list \\nconst iconsObject = {\\n    \\\"RedMap-Icons\\\": \\\"plane,smallplane,ship,car,bus,uav,quad,helicopter,sensor,arrow,wind,satellite,iss,locate,friend,hostile,neutral,unknown,earthquake\\\",\\n    \\\"Font-Awesome-1\\\": \\\"ambulance, automobile, bicycle, bus, cab, car, fighter-jet, motorcycle, plane, rocket, ship, space-shuttle, subway, taxi, train, truck, wheelchair, wheelchair-alt,ambulance, h-square, heart, heart-o, heartbeat, hospital-o, medkit, plus-square, stethoscope, user-md, wheelchair, wheelchair-alt\\\",\\n    \\\"Font-Awesome-2\\\": \\\"fa-ambulance, fa-automobile, fa-bicycle, fa-bus, fa-cab, fa-car, fa-fighter-jet, fa-motorcycle, fa-plane, fa-rocket, fa-ship, fa-space-shuttle, fa-subway, fa-taxi, fa-train, fa-truck, fa-wheelchair, fa-wheelchair-alt, fa-ambulance, fa-h-square, fa-heart, fa-heart-o, fa-heartbeat, fa-hospital-o, fa-medkit, fa-plus-square, fa-stethoscope, fa-user-md, fa-wheelchair, fa-wheelchair-alt\\\",\\n    \\\"Emojis-Icons\\\": \\\":umbrella_with_rain_drops:, :coffee:, :aquarius:, :anchor:, :parking:, :cyclone:, :foggy:, :closed_umbrella:, :night_with_stars:, :sunrise_over_mountains:, :sunrise:, :city_sunset:, :city_sunrise:, :rainbow:, :bridge_at_night:, :ocean:, :volcano:, :milky_way:, :earth_africa:, :earth_americas:, :earth_asia:, :globe_with_meridians:, :new_moon:, :waxing_crescent_moon:, :first_quarter_moon:, :moon:, :waxing_gibbous_moon:, :full_moon:, :waning_gibbous_moon:, :last_quarter_moon:, :waning_crescent_moon:, :crescent_moon:, :new_moon_with_face:, :first_quarter_moon_with_face:, :last_quarter_moon_with_face:, :full_moon_with_face:, :sun_with_face:, :star2:, :stars:, :thermometer:, :mostly_sunny:, :sun_small_cloud:, :barely_sunny:, :sun_behind_cloud:, :partly_sunny_rain:, :sun_behind_rain_cloud:, :rain_cloud:, :snow_cloud:, :lightning:, :lightning_cloud:, :tornado:, :tornado_cloud:, :fog:, :wind_blowing_face:, :sunflower:, :blossom:, :corn:, :ear_of_rice:, :herb:, :four_leaf_clover:, :maple_leaf:, :fallen_leaf:, :leaves:, :mushroom:, :tomato:, :eggplant:, :grapes:, :melon:, :watermelon:, :tangerine:, :lemon:, :banana:, :pineapple:, :apple:, :green_apple:, :pear:, :peach:, :cherries:, :strawberry:, :hamburger:, :pizza:, :meat_on_bone:, :poultry_leg:, :rice_cracker:, :rice_ball:, :rice:, :curry:, :ramen:, :spaghetti:, :bread:, :fries:, :sweet_potato:, :dango:, :oden:, :sushi:, :fried_shrimp:, :fish_cake:, :icecream:, :shaved_ice:, :ice_cream:, :doughnut:, :cookie:, :chocolate_bar:, :candy:, :lollipop:, :custard:, :honey_pot:, :cake:, :bento:, :stew:, :fried_egg:, :cooking:, :fork_and_knife:, :tea:, :sake:, :wine_glass:, :cocktail:, :tropical_drink:, :beer:, :beers:, :baby_bottle:, :knife_fork_plate:, :champagne:, :popcorn:, :ribbon:, :ticket:, :slot_machine:, :8ball:, :game_die:, :bowling:, :flower_playing_cards:, :basketball:, :checkered_flag:, :snowboarder:, :woman-running:, :man-running:, :runner:, :running:, :woman-surfing:, :man-surfing:, :surfer:, :sports_medal:, :trophy:, :horse_racing:, :football:, :rugby_football:, :woman-swimming:, :man-swimming:, :swimmer:, :woman-lifting-weights:, :man-lifting-weights:, :weight_lifter:, :woman-golfing:, :man-golfing:, :golfer:, :racing_motorcycle:, :racing_car:, :cricket_bat_and_ball:, :volleyball:, :field_hockey_stick_and_ball:, :ice_hockey_stick_and_puck:, :table_tennis_paddle_and_ball:, :snow_capped_mountain:, :camping:, :beach_with_umbrella:, :building_construction:, :house_buildings:, :cityscape:, :derelict_house_building:, :classical_building:, :desert:, :desert_island:, :national_park:, :stadium:, :house:, :house_with_garden:, :office:, :post_office:, :european_post_office:, :hospital:, :bank:, :atm:, :hotel:, :love_hotel:, :convenience_store:, :school:, :department_store:, :factory:, :izakaya_lantern:, :lantern:, :japanese_castle:, :european_castle:, :rainbow-flag:, :waving_white_flag:, :flag-england:, :flag-scotland:, :flag-wales:, :waving_black_flag:, :rosette:, :label:, :badminton_racquet_and_shuttlecock:, :bow_and_arrow:, :amphora:, :horse:, :monkey_face:, :dog:, :pig:, :frog:, :hamster:, :wolf:, :bear:, :panda_face:, :busstop:, :minibus:, :ambulance:, :fire_engine:, :police_car:, :oncoming_police_car:, :taxi:, :oncoming_taxi:, :car:, :red_car:, :oncoming_automobile:, :blue_car:, :truck:, :articulated_lorry:, :tractor:, :monorail:, :mountain_railway:, :suspension_railway:, :mountain_cableway:, :aerial_tramway:, :ship:, :woman-rowing-boat:, :man-rowing-boat:, :rowboat:, :speedboat:, :traffic_light:, :vertical_traffic_light:, :construction:, :rotating_light:, :triangular_flag_on_post:, :door:, :no_entry_sign:, :smoking:, :no_smoking:\\\",\\n    \\\"Weather-lite\\\": \\\"wi-wu-nt_tstorms,wi-wu-nt_cloudywi-wu-clear,wi-wu-nt_clear,wi-wu-chancerain,wi-wu-snow,wi-wu-sleet,wi-wu-fog,wi-darksky-wind,wi-darksky-cloudy,wi-wu-cloudy,wi-wu-nt_partlysunny,wi-darksky-hail,wi-wu-tstorms,wi-darksky-tornado,wi-wu-mostlysunny,wi-owm-09d,wi-wu-nt_partlycloudy,wi-wu-nt_hazy,wi-owm-09n,wi-wu-nt_rain,wi-owm-11n,wi-wu-nt_snow,wi-wu-nt_fog,wi-wu-flurries,wi-wu-hazy,wi-wu-rain,wi-wu-nt_flurries,wi-wu-nt_sleet\\\",\\n};\\nflow.set(\\\"iconsObject\\\",iconsObject);\\n\\n\u002F\u002FBuild icons categories select\\nfunction buildCategoriesSelect() {\\n    let html = '';\\n\\n    \u002F\u002F Build the category select (first dropdown)\\n    html += \\\"\\u003cselect style=\\\\\\\"height: 1.8em !important\\\\\\\" id=\\\\\\\"categorySelect\\\\\\\" onchange='let category = this.value; const allOptions = document.querySelectorAll(\\\\\\\"#iconsSelect option\\\\\\\");allOptions.forEach(option =\\u003e {option.disabled = true;option.style.display = \\\\\\\"none\\\\\\\";});const categoryOptions = document.querySelectorAll(\\\\\\\"#iconsSelect .\\\\\\\" + category );categoryOptions.forEach(option =\\u003e {option.disabled = false;option.style.display = \\\\\\\"block\\\\\\\";})'\\u003e\\\\n\\\";\\n    html += '\\u003coption value=\\\"\\\"\\u003e-- Select Icon Category --\\u003c\u002Foption\\u003e\\\\n';\\n    for (let category in iconsObject) {\\n        html += `\\u003coption value=\\\"${category}\\\"\\u003e${capitalize(category.trim())}\\u003c\u002Foption\\u003e\\\\n`;\\n    }\\n    html += '\\u003c\u002Fselect\\u003e\\\\n';\\n    return html;\\n}\\n\\n\u002F\u002FFlow `categoriesSelect` will hold html icon categories select snippet\\nflow.set(\\\"categoriesSelect\\\", buildCategoriesSelect());\\n\\n\u002F\u002Fbuild icons select\\nfunction buildIconsSelect() {\\n    let html = '';\\n    \u002F\u002F Build the options select (second dropdown)\\n    html += '\\u003cselect style=\\\\\\\"height: 1.8em !important\\\\\\\" id=\\\"iconsSelect\\\" onchange=\\\"addToForm(this.id,this.value)\\\"\\u003e\\\\n';\\n    html += '\\u003coption value=\\\"\\\"\\u003e-- Select Icon --\\u003c\u002Foption\\u003e\\\\n';\\n    for (let category in iconsObject) {\\n        const options = iconsObject[category].split(\\\",\\\");\\n        options.forEach(value =\\u003e {\\n            html += `\\u003coption value=\\\"${value.trim()}\\\" class=\\\"${category} hidden-option\\\"\\u003e${capitalize(value.trim())}\\u003c\u002Foption\\u003e\\\\n`;\\n        });\\n    }\\n    html += '\\u003c\u002Fselect\\u003e\\\\n';\\n\\n    return html;\\n}\\n\u002F\u002FFlow `categoriesSelect` will hold html icons select snippet\\nflow.set(\\\"iconsSelect\\\", buildIconsSelect());\\n\\nlet objects = [{ \\\"name\\\": \\\"ID8794\\\", \\\"draggable\\\": true, \\\"track\\\": 0, \\\"speed\\\": 0, \\\"lat\\\": 51.050015, \\\"lon\\\": -1.399382, \\\"icon\\\": \\\"helicopter\\\", \\\"iconColor\\\": \\\"blue\\\" }, { \\\"name\\\": \\\"ID8590\\\", \\\"layer\\\": \\\"test\\\", \\\"draggable\\\": true, \\\"track\\\": 0, \\\"speed\\\": 0, \\\"lat\\\": 51.07683, \\\"lon\\\": -1.433625, \\\"icon\\\": \\\"plane\\\", \\\"iconColor\\\": \\\"red\\\" }, { \\\"name\\\": \\\"ID8478\\\", \\\"draggable\\\": true, \\\"track\\\": 0, \\\"speed\\\": 0, \\\"lat\\\": 51.073893, \\\"lon\\\": -1.366041, \\\"icon\\\": \\\"smallplane\\\", \\\"iconColor\\\": \\\"green\\\" }, { \\\"name\\\": \\\"ID4820\\\", \\\"draggable\\\": false, \\\"track\\\": 0, \\\"speed\\\": 0, \\\"lat\\\": 51.119299, \\\"lon\\\": -1.399198, \\\"SIDC\\\": \\\"SFACMF------\\\", \\\"options\\\": { \\\"additionalInformation\\\": \\\"Info\\\" } }];\\nglobal.set(\\\"objects\\\",objects);\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":470,\"y\":700,\"wires\":[[\"e2852ab33b037f41\"]]},{\"id\":\"3d65405c591368be\",\"type\":\"inject\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":true,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"x\":290,\"y\":700,\"wires\":[[\"eaea660f91589f0d\"]]},{\"id\":\"a6633f7325bfc284\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Move \",\"func\":\"\\n\u002F\u002F Optionally, delete the internal object\\ndelete msg.payload.from;\\ndelete msg.payload.action;\\ndelete msg.payload.contextmenu;\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":450,\"y\":1280,\"wires\":[[\"d22c566910bce313\"]]},{\"id\":\"d22c566910bce313\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Update Objects\",\"func\":\"var objects = global.get(\\\"objects\\\");\\n\\n\\nlet index = objects.findIndex(obj =\\u003e obj.name === msg.payload.name);\\n\\nif (index !== -1) {\\n    objects[index] = msg.payload;\\n    global.set(\\\"objects\\\", objects);\\n} else {\\n    msg.payload = {};\\n}\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":700,\"y\":1240,\"wires\":[[\"d49d5d6e6b436813\"]]},{\"id\":\"13a14b48df4d6602\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Update Object Position\",\"info\":\"\",\"x\":500,\"y\":1240,\"wires\":[]},{\"id\":\"77340ceb5ff1b75c\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Object Context Menu \",\"info\":\"\",\"x\":1540,\"y\":740,\"wires\":[]},{\"id\":\"f2bc3916dc12ca60\",\"type\":\"change\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Get Objects\",\"rules\":[{\"t\":\"set\",\"p\":\"payload\",\"pt\":\"msg\",\"to\":\"objects\",\"tot\":\"global\",\"dc\":true}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":870,\"y\":780,\"wires\":[[\"d35078c8f9df08de\"]]},{\"id\":\"5d68caed225732c8\",\"type\":\"inject\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"1\",\"crontab\":\"\",\"once\":true,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"date\",\"x\":290,\"y\":780,\"wires\":[[\"18568709ef76cce5\"]]},{\"id\":\"e2852ab33b037f41\",\"type\":\"change\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Init\",\"rules\":[{\"t\":\"set\",\"p\":\"connected\",\"pt\":\"global\",\"to\":\"false\",\"tot\":\"bool\"},{\"t\":\"set\",\"p\":\"updateRate\",\"pt\":\"global\",\"to\":\"5000\",\"tot\":\"num\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":630,\"y\":700,\"wires\":[[]]},{\"id\":\"18568709ef76cce5\",\"type\":\"switch\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Connected?\",\"property\":\"connected\",\"propertyType\":\"global\",\"rules\":[{\"t\":\"true\"}],\"checkall\":\"true\",\"repair\":false,\"outputs\":1,\"x\":450,\"y\":780,\"wires\":[[\"41067c9c0c7f3268\"]]},{\"id\":\"762cf0202e6b8fb3\",\"type\":\"change\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Disconnect\",\"rules\":[{\"t\":\"set\",\"p\":\"connected\",\"pt\":\"global\",\"to\":\"false\",\"tot\":\"bool\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":470,\"y\":960,\"wires\":[[]]},{\"id\":\"94ae7a702138b59e\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Move objects\",\"func\":\"let objects = global.get(\\\"objects\\\");\\nlet object = msg.payload;\\nconst time = global.get(\\\"updateRate\\\")\u002F1000;\\n\\nlet index = objects.findIndex(obj =\\u003e obj.name === object.name);\\n\\nfunction toRadians(degrees) {\\n    return degrees * Math.PI \u002F 180;\\n}\\n\\nfunction toDegrees(radians) {\\n    return radians * 180 \u002F Math.PI;\\n}\\n\\nfunction calculateNewPosition(lat1, lon1, speed, heading, time) {\\n    const R = 6371000; \u002F\u002F Earth's radius in meters\\n\\n    \u002F\u002F Convert latitude and longitude from degrees to radians\\n    const lat1Rad = toRadians(lat1);\\n    const lon1Rad = toRadians(lon1);\\n\\n    \u002F\u002F Convert heading to radians\\n    const headingRad = toRadians(heading);\\n\\n    \u002F\u002F Calculate the distance traveled\\n    const distance = speed * time;\\n\\n    \u002F\u002F Calculate the new latitude\\n    const lat2Rad = Math.asin(Math.sin(lat1Rad) * Math.cos(distance \u002F R) + \\n        Math.cos(lat1Rad) * Math.sin(distance \u002F R) * Math.cos(headingRad));\\n\\n    \u002F\u002F Calculate the new longitude\\n    const lon2Rad = lon1Rad + Math.atan2(Math.sin(headingRad) * Math.sin(distance \u002F R) * Math.cos(lat1Rad),\\n        Math.cos(distance \u002F R) - Math.sin(lat1Rad) * Math.sin(lat2Rad));\\n\\n    \u002F\u002F Convert the new latitude and longitude back to degrees\\n    const lat2 = toDegrees(lat2Rad);\\n    const lon2 = toDegrees(lon2Rad);\\n\\n    return { lat: lat2, lon: lon2 };\\n}\\nif ((object.speed \\u003e 0) \\u0026\\u0026 index !== -1) {\\n    const newPosition = calculateNewPosition(object.lat, object.lon, object.speed, object.track, time);\\n    object.lat = newPosition.lat;\\n    object.lon = newPosition.lon;\\n    objects[index] = object;\\n    msg.moved = true;\\n} else {\\n    msg.moved = false;\\n}\\nglobal.set(\\\"objects\\\", objects);\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":1190,\"y\":780,\"wires\":[[\"62537dafd11e7751\"]]},{\"id\":\"f85ab8a742392a3c\",\"type\":\"template\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Object contextmenu\",\"field\":\"payload.contextmenu\",\"fieldType\":\"msg\",\"format\":\"html\",\"syntax\":\"mustache\",\"template\":\"Update Object Properties\\u003cbr \u002F\\u003e\\u003cbr \u002F\\u003e\\n\\u003ctable id=\\\"addTable\\\"\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLayer\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eDraggable\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eTrack\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eSpeed\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eAlt\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLat\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLon\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLabel\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003e\\u003ca href=\\\"worldmap\u002Funitgenerator.html\\\" target=\\\"_blank\\\"\\u003eSIDC\\u003c\u002Fa\\u003e\\u003c\u002Ftd\\u003e\\n\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eSIDC Options\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eIcon Category\\u003c\u002Ftd\\u003e\\u003ctd\\u003e{{{menu.categories}}}\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eIcon\\u003c\u002Ftd\\u003e\\u003ctd\\u003e{{{menu.icons}}}\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\n    \\u003ctd\\u003eiconSize\\u003c\u002Ftd\\u003e\\n    \\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\n\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eiconColor\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003etoolTip\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003ePayload\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003cdiv id=\\\"payload\\\"\\u003e\\u003c\u002Fdiv\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003ctd\\u003eUpdate Object Data\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003ctd\\u003eDelete Object\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003c\u002Ftable\\u003e\",\"output\":\"str\",\"x\":1560,\"y\":780,\"wires\":[[\"f83930ff.b21488\"]]},{\"id\":\"62537dafd11e7751\",\"type\":\"function\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Set Form Values\",\"func\":\"let icons = flow.get(\\\"iconsObject\\\");\\nlet category = Object.keys(icons).find(key =\\u003e icons[key].includes(msg.payload.icon));\\nmsg.menu = {};\\nmsg.menu.layer = msg.payload.layer;\\nmsg.menu.drag = msg.payload.draggable === true ? \\\"checked\\\" : \\\"\\\";\\nmsg.menu.track = msg.payload.track || 0;\\nmsg.menu.speed = msg.payload.speed || 0;\\nmsg.menu.alt = msg.payload.alt || 0;\\nmsg.menu.lat = msg.payload.lat;\\nmsg.menu.lon = msg.payload.lon;\\nmsg.menu.label = msg.payload.label || \\\"\\\";\\nmsg.menu.SIDC = msg.payload.SIDC || \\\"\\\";\\nmsg.menu.options = JSON.stringify(msg.payload.options) || \\\"\\\";\\nmsg.menu.categories = flow.get(\\\"categoriesSelect\\\").replace(category+\\\"\\\\\\\"\\\",category+\\\"\\\\\\\" selected\\\");\\nmsg.menu.icons = flow.get(\\\"iconsSelect\\\").replace(msg.payload.icon+\\\"\\\\\\\"\\\",msg.payload.icon+\\\"\\\\\\\" selected\\\");\\nmsg.menu.iconSize = msg.payload.iconSize || 32;\\nmsg.menu.iconColor = msg.payload.iconColor || \\\"\\\";\\nmsg.menu.tooltip = msg.payload.tooltip || \\\"\\\";\\n\\n\\n\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":1360,\"y\":780,\"wires\":[[\"f85ab8a742392a3c\"]]},{\"id\":\"d49d5d6e6b436813\",\"type\":\"switch\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Payload?\",\"property\":\"payload\",\"propertyType\":\"msg\",\"rules\":[{\"t\":\"nempty\"}],\"checkall\":\"true\",\"repair\":false,\"outputs\":1,\"x\":940,\"y\":1140,\"wires\":[[\"f83930ff.b21488\"]]},{\"id\":\"a4c43fc35ddc389b\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Redra cycle\",\"info\":\"\",\"x\":290,\"y\":740,\"wires\":[]},{\"id\":\"5c0439b67a783979\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Init\",\"info\":\"\",\"x\":270,\"y\":660,\"wires\":[]},{\"id\":\"f4623e3523188939\",\"type\":\"comment\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Immediate draw\",\"info\":\"\",\"x\":940,\"y\":1100,\"wires\":[]},{\"id\":\"47bd2da7d8d032c5\",\"type\":\"change\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Connected\",\"rules\":[{\"t\":\"set\",\"p\":\"connected\",\"pt\":\"global\",\"to\":\"true\",\"tot\":\"bool\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":470,\"y\":920,\"wires\":[[\"68a4405c6a59ddd8\"]]},{\"id\":\"68a4405c6a59ddd8\",\"type\":\"template\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Map contextmenu\",\"field\":\"payload.command.contextmenu\",\"fieldType\":\"msg\",\"format\":\"html\",\"syntax\":\"mustache\",\"template\":\"Update Object Properties\\u003cbr \u002F\\u003e\\u003cbr \u002F\\u003e\\n\\u003ctable id=\\\"addTable\\\"\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eName\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLayer\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eDraggable\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eTrack\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eSpeed\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eAlt\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLat\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLon\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eLabel\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003e\\u003ca href=\\\"worldmap\u002Funitgenerator.html\\\" target=\\\"_blank\\\"\\u003eSIDC\\u003c\u002Fa\\u003e\\u003c\u002Ftd\\u003e\\n\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eSIDC Options\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eIcon Category\\u003c\u002Ftd\\u003e\\u003ctd\\u003e{{{flow.categoriesSelect}}}\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eIcon\\u003c\u002Ftd\\u003e\\u003ctd\\u003e{{{flow.iconsSelect}}}\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\n    \\u003ctd\\u003eiconSize\\u003c\u002Ftd\\u003e\\n    \\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\n\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003eiconColor\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003etoolTip\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003ePayload\\u003c\u002Ftd\\u003e\\u003ctd\\u003e\\u003cdiv id=\\\"payload\\\"\\u003e\\u003c\u002Fdiv\\u003e\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003ctr\\u003e\\u003ctd\\u003e\\u003c\u002Ftd\\u003e\\u003ctd\\u003eAdd New Object\\u003c\u002Ftd\\u003e\\u003c\u002Ftr\\u003e\\n\\u003c\u002Ftable\\u003e\",\"output\":\"str\",\"x\":670,\"y\":920,\"wires\":[[\"f83930ff.b21488\"]]},{\"id\":\"8923e313189793d4\",\"type\":\"delay\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Rate\",\"pauseType\":\"rate\",\"timeout\":\"5\",\"timeoutUnits\":\"seconds\",\"rate\":\"1\",\"nbRateUnits\":\"1\",\"rateUnits\":\"second\",\"randomFirst\":\"1\",\"randomLast\":\"5\",\"randomUnits\":\"seconds\",\"drop\":true,\"allowrate\":true,\"outputs\":1,\"x\":710,\"y\":780,\"wires\":[[\"f2bc3916dc12ca60\"]]},{\"id\":\"41067c9c0c7f3268\",\"type\":\"change\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"Rate\",\"rules\":[{\"t\":\"set\",\"p\":\"rate\",\"pt\":\"msg\",\"to\":\"updateRate\",\"tot\":\"global\"}],\"action\":\"\",\"property\":\"\",\"from\":\"\",\"to\":\"\",\"reg\":false,\"x\":590,\"y\":780,\"wires\":[[\"8923e313189793d4\"]]},{\"id\":\"be0f2591062868c9\",\"type\":\"worldmap in\",\"z\":\"f6f2187d.f17ca8\",\"name\":\"\",\"path\":\"\u002Fworldmap\",\"events\":\"connect,disconnect,point,layer,bounds,files,draw,other\",\"x\":60,\"y\":1000,\"wires\":[[\"9a57374d6e27c511\"]]}]",{"name":446,"path":447,"url":448,"downloadUrl":449,"flow":450},"SIDC icons with flags","examples\u002FSIDC icons with flags.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FSIDC%20icons%20with%20flags.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FSIDC%20icons%20with%20flags.json","[{\"id\":\"2e5fb67b7383373a\",\"type\":\"worldmap\",\"z\":\"51335a8bc38f387c\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"false\",\"showgrid\":\"false\",\"showruler\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"overlist\":\"DR,CO,RA,DN\",\"maplist\":\"OSMG,OSMC,EsriC,EsriS,UKOS\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":740,\"y\":120,\"wires\":[]},{\"id\":\"a43cf3b6fb5c779a\",\"type\":\"inject\",\"z\":\"51335a8bc38f387c\",\"name\":\"\",\"props\":[],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"x\":290,\"y\":120,\"wires\":[[\"814986215a0adc67\"]]},{\"id\":\"814986215a0adc67\",\"type\":\"function\",\"z\":\"51335a8bc38f387c\",\"name\":\"2525C with country\",\"func\":\"msg.payload = {\\n    name: \\\"Dave\\\",\\n    lat: 51.0,\\n    lon: -1.20,\\n    SIDC: \\\"SFAPC-------GBR\\\",\\n    options:{\\n        staffComments: \\\"Comment A\\\",\\n        direction:220,\\n        speed:\\\"111\\\",\\n        targetNumber:\\\"AB1234\\\",\\n        additionalInformation:\\\"some more info\\\",\\n        commonIdentifier:\\\"Hawk\\\",\\n        type:\\\"Some Type\\\"\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":490,\"y\":120,\"wires\":[[\"2e5fb67b7383373a\"]]},{\"id\":\"22188e4b94786964\",\"type\":\"inject\",\"z\":\"51335a8bc38f387c\",\"name\":\"\",\"props\":[],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"x\":290,\"y\":180,\"wires\":[[\"b33a82ee22d45a25\"]]},{\"id\":\"b33a82ee22d45a25\",\"type\":\"function\",\"z\":\"51335a8bc38f387c\",\"name\":\"2525D with flag\",\"func\":\"msg.payload = {\\n    name: \\\"Jon\\\",\\n    lat: 51.1,\\n    lon: -1.20,\\n    SIDC: \\\"10061500351105000000\\\",\\n    flag: \\\"DE\\\",\\n    options: {\\n        staffComments: \\\"Comment B\\\",\\n        direction: 300,\\n        speed: \\\"110\\\",\\n        additionalInformation: \\\"some more info\\\",\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":480,\"y\":180,\"wires\":[[\"2e5fb67b7383373a\"]]},{\"id\":\"a505c3cbe0ae507a\",\"type\":\"inject\",\"z\":\"51335a8bc38f387c\",\"name\":\"\",\"props\":[],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"x\":290,\"y\":240,\"wires\":[[\"a75fc8cb90ab6b1b\"]]},{\"id\":\"a75fc8cb90ab6b1b\",\"type\":\"function\",\"z\":\"51335a8bc38f387c\",\"name\":\"2525D with country\",\"func\":\"msg.payload = {\\n    name: \\\"Mike\\\",\\n    lat: 51.0,\\n    lon: -1.50,\\n    SIDC: \\\"10032700000000000000\\\",\\n    options: {\\n        staffComments: \\\"Comment C\\\",\\n        direction: 120,\\n        country: \\\"FR\\\",\\n        additionalInformation: \\\"yet more info\\\",\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":490,\"y\":240,\"wires\":[[\"2e5fb67b7383373a\"]]},{\"id\":\"84429b6fce72a6e1\",\"type\":\"inject\",\"z\":\"51335a8bc38f387c\",\"name\":\"\",\"props\":[],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"x\":290,\"y\":60,\"wires\":[[\"374f2d903bb3dc01\"]]},{\"id\":\"374f2d903bb3dc01\",\"type\":\"function\",\"z\":\"51335a8bc38f387c\",\"name\":\"2525C with flag\",\"func\":\"msg.payload = {\\n    name: \\\"Joe\\\",\\n    lat: 51.1,\\n    lon: -1.5,\\n    SIDC: \\\"SUGPUCATM---\\\",\\n    flag: \\\"CH\\\",\\n    options:{\\n        staffComments: \\\"Comment D\\\",\\n        direction:60,\\n        speed:\\\"111\\\"\\n    }\\n}\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":480,\"y\":60,\"wires\":[[\"2e5fb67b7383373a\"]]}]",{"name":452,"path":453,"url":454,"downloadUrl":455,"flow":456},"Split Map With Swipe","examples\u002FSplit Map With Swipe.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FSplit%20Map%20With%20Swipe.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FSplit%20Map%20With%20Swipe.json","[{\"id\":\"2e9ce367.acdb9c\",\"type\":\"worldmap\",\"z\":\"e956b3364e3ffca6\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"8\",\"layer\":\"OSMG\",\"cluster\":\"0\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"none\",\"path\":\"\u002Fworldmap\",\"overlist\":\"CO\",\"maplist\":\"OSMG,OSMC,OSMH,EsriC,EsriS,EsriT,EsriO\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":570,\"y\":600,\"wires\":[]},{\"id\":\"8d0f8d4c.3cd21\",\"type\":\"function\",\"z\":\"e956b3364e3ffca6\",\"name\":\"remove split\",\"func\":\"msg.payload = {command:{side:\\\"none\\\"}};\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":380,\"y\":660,\"wires\":[[\"2e9ce367.acdb9c\"]]},{\"id\":\"311acf75.93ff8\",\"type\":\"function\",\"z\":\"e956b3364e3ffca6\",\"name\":\"Satellite\",\"func\":\"msg.payload = {\\n    command:{\\n        side: \\\"Esri Satellite\\\", \\n        split: 66,\\n        showlayer: \\\"roads\\\"\\n    }\\n};\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"x\":390,\"y\":600,\"wires\":[[\"2e9ce367.acdb9c\"]]},{\"id\":\"eaea1a90.f27b98\",\"type\":\"worldmap in\",\"z\":\"e956b3364e3ffca6\",\"name\":\"\",\"path\":\"\u002Fworldmap\",\"events\":\"connect\",\"x\":90,\"y\":600,\"wires\":[[\"4540d879.244f88\"]]},{\"id\":\"4540d879.244f88\",\"type\":\"switch\",\"z\":\"e956b3364e3ffca6\",\"name\":\"\",\"property\":\"payload.action\",\"propertyType\":\"msg\",\"rules\":[{\"t\":\"eq\",\"v\":\"connected\",\"vt\":\"str\"}],\"checkall\":\"true\",\"repair\":false,\"outputs\":1,\"x\":240,\"y\":600,\"wires\":[[\"311acf75.93ff8\"]]},{\"id\":\"f77366dc.818138\",\"type\":\"inject\",\"z\":\"e956b3364e3ffca6\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":100,\"y\":660,\"wires\":[[\"8d0f8d4c.3cd21\"]]}]",{"name":458,"path":459,"url":460,"downloadUrl":461,"flow":462},"Trigger reload of data","examples\u002FTrigger reload of data.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FTrigger%20reload%20of%20data.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FTrigger%20reload%20of%20data.json","[{\"id\":\"62ae3b3c.8de704\",\"type\":\"worldmap in\",\"z\":\"e956b3364e3ffca6\",\"name\":\"\",\"path\":\"\u002Fworldmap\",\"events\":\"connect\",\"x\":165,\"y\":630,\"wires\":[[\"2eadb3d5.d063ec\",\"259809c4.43edf6\"]]},{\"id\":\"2eadb3d5.d063ec\",\"type\":\"debug\",\"z\":\"e956b3364e3ffca6\",\"name\":\"\",\"active\":true,\"tosidebar\":true,\"console\":false,\"tostatus\":false,\"complete\":\"true\",\"targetType\":\"full\",\"x\":335,\"y\":590,\"wires\":[]},{\"id\":\"259809c4.43edf6\",\"type\":\"switch\",\"z\":\"e956b3364e3ffca6\",\"name\":\"\",\"property\":\"payload.action\",\"propertyType\":\"msg\",\"rules\":[{\"t\":\"eq\",\"v\":\"connected\",\"vt\":\"str\"}],\"checkall\":\"true\",\"repair\":false,\"outputs\":1,\"x\":335,\"y\":630,\"wires\":[[]]},{\"id\":\"13a00ba8.dcc8e4\",\"type\":\"comment\",\"z\":\"e956b3364e3ffca6\",\"name\":\"Reload trigger\",\"info\":\"The output from the switch will fire whenever a browser connects (or reconnects).\\n\\nThis can be used to retrieve stored datapoints and resend them to the map, as by default the main does not retain any sata between refreshes.\\n\\nThe debug node will show other properties that may be useful to trigger other actions.\\n\",\"x\":175,\"y\":590,\"wires\":[]}]",{"name":464,"path":465,"url":466,"downloadUrl":467,"flow":468},"sidcEdgeIcon control","examples\u002FsidcEdgeIcon control.json","https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FsidcEdgeIcon%20control.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fdceejay\u002FRedMap\u002Fmaster\u002Fexamples\u002FsidcEdgeIcon%20control.json","[{\"id\":\"3e0aaa7abbebfb76\",\"type\":\"inject\",\"z\":\"5ffb0f06dfc7e99e\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"str\",\"x\":630,\"y\":440,\"wires\":[[\"1b0f9c61acc853d8\"]]},{\"id\":\"1b0f9c61acc853d8\",\"type\":\"function\",\"z\":\"5ffb0f06dfc7e99e\",\"name\":\"Add SIDC object to map\",\"func\":\"msg.payload = {\\n    \\\"name\\\": \\\"Emergency Medical Operation\\\",\\n    \\\"lat\\\": 51.05,\\n    \\\"lon\\\": -1.35,\\n    \\\"SIDC\\\": \\\"ENOPA-------\\\",\\n    \\\"options\\\": { \\\"fillOpacity\\\": 0.8, \\\"additionalInformation\\\": \\\"Extra info\\\" }\\n}\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":840,\"y\":440,\"wires\":[[\"e12fb3cdb87416ed\"]]},{\"id\":\"cbeb8daf52cb3088\",\"type\":\"comment\",\"z\":\"5ffb0f06dfc7e99e\",\"name\":\"Simple map - click inject to send point to map.\",\"info\":\"Adds a map at http:\u002F\u002F(your-server-ip):1880\u002Fworldmap. \\n\\nThe `function` node creates a SIDC object with some basic properties required to add to a map.\",\"x\":830,\"y\":380,\"wires\":[]},{\"id\":\"e12fb3cdb87416ed\",\"type\":\"worldmap\",\"z\":\"5ffb0f06dfc7e99e\",\"name\":\"\",\"lat\":\"\",\"lon\":\"\",\"zoom\":\"\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"none\",\"showgrid\":\"false\",\"showruler\":\"true\",\"allowFileDrop\":\"false\",\"path\":\"\u002Fworldmap\",\"overlist\":\"DR,CO,RA,DN,HM\",\"maplist\":\"OSMG,OSMC,EsriC,EsriS,EsriT,EsriO,EsriDG,NatGeo,UKOS,OpTop\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":1060,\"y\":440,\"wires\":[]},{\"id\":\"c5da3e3241f2bfcc\",\"type\":\"inject\",\"z\":\"5ffb0f06dfc7e99e\",\"name\":\"Disable Edge Icon\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"{\\\"command\\\" : {\\\"sidcEdgeIcon\\\" : false}}\",\"payloadType\":\"json\",\"x\":850,\"y\":480,\"wires\":[[\"e12fb3cdb87416ed\"]]},{\"id\":\"017d2569f2c8a046\",\"type\":\"inject\",\"z\":\"5ffb0f06dfc7e99e\",\"name\":\"Enable Edge Icon\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"{\\\"command\\\" : {\\\"sidcEdgeIcon\\\" : true}}\",\"payloadType\":\"json\",\"x\":850,\"y\":520,\"wires\":[[\"e12fb3cdb87416ed\"]]},{\"id\":\"a6cfecb5747ff649\",\"type\":\"inject\",\"z\":\"5ffb0f06dfc7e99e\",\"name\":\"Error Edge Icon (=1)\",\"props\":[{\"p\":\"payload\"}],\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"onceDelay\":0.1,\"topic\":\"\",\"payload\":\"{\\\"command\\\" : {\\\"sidcEdgeIcon\\\" :  1 }}\",\"payloadType\":\"json\",\"x\":850,\"y\":560,\"wires\":[[\"e12fb3cdb87416ed\"]]}]","\u003Ch1 id=\"node-red-contrib-web-worldmap\">\u003Ca class=\"header-anchor\" href=\"#node-red-contrib-web-worldmap\">node-red-contrib-web-worldmap\u003C\u002Fa>\u003C\u002Fh1>\n\u003Cp>A \u003Ca href=\"https:\u002F\u002Fnodered.org\" target=\"mapinfo\">Node-RED\u003C\u002Fa> node to provide a world map web page for plotting \"things\" on. Please feel free to \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fdceejay\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fstatic\u002Fv1?label=Sponsor&amp;message=%E2%9D%A4&amp;logo=GitHub&amp;color=%23fe8e86\" alt=\"\" \u002F>\u003C\u002Fa> this project.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fnodered.org\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-Node--RED-red\" alt=\"platform\" \u002F>\u003C\u002Fa>\n\u003Cimg src=\"https:\u002F\u002Fbadge.fury.io\u002Fjs\u002Fnode-red-contrib-web-worldmap.svg\" alt=\"NPM version\" \u002F>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdceejay\u002Fredmap\u002Fblob\u002Fmaster\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fdceejay\u002Fredmap.svg\" alt=\"GitHub license\" \u002F>\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fdceejay.github.io\u002Fpages\u002Fimages\u002Fredmap.png\" alt=\"Map Image\" \u002F>\u003C\u002Fp>\n\u003Ch3 id=\"updates\">\u003Ca class=\"header-anchor\" href=\"#updates\">Updates\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\n\u003Cp>v5.8.2 - Fix map lock, shape name\u002Fpopup bug. Bump libs\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.8.1 - Fix draggable event\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.8.0 - Stop double click on icons zooming in. Bump uuid lib.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.7.2 - Bump express libs.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.7.0 - Add events for openPopup and closePopup, small popup fixups. Add showdialog command.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.6.1 - Also call autoswitch on initial connect to ensure map in view.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.6.0 - Autoswitch pmtiles basemaps based on zoom and\u002For coverage.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.5.8 - Bump qs dep for CVE\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.5.7 - Fix COG handling for built in icons, bump various libs for CVEs\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.5.4 - slight tweak to geojson property display as table\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.5.3 - ensure SOG gets picked up earlier in chain\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.5.2 - Slight improvement for on\u002Foffline choice of map\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.5.1 - Fix maxNativeZoom for pmtiles to pull from tiles files. Issue #312\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.5.0 - Add ability to load raster pmtiles files. Issue #312\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.4.0 - Let msg.payload.command.zoomLevels set an array of acceptable zoom levels. Issue #312\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.3.0 - Let msg.payload.popupOptions object set Leaflet popup options so it can be customised. Issue #311\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>v5.2.0 - Allow left click send back co-ords. Let Button be replaceable more easily and take value property. Issue #308 and #309\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>see \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002FCHANGELOG.md\">CHANGELOG\u003C\u002Fa> for full list of changes.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"install\">\u003Ca class=\"header-anchor\" href=\"#install\">Install\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Either use the Manage Palette option in the Node-RED Editor menu, or run the following command in your Node-RED user directory - typically \u003Ccode>~\u002F.node-red\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cpre>\u003Ccode>    npm i node-red-contrib-web-worldmap\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"usage\">\u003Ca class=\"header-anchor\" href=\"#usage\">Usage\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Plots \"things\" on a map. By default the map will be served from \u003Ccode>{httpRoot}\u002Fworldmap\u003C\u002Fcode>, but this\ncan be changed in the configuration panel.\u003C\u002Fp>\n\u003Cp>Use keyboard shortcut \u003Ccode>⌘⇧m\u003C\u002Fcode>, \u003Ccode>ctrl-shift-m\u003C\u002Fcode> to jump to the map.\u003C\u002Fp>\n\u003Cp>The minimum \u003Cstrong>msg.payload\u003C\u002Fstrong> must contain \u003Ccode>name\u003C\u002Fcode>, \u003Ccode>lat\u003C\u002Fcode> and \u003Ccode>lon\u003C\u002Fcode> properties, for example\u003C\u002Fp>\n\u003Cpre>\u003Ccode>    msg.payload = { \"name\":\"Jason\", \"lat\":51.05, \"lon\":-1.35 }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>name\u003C\u002Fcode> \u003Cstrong>must\u003C\u002Fstrong> be a unique identifier across the whole map. Repeated location updates to the same \u003Ccode>name\u003C\u002Fcode> move the marker.\u003C\u002Fp>\n\u003Cp>Optional properties for \u003Cstrong>msg.payload\u003C\u002Fstrong> include\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>deleted\u003C\u002Fstrong> : set to true to remove the named marker. (default false)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>draggable\u003C\u002Fstrong> : set to true to allow marker to be moved by the mouse. (default false)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>layer\u003C\u002Fstrong> : specify a layer on the map to add marker to. (default \"unknown\")\u003C\u002Fli>\n\u003Cli>\u003Cstrong>track | hdg | heading | COG | bearing\u003C\u002Fstrong> : when combined with speed, draws a vector. (only first will be used)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>speed\u003C\u002Fstrong> : when combined with track, hdg, heading, or bearing, draws a leader line vector - should be in m\u002Fs. Can also be specified as \"20 kph\", or \"20 mph\", or \"20 kt\". i.e a string with units.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SOG\u003C\u002Fstrong> : speed over ground - speed in knots.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>alt | altitude | altft | altm\u003C\u002Fstrong> : Altitude in meters, but can use \u003Cem>altft\u003C\u002Fem> to specify feet instead.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>accuracy\u003C\u002Fstrong> : when combined with heading vector, draws an arc of possible direction.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>color\u003C\u002Fstrong> : CSS color name or #rrggbb value for heading vector line or accuracy polygon.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>icon\u003C\u002Fstrong> : \u003Ca href=\"https:\u002F\u002Ffontawesome.com\u002Fv4.7.0\u002Ficons\u002F\" target=\"mapinfo\">font awesome\u003C\u002Fa> icon name, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPaul-Reed\u002Fweather-icons-lite\" target=\"mapinfo\">weather-lite\u003C\u002Fa> icon, :emoji name:, or https:\u002F\u002F or inline data:image\u002F uri.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>iconColor\u003C\u002Fstrong> : Standard CSS colour name or #rrggbb hex value.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>iconSize\u003C\u002Fstrong> : Set the size in pixels of the \"special\" icons and web icons.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SIDC\u003C\u002Fstrong> : NATO symbology code (can be used instead of icon). See below.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>building\u003C\u002Fstrong> : OSMbulding GeoJSON feature set to add 2.5D buildings to buildings layer. See below.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ttl\u003C\u002Fstrong> : time to live, how long an individual marker stays on map in seconds (overrides general maxage setting, minimum 20 seconds). Setting to 0 disables the timeout.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>photoUrl\u003C\u002Fstrong> : adds an image pointed at by the url to the popup box.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>videoUrl\u003C\u002Fstrong> : adds an mp4 video pointed at by the url to the popup box. Ideally 320x240 in size.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>weblink\u003C\u002Fstrong> : adds a link to an external page. Either set a url as a \u003Cem>string\u003C\u002Fem>, or an \u003Cem>object\u003C\u002Fem> like \u003Ccode>{\"name\":\"BBC News\", \"url\":\"https:\u002F\u002Fnews.bbc.co.uk\", \"target\":\"_new\"}\u003C\u002Fcode>, or multiple links with an \u003Cem>array of objects\u003C\u002Fem> \u003Ccode>[{\"name\":\"BBC News\", \"url\":\"https:\u002F\u002Fnews.bbc.co.uk\", \"target\":\"_new\"},{\"name\":\"node-red\", \"url\":\"https:\u002F\u002Fnodered.org\", \"target\":\"_new\"}]\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>addtoheatmap\u003C\u002Fstrong> : set to false to exclude point from contributing to the heatmap layer. (default true)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>intensity\u003C\u002Fstrong> : set to a value of 0.1 - 1.0 to set the intensity of the point on the heatmap layer. (default 1.0)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>clickable\u003C\u002Fstrong> : Default true. Setting to false disables showing any popup.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>popped\u003C\u002Fstrong> : set to true to automatically open the popup info box, set to false to close it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>popup\u003C\u002Fstrong> : html to fill the popup if you don't want the automatic default of the properties list. Using this overrides photourl, videourl and weblink options.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>popupOptions\u003C\u002Fstrong> : optional object to help style the popup - See Leaflet popup docs for options - eg to add a custom class - \u003Ccode>{className:\"mySpecialPopup\",width:600}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>label\u003C\u002Fstrong> : displays the contents as a permanent label next to the marker, or\u003C\u002Fli>\n\u003Cli>\u003Cstrong>tooltip\u003C\u002Fstrong> : displays the contents when you hover over the marker. (Mutually exclusive with label. Label has priority)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>tooltipOptions\u003C\u002Fstrong> : custom tooltip\u002Flabel options  (offset, direction, permanent, sticky, interactive, opacity, className) )\u003C\u002Fli>\n\u003Cli>\u003Cstrong>contextmenu\u003C\u002Fstrong> : an html fragment to display on right click of marker - defaults to delete marker. You can specify \u003Ccode>${name}\u003C\u002Fcode> to substitute in the name of the marker. Set to \u003Ccode>\"\"\u003C\u002Fcode> to disable just this instance.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Any other \u003Ccode>msg.payload\u003C\u002Fcode> properties will be added to the icon popup text box. This can be\noverridden by using the \u003Cstrong>popup\u003C\u002Fstrong> property to supply your own html content. If you use the\npopup property it will completely replace the contents so photourl, videourl and weblink are meaningless in this mode.\u003C\u002Fp>\n\u003Ch3 id=\"icons\">\u003Ca class=\"header-anchor\" href=\"#icons\">Icons\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>You may select any of the Font Awesome set of \u003Ca href=\"https:\u002F\u002Ffontawesome.com\u002Fv4.7.0\u002Ficons\u002F\">icons\u003C\u002Fa>.\nIf you use the name without the fa- prefix (eg \u003Ccode>male\u003C\u002Fcode>) you will get the icon inside a generic marker shape. If you use the fa- prefix (eg \u003Ccode>fa-male\u003C\u002Fcode>) you will get the icon on its own. Likewise you can use any of the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPaul-Reed\u002Fweather-icons-lite\">Weather-lite\u003C\u002Fa> icons by using the wi- prefix. These map to icons returned by common weather API such as DarkSky and OpenWeatherMap - for example \u003Ccode>\"wi-owm-\"+msg.payload.weather[0].icon\u003C\u002Fcode> will pickup the icon returned from the OpenWeatherMap API.\u003C\u002Fp>\n\u003Cp>You can also specify an emoji as the icon by using the :emoji name: syntax - for example \u003Ccode>:smile:\u003C\u002Fcode>. Here is a \u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Femojilist.md\">list of emojis\u003C\u002Fa>\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>Note: Not all browsers\u002FOS support unicode emoji - if you can see the Swiss flag here (🇨🇭) then you may be OK.\u003C\u002Fp>\n\u003Cp>Or you can specify an image to load as an icon by setting the icon to \u003Ccode>http(s):\u002F\u002F...\u003C\u002Fcode> By default it will be scaled to 32x32 pixels. You can change the size by setting \u003Cstrong>iconSize\u003C\u002Fstrong> to a number of pixels - eg 64. Example icon - \u003Ccode>\"https:\u002F\u002Fimg.icons8.com\u002Fwindows\u002F32\u002F000000\u002Fbird.png\"\u003C\u002Fcode>  or you can use an inline image of the form \u003Ccode>data:image\u002F...\u003C\u002Fcode>  which uses a base64 encoded image.\u003C\u002Fp>\n\u003Cp>There are also several special icons...\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>plane\u003C\u002Fstrong> : a jet plane icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>smallplane\u003C\u002Fstrong> : a light aircraft icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ship\u003C\u002Fstrong> : a ship icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>car\u003C\u002Fstrong> : a car icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>bus\u003C\u002Fstrong> : a bus\u002Fcoach icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>uav\u003C\u002Fstrong> : a small drone uav like icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>quad\u003C\u002Fstrong> : a small quadcopter uav like icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>helicopter\u003C\u002Fstrong> : a small helicopter icon that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>sensor\u003C\u002Fstrong> : a camera icon that points to the heading angle.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>arrow\u003C\u002Fstrong> : a map GPS arrow type pointer that aligns with the heading of travel.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>wind\u003C\u002Fstrong> : a wind arrow that points in the direction the wind is coming FROM.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>satellite\u003C\u002Fstrong> : a small satellite icon.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>iss\u003C\u002Fstrong> : a slightly larger icon for the ISS.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>locate\u003C\u002Fstrong> : a 4 corner outline to locate a point without obscuring it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>friend\u003C\u002Fstrong> : pseudo NATO style blue rectangle. (but see NATO SIDC option below)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>hostile\u003C\u002Fstrong> : pseudo NATO style red circle.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>neutral\u003C\u002Fstrong> : pseudo NATO style green square.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>unknown\u003C\u002Fstrong> : pseudo NATO style yellow square.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>earthquake\u003C\u002Fstrong> : black circle - diameter proportional to \u003Ccode>msg.mag\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The size of these can also be set in pixels using the \u003Cstrong>iconSize\u003C\u002Fstrong> property, e.g. \u003Ccode>iconSize:96\u003C\u002Fcode>.\nThe default size is 32 pixels.\u003C\u002Fp>\n\u003Ch4 id=\"nato-symbology\">\u003Ca class=\"header-anchor\" href=\"#nato-symbology\">NATO Symbology\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>You can use NATO symbols from \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fspatialillusions\u002Fmilsymbol\" target=\"mapinfo\">milsymbol.js\u003C\u002Fa>.\nTo do this you need to supply a \u003Ccode>msg.payload.SIDC\u003C\u002Fcode> 2525 code instead of an icon, for example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = {\n    \"name\": \"Emergency Medical Operation\",\n    \"lat\": 51.05,\n    \"lon\": -1.35,\n    \"SIDC\": \"ENOPA-------\",\n    \"options\": { \"fillOpacity\":0.8, \"additionalInformation\":\"Extra info\" }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>SIDC codes can be generated using the built-in unitgenerator tool.\u003C\u002Fp>\n\u003Cp>There are lots of extra options you can specify as \u003Ccode>msg.payload.options\u003C\u002Fcode> - see the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fspatialillusions\u002Fmilsymbol\u002Fblob\u002Fmaster\u002Fdocs\u002FREADME.md\" target=\"mapinfo\">milsymbol docs here\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Note: If the SIDC code is a 2525C 15 characters long, where chars 13 and 14 are a country code - then the country flag emoji is added to the staffComments field of the icon. If it's a 20 char 2525D code then the options:country property will be used to create the flag.\u003C\u002Fp>\n\u003Ch4 id=\"tak-visualisation\">\u003Ca class=\"header-anchor\" href=\"#tak-visualisation\">TAK Visualisation\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>Users of \u003Ca href=\"https:\u002F\u002Ftak.gov\">TAK\u003C\u002Fa> can use the \u003Ca href=\"https:\u002F\u002Fflows.nodered.org\u002Fnode\u002Fnode-red-contrib-tak-registration\">TAK ingest node\u003C\u002Fa> to create a JSON formatted TAK event object, received from a TAK server. This can be fed directly into the worldmap node.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fdceejay\u002Fpages\u002Fblob\u002Fmaster\u002FTAKflow.png?raw=true\" alt=\"Tak Flow\" \u002F>\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fdceejay\u002Fpages\u002Fblob\u002Fmaster\u002FTAKicons.png?raw=true\" alt=\"Tak Image\" \u002F>\u003C\u002Fp>\n\u003Ch3 id=\"areas-rectangles-lines-and-greatcircles\">\u003Ca class=\"header-anchor\" href=\"#areas-rectangles-lines-and-greatcircles\">Areas, Rectangles, Lines, and GreatCircles\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>If the msg.payload contains an \u003Cstrong>area\u003C\u002Fstrong> property - that is an array of co-ordinates, e.g.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = {\"name\": \"zone1\", \"area\": [ [51.05, -0.08], [51.5, -1], [51.2, -0.047] ]}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>then rather than draw a point and icon it draws the polygon. If the \"area\" array only has 2\nelements, then it assumes this is a bounding box for a rectangle and draws a rectangle.\u003C\u002Fp>\n\u003Cp>Likewise if it contains a \u003Cstrong>line\u003C\u002Fstrong> property it will draw the polyline.\u003C\u002Fp>\n\u003Cp>If the payload also includes a property \u003Ccode>fit:true\u003C\u002Fcode> the map will zoom to fit the line or area. Alternatively you can use \u003Ccode>fly:true\u003C\u002Fcode> instead of fit for a more animated look.\u003C\u002Fp>\n\u003Cp>Finally if a \u003Cstrong>greatcircle\u003C\u002Fstrong> property is set containing an array of two coordinates then an arc\nfollowing the great circle between the two co-ordinates is plotted.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = {name:\"GC1\", color:\"#ff00ff\", greatcircle:[ [51.464,0], [25.76,-80.18] ] }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Shapes can also have a \u003Cstrong>popup\u003C\u002Fstrong> property containing html, but you MUST also set a property \u003Ccode>clickable:true\u003C\u002Fcode> in order to allow it to be seen. You can also set \u003Cstrong>tooltip\u003C\u002Fstrong> to create a label that appears when you hover the mouse over the shape.\u003C\u002Fp>\n\u003Cp>There are extra optional properties you can specify - see Options below.\u003C\u002Fp>\n\u003Ch3 id=\"circles-and-ellipses\">\u003Ca class=\"header-anchor\" href=\"#circles-and-ellipses\">Circles and Ellipses\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>If the msg.payload contains a \u003Cstrong>radius\u003C\u002Fstrong> property, as well as name, lat and lon, then rather\nthan draw a point it will draw a circle. The \u003Cem>radius\u003C\u002Fem> property is specified in meters.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = { \"name\":\"A3090\", \"lat\":51.05, \"lon\":-1.35, \"radius\":3000 }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>As per Areas and Lines you may also specify \u003Cem>color\u003C\u002Fem>, \u003Cem>fillColor\u003C\u002Fem>, and \u003Cem>layer\u003C\u002Fem>, see Options section below.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload =  {\n    \"name\": \"circle\",\n    \"lat\": 51.515,\n    \"lon\": -0.1235,\n    \"radius\": 1000,\n    \"layer\": \"drawing\",\n    \"iconColor\": '#464646',\n    \"stroke\": false,\n    \"fillOpacity\": 0.8,\n    \"clickable\": true\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>If the \u003Cstrong>radius\u003C\u002Fstrong> property is an array of two numbers, these specify the minor and major radii\nof an ellipse, in meters. A \u003Cstrong>tilt\u003C\u002Fstrong> property can also be applied to rotate the ellipse by\na number of degrees.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = { \"name\":\"Bristol Channel\", \"lat\":51.5, \"lon\":-2.9, \"radius\":[30000,70000], \"tilt\":45 };\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"arcs-range-rings\">\u003Ca class=\"header-anchor\" href=\"#arcs-range-rings\">Arcs, Range Rings\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>You can add supplemental arc(s) to a marker by adding an \u003Cstrong>arc\u003C\u002Fstrong> property as below.\nSupplemental means that you can also specify a line using a \u003Cstrong>bearing\u003C\u002Fstrong> and \u003Cstrong>length\u003C\u002Fstrong> property.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = { name:\"Camera01\", icon:\"sensor\", lat:51.05, lon:-1.35,\n    bearing: 235,\n    length: 2200,\n    arc: {\n        ranges: [500,1000,2000],\n        pan: 228,\n        fov: 40,\n        color: '#aaaa00',\n        weight: 1\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>ranges\u003C\u002Fstrong> can be a single number or an array of arc distances from the marker.\nThe \u003Cstrong>pan\u003C\u002Fstrong> is the bearing of the centre of the arc, and the \u003Cstrong>fov\u003C\u002Fstrong> (Field of view)\nspecifies the angle of the arc.\nDefaults are shown above.\u003C\u002Fp>\n\u003Ch3 id=\"geojson\">\u003Ca class=\"header-anchor\" href=\"#geojson\">GeoJSON\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>There are several ways to send GeoJSON to the map.\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>If the msg.payload contains a \u003Cstrong>geojson\u003C\u002Fstrong> property, and no \u003Cstrong>lat\u003C\u002Fstrong> and \u003Cstrong>lon\u003C\u002Fstrong>, then\nrather than draw a point it will render the geojson.\u003C\u002Fp>\n\u003Cp>msg.payload = {\n\"name\": \"MyPolygon\",\n\"geojson\": {\n\"type\": \"Feature\",\n\"geometry\": {\n\"type\": \"Polygon\",\n\"coordinates\": [[[-180,10],[20,90],[180,-5],[-30,-90]]]\n},\n\"style\": {\n\"stroke-width\": \"8\",\n\"stroke\": \"#ff00ff\",\n\"fill-color\": \"#808000\",\n\"fill-opacity\": 0.2\n}\n}\n}\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Often geojson may not have a \u003Ccode>properties\u003C\u002Fcode> or \u003Ccode>style\u003C\u002Fcode> property in which case you can specify some global optional properties (see below) in order to set some defaults for the geojson object.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = {\n    \"name\": \"Myline\",\n    \"layer\": \"Lines\",\n    \"color\": \"#0000ff\",\n    \"weight\": \"6\",\n    \"dashArray\": \"30 20\",\n    \"geojson\": {\n        \"type\": \"LineString\",\n        \"coordinates\": [[0,0],[0,90]]\n    },\n    clickable: true\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Col>\n\u003Cli>\n\u003Cp>You can just send a msg.payload containing the geojson itself - but obviously you then can't style it, set the name, layer, etc.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>You can also add the geojson as a specific overlay, in which case you can also have more control of styles, and per feature customisations. See the section on overlays \u003Ca href=\"#to-add-a-new-geojson-overlay\">below\u003C\u002Fa>. This is the most complex but also the most customisable.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"options\">\u003Ca class=\"header-anchor\" href=\"#options\">Options\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Areas, Rectangles, Lines, Circles and Ellipses can also specify more optional properties:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>layer\u003C\u002Fstrong> : declares which layer you put it on.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>color\u003C\u002Fstrong> : can set the colour of the polygon or line.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>opacity\u003C\u002Fstrong> : the opacity of the line or outline.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>fillColor\u003C\u002Fstrong> : can set the fill colour of the polygon.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>fillOpacity\u003C\u002Fstrong> : can set the opacity of the polygon fill colour.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>dashArray\u003C\u002Fstrong> : optional dash array for polyline.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>clickable\u003C\u002Fstrong> : boolean - set to true to allow click to show popup.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>popup\u003C\u002Fstrong> : html string to display in popup (as well as name).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>editable\u003C\u002Fstrong> : boolean - set to true to allow simple edit\u002Fdelete right click contextmenu.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>tooltip\u003C\u002Fstrong> : Text string to display on mouse hover over the shape.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>contextmenu\u003C\u002Fstrong> : html string to display a more complex right click contextmenu.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>weight\u003C\u002Fstrong> : the width of the line or outline.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Other properties can be found in the leaflet documentation.\u003C\u002Fp>\n\u003Cp>Shapes can also have a \u003Cstrong>popup\u003C\u002Fstrong> property containing html, but you MUST also set a property \u003Ccode>clickable:true\u003C\u002Fcode> in order to allow it to be seen.\u003C\u002Fp>\n\u003Ch3 id=\"drawing\">\u003Ca class=\"header-anchor\" href=\"#drawing\">Drawing\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A single \u003Cem>right click\u003C\u002Fem> will allow you to add a point to the map - you must specify the \u003Ccode>name\u003C\u002Fcode> and optionally the \u003Ccode>icon\u003C\u002Fcode> and \u003Ccode>layer\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Right-clicking on an icon will allow you to delete it.\u003C\u002Fp>\n\u003Cp>If you select the \u003Cstrong>drawing\u003C\u002Fstrong> layer you can also add and edit polylines, polygons, rectangles and circles.\nOnce an item is drawn you can right click to edit or delete it.\u003C\u002Fp>\n\u003Cp>Double click the object to exit edit mode.\u003C\u002Fp>\n\u003Ch3 id=\"buildings\">\u003Ca class=\"header-anchor\" href=\"#buildings\">Buildings\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The OSM Buildings layer is available in the layers menu. You can replace this with\nbuildings of your own by sending a \u003Ccode>msg.payload.command.map\u003C\u002Fcode> containing an \u003Ccode>overlay\u003C\u002Fcode>\nand a \u003Ccode>geojson\u003C\u002Fcode> property. The geojson property should be a GeoJSON Feature Collection\nas per the OSMBuildings spec. For example in a function node:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>var geo = { \"type\": \"FeatureCollection\",\n\"features\": [\n  {\n    \"type\": \"Feature\",\n    \"properties\": {\n      \"color\": \"rgb(0,0,255)\",\n      \"roofColor\": \"rgb(128,128,255)\",\n      \"height\": 20,\n      \"minHeight\": 0\n    },\n    \"geometry\": {\n      \"type\": \"Polygon\",\n      \"coordinates\": [\n        [\n        [-1.356221,51.048611],\n        [-1.356039,51.048672],\n        [-1.355765,51.048311],\n        [-1.355937,51.048237],\n        [-1.356221,51.048611]\n        ]\n      ]\n    }\n  }\n]\n}\nvar m = {overlay:\"Golf Clubhouse\", geojson:geo, fit:true};\nmsg.payload = {command:{map:m, lat:51.0484, lon:-1.3558}};\nreturn msg;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Note\u003C\u002Fstrong>: the object you supply will replace the whole buildings layer. To delete the building send a msg with a name and the building property set to \"\"  (blank string).\u003C\u002Fp>\n\u003Ch4 id=\"buildings-3d-view\">\u003Ca class=\"header-anchor\" href=\"#buildings-3d-view\">Buildings 3D view\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>A 3D map view has now been added as \u003Cstrong>worldmap\u002Findex3d.html\u003C\u002Fstrong> using the mapbox api - the msg can support \u003Ccode>msg.command.pitch\u003C\u002Fcode> and \u003Ccode>msg.command.bearing\u003C\u002Fcode> to angle the view, for example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = { \"command\": { \"zoom\":18, \"pitch\":60, \"bearing\":80 } }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The \u003Ccode>icon\u003C\u002Fcode> can be specified as a person, block, bar, or \"anything else\" - they will render slightly differently - all units are approximate. They will be positioned at the \u003Ccode>lat\u003C\u002Fcode>, \u003Ccode>lon\u003C\u002Fcode> as normal but also at the \u003Ccode>msg.payload.height\u003C\u002Fcode> - where height is in meters above the surface of the map (which may or may not relate to altitude...)\u003C\u002Fp>\n\u003Cp>\u003Ccode>msg.payload.icon\u003C\u002Fcode> can be\u003C\u002Fp>\n\u003Cul>\n\u003Cli>person : 1m x 1m x 2m tall\u003C\u002Fli>\n\u003Cli>block : 5m x 5m x 5m cube\u003C\u002Fli>\n\u003Cli>bar : a bar from the surface up to the specified minHeight\u003C\u002Fli>\n\u003Cli>(else) : 1.5m x 1.5m x 1.5m cube\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>in addition existing male, female, fa-male and fa-female icons are all represented as the person shape.\n\u003Ccode>msg.iconColor\u003C\u002Fcode> can be used to colour the icons.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>NOTES\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>There is currently no way to add labels, popups, or to make the icons clickable.\u003C\u002Fli>\n\u003Cli>The 3D only really works at zoomed in scales 16+ due to the small size of the icons. They are not scale independent like icons on the normal map.\u003C\u002Fli>\n\u003Cli>As this uses the mapbox api you may wish to edit the index3d.html code to include your api key to remove any usage restrictions.\u003C\u002Fli>\n\u003Cli>This view is a side project to the Node-RED Worldmap project so I'm happy to take PRs but it probably won't be actively developed.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"controlling-the-map\">\u003Ca class=\"header-anchor\" href=\"#controlling-the-map\">Controlling the map\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>You can also control the map via the node, by sending in a msg.payload containing a \u003Cstrong>command\u003C\u002Fstrong> object. Multiple parameters can be specified in one command.\u003C\u002Fp>\n\u003Cp>Optional properties for \u003Cstrong>msg.payload.command\u003C\u002Fstrong> include\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>lat\u003C\u002Fstrong> - move map to specified latitude.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>lon\u003C\u002Fstrong> - move map to specified longitude.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>zoom\u003C\u002Fstrong> - move map to specified zoom level (1 - world, 13 to 20 max zoom depending on map).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>zoomLevels\u003C\u002Fstrong> - an array of accepted zoom levels to switch between if you map only supports certain scalings - set to null to clear.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>bounds\u003C\u002Fstrong> - if set to an array \u003Ccode>[ [ lat(S), lon(W) ], [lat(N), lon(E)] ]\u003C\u002Fcode> - sets the overall map bounds.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>rotation\u003C\u002Fstrong> - rotate the base map to the specified compass angle.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>layer\u003C\u002Fstrong> - set map to specified base layer name - \u003Ccode>{\"command\":{\"layer\":\"Esri\"}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>search\u003C\u002Fstrong> - search markers on map for name containing \u003Ccode>string\u003C\u002Fcode>. If not found in existing markers, will then try geocoding looking using Nominatim. An empty string \u003Ccode>\"\"\u003C\u002Fcode> clears the search results. - \u003Ccode>{\"command\":{\"search\":\"Winchester\"}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>showlayer\u003C\u002Fstrong> - show the named overlay(s) - \u003Ccode>{\"command\":{\"showlayer\":\"foo\"}}\u003C\u002Fcode> or \u003Ccode>{\"command\":{\"showlayer\":[\"foo\",\"bar\"]}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>hidelayer\u003C\u002Fstrong> - hide the named overlay(s) - \u003Ccode>{\"command\":{\"hidelayer\":\"bar\"}}\u003C\u002Fcode> or \u003Ccode>{\"command\":{\"hidelayer\":[\"bar\",\"another\"]}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>clearlayer\u003C\u002Fstrong> - layer name - to clear a complete layer and remove from layer menu - \u003Ccode>{\"command\":{\"clearlayer\":\"myOldLayer\"}}\u003C\u002Fcode> or \u003Ccode>{\"command\":{\"clearlayer\":[\"oldLayer1\",\"oldLayer2\",\"etc,etc\"]}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>side\u003C\u002Fstrong> - add a second map alongside with slide between them. Use the name of a \u003Cem>baselayer\u003C\u002Fem> to add - or \"none\" to remove the control. - \u003Ccode>{\"command\":{\"side\":\"Esri Satellite\"}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>split\u003C\u002Fstrong> - once you have split the screen with the \u003Cem>side\u003C\u002Fem> command - the split value is then the % across the screen of the split line. - \u003Ccode>{\"command\":{\"split\":50}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>map\u003C\u002Fstrong> - Object containing details of a new map layer:\n\u003Cul>\n\u003Cli>\u003Cstrong>name\u003C\u002Fstrong> - name of the map base layer OR \u003Cstrong>overlay\u003C\u002Fstrong> - name of overlay layer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>url\u003C\u002Fstrong> - url of the map layer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>opt\u003C\u002Fstrong> - options object for the new layer\u003C\u002Fli>\n\u003Cli>\u003Cstrong>wms\u003C\u002Fstrong> - true\u002Ffalse\u002Fgrey, specifies if the data is provided by a Web Map Service (if grey sets layer to greyscale)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>bounds\u003C\u002Fstrong> - sets the bounds of an Overlay-Image. 2 Dimensional Array that defines the top-left and bottom-right Corners (lat\u002Flon Points)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>delete\u003C\u002Fstrong> - name or array of names of base layers and\u002For overlays to delete and remove from layer menu.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>heatmap\u003C\u002Fstrong> - set heatmap latlngs array object see https:\u002F\u002Fgithub.com\u002FLeaflet\u002FLeaflet.heat#reference\u003C\u002Fli>\n\u003Cli>\u003Cstrong>options\u003C\u002Fstrong> - if heatmap set, then use this to set heatmap options object see https:\u002F\u002Fgithub.com\u002FLeaflet\u002FLeaflet.heat#reference\u003C\u002Fli>\n\u003Cli>\u003Cstrong>panlock\u003C\u002Fstrong> - lock the map area to the current visible area. - \u003Ccode>{\"command\":{\"panlock\":true}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>panit\u003C\u002Fstrong> - auto pan to the latest marker updated.  - \u003Ccode>{\"command\":{\"panit\":true}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>zoomlock\u003C\u002Fstrong> - locks the zoom control to the current value and removes zoom control - \u003Ccode>{\"command\":{\"zoomlock\":true}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>hiderightclick\u003C\u002Fstrong> - disables the right click that allows adding or deleting points on the map - \u003Ccode>{\"command\":{\"hiderightclick\":true}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>coords\u003C\u002Fstrong> - turns on and off a display of the current mouse co-ordinates. Values can be \"deg\", \"dms\", \"utm\", \"mgrs\", \"qth\" or \"none\" (default). - \u003Ccode>{\"command\":{\"coords\":\"deg\"}}\u003C\u002Fcode> , \u003Ccode>{\"command\":{\"coords\":\"deg,dms,utm\"}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>showruler\u003C\u002Fstrong> - turns on and off a display of the ruler control. Values can be \"true\" or \"false\". - \u003Ccode>{\"command\": {\"ruler\": {\"showruler\": true}}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>button\u003C\u002Fstrong> - if supplied with a \u003Ccode>name\u003C\u002Fcode> and \u003Ccode>icon\u003C\u002Fcode> property - adds a button to provide user input - sends\na msg \u003Ccode>{\"action\":\"button\", \"name\":\"the_button_name\"}\u003C\u002Fcode> to the worldmap in node. If supplied with a \u003Ccode>name\u003C\u002Fcode> property only, it will remove the button. Optional \u003Ccode>position\u003C\u002Fcode> property can be 'bottomright', 'bottomleft', 'topleft' or 'topright' (default). button can also be an array of button objects.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>contextmenu\u003C\u002Fstrong> - html string to define the right click menu when not on a marker. Defaults to the simple add marker input. Empty string \u003Ccode>\"\"\u003C\u002Fcode> disables this right click.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>drawcontextmenu\u003C\u002Fstrong> : an html fragment to display on right click or when creating new shapes (enable Drawing overlay in the worldmap node Overlays selection dropdown) - defaults to \"Name\" Input \"Edit Points|Drag|Rotate|Delete|Ok\" buttons.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>toptitle\u003C\u002Fstrong> - Words to replace title in title bar (if not in iframe)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>toplogo\u003C\u002Fstrong> - URL to logo image for top title bar (if not in iframe) - ideally 60px by 24px.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>trackme\u003C\u002Fstrong> - Turns on\u002Foff the browser self locating. Boolean false = off, true = cyan circle showing accuracy error, or an object like \u003Ccode>{\"command\":{\"trackme\":{\"name\":\"Dave\",\"icon\":\"car\",\"iconColor\":\"blue\",\"layer\":\"mytrack\",\"accuracy\":false}}}\u003C\u002Fcode>. Usual marker options can be applied.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>showmenu\u003C\u002Fstrong> - Show or hide the display of the hamberger menu control in the top right . Values can be \"show\" or \"hide\". - \u003Ccode>{\"command\":{\"showmenu\": \"hide\"}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>showlayers\u003C\u002Fstrong> - Show or hide the display of selectable layers. Does not control the display of an individual layer, rather a users ability to interact with them. Values can be \"show\" or \"hide\". - \u003Ccode>{\"command\":{\"showlayers\": \"hide\"}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>sidcEdgeIcon\u003C\u002Fstrong> - Show or hide small sidc icons around edge of map for things just outside of view. Values can be true or false (default is true). - \u003Ccode>{\"command\":{\"sidcEdgeIcon\": false}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>showdialog\u003C\u002Fstrong> - Show a dialog style overlay of html to provide information to the user. Send an empty string to close automatically. - \u003Ccode>{\"command\":{\"showdialog\": \"&lt;h1&gt;Title&lt;\u002Fh1&gt;Hello World\"}}\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4 id=\"to-switch-layer-move-map-and-zoom\">\u003Ca class=\"header-anchor\" href=\"#to-switch-layer-move-map-and-zoom\">To switch layer, move map and zoom\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>msg.payload = { \"command\": { \"layer\":\"Esri Satellite\", \"lat\":51, \"lon\":3, \"zoom\":10 }};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>You can also use the name \"none\" to completely remove the base layer,\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = { \"command\": { \"layer\":\"none\" }};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4 id=\"to-clear-all-markers-from-a-layer-or-an-overlay-from-the-map\">\u003Ca class=\"header-anchor\" href=\"#to-clear-all-markers-from-a-layer-or-an-overlay-from-the-map\">To clear all markers from a layer, or an overlay from the map\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>msg.payload = { \"command\": { \"clearlayer\": \"name of the layer\u002Foverlay you wish to clear\" }};\nmsg.payload = { \"command\": { \"clearlayer\": [\"array\",\"ofLayer\",\"names\",\"toClear\"] }};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Feeding this into the tracks node will also remove the tracks stored for that layer.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-a-new-base-layer\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-new-base-layer\">To add a new base layer\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>The layer will be called \u003Ccode>name\u003C\u002Fcode>. By default it expects a leaflet Tilelayer style url. You can also use a WMS\nstyle server by adding a property \u003Ccode>wms: true\u003C\u002Fcode>. You can also set \u003Ccode>wms: \"grey\"\u003C\u002Fcode> to set the layer to greyscale which\nmay let your markers be more visible. (see overlay example below).\nAlso useful is the Leaflet option \u003Ccode>maxNativeZoom\u003C\u002Fcode> which can allow scaling of maps beyond their natural maximum zoom level.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n    \"name\":\"OSMhot\",  \u002F\u002F use \"overlay\":\"MyOverlayName\" for an overlay rather than a base layer.\n    \"url\":\"https:\u002F\u002F{s}.tile.openstreetmap.fr\u002Fhot\u002F{z}\u002F{x}\u002F{y}.png\",\n    \"opt\":{ \"maxZoom\":19, \"attribution\":\"&amp;copy; OpenStreetMap\" }\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4 id=\"to-remove-base-or-overlay-layers\">\u003Ca class=\"header-anchor\" href=\"#to-remove-base-or-overlay-layers\">To remove base or overlay layers\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>To remove several layers, either base layers or overlays, you can pass an array of names as follows.\nThis can be used to tidy up the initial selections available to the user layer menu.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n    \"delete\":[\"Watercolor\",\"ship nav\",\"heatmap\",\"Terrain\",\"UK OS 1900\",\"UK OS 1919-47\"]\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Note: layer names are case sensitive.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-a-wms-overlay-layer---eg-us-weather-radar\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-wms-overlay-layer---eg-us-weather-radar\">To add a WMS overlay layer - eg US weather radar\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>To add an overlay instead of a base layer - specify the \u003Ccode>overlay\u003C\u002Fcode> property instead of the \u003Ccode>name\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n    \"overlay\": \"NowCoast\",\n    \"url\": \"https:\u002F\u002Fnowcoast.noaa.gov\u002Farcgis\u002Fservices\u002Fnowcoast\u002Fradar_meteo_imagery_nexrad_time\u002FMapServer\u002FWmsServer?\",\n    \"opt\":  {\n        \"layers\": \"1\",\n        \"format\": \"image\u002Fpng\",\n        \"transparent\": true,\n        \"attribution\": \"NOAA\u002FNWS\"\n    },\n    \"wms\": true\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>By default the overlay will be instantly visible. To load it hidden add a property to the command.map - \u003Ccode>visible:false\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ch4 id=\"to-add-a-new-geojson-overlay\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-new-geojson-overlay\">To add a new geoJSON overlay\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n    \"overlay\": \"myGeoJSON\",\n    \"geojson\": { your geojson feature as an object },\n    \"opt\": { optional geojson options, style, etc },\n    \"fit\": true,\n    \"clickable\": false\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The geojson features may contain a \u003Ccode>properties\u003C\u002Fcode> property. That may also include a \u003Ccode>style\u003C\u002Fcode> with properties - stroke, stroke-width, stroke-opacity, fill, fill-opacity. Any other properties will be listed in the popup.\u003C\u002Fp>\n\u003Cp>The \u003Ccode>opt\u003C\u002Fcode> property is optional. See the \u003Ca href=\"https:\u002F\u002Fleafletjs.com\u002Fexamples\u002Fgeojson\u002F\">Leaflet geojson docs\u003C\u002Fa> for more info on possible options.\u003C\u002Fp>\n\u003Cp>NOTE: In order to pass over \u003Cstrong>style\u003C\u002Fstrong>, \u003Cstrong>pointToLayer\u003C\u002Fstrong>, \u003Cstrong>onEachFeature\u003C\u002Fstrong>, or \u003Cstrong>filter\u003C\u002Fstrong> functions they need to be serialised as follows... for example\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const style = function () {\n    return { color: \"#910000\", weight: 2 };\n};\nmsg.payload.command.map.opt.style = style.toString();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>This may cause the function node setting them to be in error, for example if it references L (the leaflet map), which is unknown on the server side. The flow should still deploy and run ok.\u003C\u002Fp>\n\u003Cp>The \u003Ccode>fit\u003C\u002Fcode> property is optional, and you can also use \u003Ccode>fly\u003C\u002Fcode> if you wish. If boolean true the map will automatically zoom to fit the area relevant to the geojson, or use 'fly' to set the animated style. You can also set \u003Ccode>clickable\u003C\u002Fcode> true to return the properties of the clicked feature to the worldmap-in node.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-a-new-kml-gpx-or-topojson-overlay\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-new-kml-gpx-or-topojson-overlay\">To add a new KML, GPX, or TOPOJSON overlay\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>As with the geojson overlay, you can also inject a KML layer, GPX layer or TOPOJSON layer. The syntax is the same but with either a \u003Ccode>kml\u003C\u002Fcode> property containing the KML string - a \u003Ccode>gpx\u003C\u002Fcode> property containing a GPX string - or a \u003Ccode>topojson\u003C\u002Fcode> property containing the topojson.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n    \"overlay\": \"myKML\",\n    \"kml\": \"&lt;kml&gt;...your kml placemarks...&lt;\u002Fkml&gt;\"\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>For GPX and KML layers, it is possible to define which icon to use for point markers by adding the\nfollowing properties to \u003Ccode>msg.payload.command.map\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>icon\u003C\u002Fstrong> : \u003Ca href=\"https:\u002F\u002Ffontawesome.com\u002Fv4.7.0\u002Ficons\u002F\" target=\"mapinfo\">font awesome\u003C\u002Fa> icon name.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>iconColor\u003C\u002Fstrong> : Standard CSS colour name or #rrggbb hex value.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Again the boolean \u003Ccode>fit\u003C\u002Fcode> or \u003Ccode>fly\u003C\u002Fcode> properties can be added to make the map zoom to the relevant area, and the \u003Ccode>visible\u003C\u002Fcode> property can be set false to not immediately show the layer.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-an-esri-featurelayer-overlay\">\u003Ca class=\"header-anchor\" href=\"#to-add-an-esri-featurelayer-overlay\">To add an ESRI FeatureLayer overlay\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>As per the geojson overlay you can also inject an ESRI ArcGIS FeatureLayer layer. The syntax is the same but with an \u003Ccode>esri\u003C\u002Fcode> property containing the url of the desired feature layer.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n    \"overlay\": \"myFeatureLayer\",\n    \"esri\": \"https:\u002F\u002Fservices3.arcgis.com\u002F.....\u002F0\",\n    \"opt\": { object of options }\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>NOTE: you can set various options as \u003Ca href=\"https:\u002F\u002Fdevelopers.arcgis.com\u002Fesri-leaflet\u002Fapi-reference\u002Flayers\u002Ffeature-layer\u002F#options\">specified here\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>In order to pass over \u003Cstrong>style\u003C\u002Fstrong>, \u003Cstrong>pointToLayer\u003C\u002Fstrong>, or \u003Cstrong>onEachFeature\u003C\u002Fstrong> functions they need to be serialised as follows. For example\u003C\u002Fp>\n\u003Cpre>\u003Ccode>const style = function () {\n    return { color: \"#910000\", weight: 2 };\n};\nmsg.payload.command.map.opt.style = style.toString();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>This may cause the function node setting them to be in error, for example if it references L.marker, which is unknown on the server side. The flow should still deploy and run ok.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-an-image-overlay\">\u003Ca class=\"header-anchor\" href=\"#to-add-an-image-overlay\">To add an Image Overlay\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>You can overlay an image as long as you can specify the lower-left and upper-right corners. For example in a function node:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>var imageBounds = [[40.712216, -74.22655], [40.773941, -74.12544]];\nmsg.payload = { command : { lat:40.74, lon:-74.175, zoom:13 } };\nmsg.payload.command.map = {\n    overlay: \"New York Historical\",\n    url: 'https:\u002F\u002Fwww.lib.utexas.edu\u002Fmaps\u002Fhistorical\u002Fnewark_nj_1922.jpg',\n    bounds: imageBounds,\n    opt: { opacity:0.8, attribution:\"&amp;copy; University of Texas\" }\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4 id=\"to-add-a-velocity-grid-overlay\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-velocity-grid-overlay\">To add a Velocity Grid Overlay\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n    \"overlay\": \"myWind\",\n    \"velocity\": {\n        \"displayValues\": true,\n        \"displayOptions\": {\n            \"velocityType\": \"Global Wind\",\n            \"displayPosition\": \"bottomleft\",\n            \"emptyString\": \"No wind data\",\n            \"showCardinal\": true,\n            \"speedUnit\": \"k\u002Fh\",\n            \"angleConvention\": \"meteoCCW\"\n        },\n        \"maxVelocity\": 15,\n        \"data\": [Array of data as per format referenced below]\n    }\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>see https:\u002F\u002Fgithub.com\u002Fdanwild\u002Fleaflet-velocity for more details about options and data examples.\u003C\u002Fp>\n\u003Cp>Note: If you use his wind-js-server you need to patch it as per \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdanwild\u002Fwind-js-server\u002Fissues\u002F9\">issue 9\u003C\u002Fa>.\nOr you can use try this docker image which uses the Canadian Meterological Service model instead.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>docker run -d -p 7000:7000 --name windserver theceejay\u002Fwindserver:latest\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4 id=\"to-add-a-latlon-graticule-overlay\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-latlon-graticule-overlay\">To add a Lat\u002FLon Graticule overlay\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>A graticule can be enabled via the node configuration, and can also be set dynamically,\nfor example in a function node:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = { command : { grid : {\n    showgrid: true,\n    opt: { showLabel:true, dashArray:[5, 5], fontColor:\"#900\" }\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>see https:\u002F\u002Fgithub.com\u002Fcloudybay\u002Fleaflet.latlng-graticule for more details about options and demo.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-and-remove-a-user-defined-button\">\u003Ca class=\"header-anchor\" href=\"#to-add-and-remove-a-user-defined-button\">To add and remove a user defined button\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>to add a button bottom right\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command = { \"button\": { \"name\":\"My Fancy Button\", \"icon\": \"fa-star\", \"position\":\"bottomright\" } };\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>When clicked the button will send an event to the \u003Ccode>worldmap in\u003C\u002Fcode> node containing \u003Ccode>{\"action\":\"button\", \"name\",\"My Fancy Button\"}\u003C\u002Fcode> - this can then be used to trigger other map commands or flows.\u003C\u002Fp>\n\u003Cp>to remove\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command = { \"button\": { \"name\":\"My Fancy Button\" } };\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Multiple buttons can declared by using an array of button objects.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-a-custom-popup-or-contextmenu\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-custom-popup-or-contextmenu\">To add a custom popup or contextmenu\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>You can customise a marker's popup, or context menu (right click), by setting the\nappropriate property to an html string. Often you will need some embedded javascript\nin order to make it do something when you click a button for example. You need to be\ncareful escaping quotes, and that they remain matched.\u003C\u002Fp>\n\u003Cp>For example a marker popup with a slider (note the \\ escaping the internal ' )\u003C\u002Fp>\n\u003Cpre>\u003Ccode>popup: '&lt;input name=\"slide1\" type=\"range\" min=\"1\" max=\"100\" value=\"50\" onchange=\\'feedback(${name},this.value,this.name)\\' style=\"width:250px;\"&gt;'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Or a marker contextmenu with an input box\u003C\u002Fp>\n\u003Cpre>\u003Ccode>contextmenu: '&lt;input name=\"channel\" type=\"text\" value=\"5\" onchange=\\'feedback(${name},{\"name\":this.name,\"value\":this.value},\"myFeedback\")\\' \u002F&gt;'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Or you can add a contextmenu to the map. Simple contextmenu with a button\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command = {\n    contextmenu: '&lt;button name=\"Clicker\" onclick=\\'feedback(this.name,\"ping!\",null,true)\\'&gt;Click me&lt;\u002Fbutton&gt;'\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Or with an input box\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command : {\n    contextmenu: '&lt;input name=\"slide1\" type=\"range\" min=\"1\" max=\"100\" value=\"50\" onchange=\\'feedback(this.name,this.value,\"myEventName\")\\' &gt;'\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Example simple form\u003C\u002Fp>\n\u003Cpre>\u003Ccode>[{\"id\":\"7351100bacb1f5fe\",\"type\":\"function\",\"z\":\"4aa2ed2fd1b11362\",\"name\":\"\",\"func\":\"msg.payload = { command: {\\ncontextmenu: String.raw`\\nText &lt;input type=\\\"text\\\" id=\\\"sometext\\\" value=\\\"hello\\\"&gt;&lt;br\u002F&gt;\\nNumber &lt;input type=\\\"number\\\" id=\\\"somenum\\\" value=\\\"5\\\"&gt;&lt;br\u002F&gt;\\n&lt;input type=\\\"button\\\" value=\\\"Send\\\" onclick=\\n'feedback(\\\"myform\\\",{\\n    \\\"st\\\":document.getElementById(\\\"sometext\\\").value,\\n    \\\"sn\\\":document.getElementById(\\\"somenum\\\").value,\\n})'\\n&gt;\\n`\\n}}\\nreturn msg;\",\"outputs\":1,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":350,\"y\":360,\"wires\":[[\"a6a82f2e8efc44fc\"]]},{\"id\":\"7b595f0c8f6ac710\",\"type\":\"worldmap in\",\"z\":\"4aa2ed2fd1b11362\",\"name\":\"\",\"path\":\"\u002Fworldmap\",\"events\":\"connect\",\"x\":195,\"y\":360,\"wires\":[[\"7351100bacb1f5fe\"]]}]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>See the section on \u003Cstrong>Utility Functions\u003C\u002Fstrong> for details of the feedback function.\u003C\u002Fp>\n\u003Cp>For the drawcontextmenu you can use the following snippet as a template:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload  = {\"command\" :{\"drawcontextmenu\" :\"&lt;input type='text' value='${name}' id='dinput' placeholder='name (,icon, layer)'\u002F&gt;&lt;br\u002F&gt;&lt;button onclick='editPoly(\\\"${name}\\\");'&gt;My Edit points&lt;\u002Fbutton&gt;&lt;button onclick='editPoly(\\\"${name}\\\",\\\"drag\\\");'&gt;My Drag&lt;\u002Fbutton&gt;&lt;button onclick='editPoly(\\\"${name}\\\",\\\"rot\\\");'&gt;My Rotate&lt;\u002Fbutton&gt;&lt;button onclick='delMarker(\\\"${name}\\\",true);'&gt;My Delete&lt;\u002Fbutton&gt;&lt;button onclick='sendDrawing();'&gt;My OK&lt;\u002Fbutton&gt;\"}};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4 id=\"to-add-and-remove-a-legend\">\u003Ca class=\"header-anchor\" href=\"#to-add-and-remove-a-legend\">To add and remove a legend\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>If you want to add a small legend overlay\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command = { \"legend\": \"&lt;b&gt;Title&lt;\u002Fb&gt;&lt;\u002Fbr&gt;&lt;i style=\\\"background: #477AC2\\\"&gt;&lt;\u002Fi&gt; Water&lt;br&gt;&lt;i style=\\\"background: #448D40\\\"&gt;&lt;\u002Fi&gt; Forest&lt;br&gt;\" };\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>To remove set the legend to an empty string \u003Ccode>\"\"\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch4 id=\"to-add-a-minimap\">\u003Ca class=\"header-anchor\" href=\"#to-add-a-minimap\">To add a minimap\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>A minimap overview can be added by sending a suitable command. The \"minimap\" property\nmust specify the name of an existing base layer to use. The \"opt\" property can contain\nvalid options from the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FNorkart\u002FLeaflet-MiniMap#available-options\">minimap library options\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload.command.map = {\n        minimap: \"OSM\",\n        opt: {\n            centerFixed: [51.05, -1.35],\n            toggleDisplay: true\n        }\n    }\n};\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Set \u003Ccode>msg.payload.command.map.minimap = false;\u003C\u002Fcode> to remove the minimap.\u003C\u002Fp>\n\u003Ch2 id=\"events-from-the-map\">\u003Ca class=\"header-anchor\" href=\"#events-from-the-map\">Events from the map\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The \u003Cstrong>worldmap in\u003C\u002Fstrong> node can be used to receive various events from the map. Examples of messages coming FROM the map include:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>{ \"action\": \"connected\" }  \u002F\u002F useful to trigger delivery or redraw of points\n{ \"action\": \"disconnect\", \"clients\": 1 }  \u002F\u002F when a client disconnects - reports number remaining\n{\"action\":\"bounds\", \"south\":50.55, \"west\":-1.48, \"north\":50.72, \"east\":-0.98}  \u002F\u002F reports the outer bounds of the hmap area when zoomed or moved\n\n{ \"action\": \"click\", \"name\":\"Jason\", \"layer\":\"gps\", \"icon\":\"male\", \"iconColor\":\"blue\", \"lat\":51.024985, \"lon\":-1.39698 }   \u002F\u002F when a marker is clicked\n{ \"action\": \"move\", \"name\":\"Jason\", \"layer\":\"gps\", \"icon\":\"male\", \"iconColor\":\"blue\", \"lat\":51.044632, \"lon\":-1.359901 }    \u002F\u002F when a marker is moved\n{ \"action\": \"delete\", \"name\": \"Jason\" }  \u002F\u002F when a point or shape is deleted\n\n{ \"action\": \"point\", \"lat\": \"50.60634\", \"lon\": \"-1.66580\", \"point\": \"Jason,male,gps\" }\n{ \"action\": \"draw\", \"type\": \"rectangle\", \"points\": [ { \"lat\": 50.61243889044519, \"lng\": -1.5913009643554688 }, { \"lat\": 50.66665471366635, \"lng\": -1.5913009643554688 }, { \"lat\": 50.66665471366635, \"lng\": -1.4742279052734375 }, { \"lat\": 50.61243889044519, \"lng\": -1.4742279052734375 } ] }\n\n{ \"action\": \"layer\", \"name\": \"myLayer\" }      \u002F\u002F when a map layer is changed\n{ \"action\": \"addlayer\", \"name\": \"myLayer\" }   \u002F\u002F when a new map layer is added\n{ \"action\": \"dellayer\", \"name\": \"myLayer\" }   \u002F\u002F when a new map layer is deleted\n\n{ \"action\": \"file\", \"name\": \"myfilename\", \"type\":\"image\u002Fjpeg\", \"lat\":51, \"lon\":-1, \"content\":\".....\"}   \u002F\u002F when a file is dropped on the map - see below.\n\n{ \"action\": \"openPopup\", \"name\":\"Poptest\", \"lat\":47.59, \"lon\":18.41, \"popped\":true } \u002F\u002F when a popup is opened\n{ \"action\":\"closePopup\", \"name\":\"Poptest\", \"lat\":47.59, \"lon\":18.41, \"popped\":false } \u002F\u002F when a popup is closed\n\n{ \"action\": \"button\", \"name\": \"My Fancy Button\" } \u002F\u002F when a user defined button is clicked\n\n{ \"action\": \"feedback\", \"name\": \"some name\", \"value\": \"some value\", \"lat\":51, \"lon\":0, \"layer\":\"unknown\" } \u002F\u002F when a user calls the feedback function - see below\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>If File Drop is enabled - then the map can accept files of type gpx, kml, nvg, jpeg, png and geojson. The file content property will always be a binary buffer. The lat, lon of the cursor drop point will be included. Tracks will be locally rendered on the map. The \u003Ccode>node-red-node-exif\u003C\u002Fcode> node can be used to extract location information from a jpeg image and then geolocate it back on the map. Png images will be located where they are dropped but can then be dragged if required.\u003C\u002Fp>\n\u003Cp>All actions also include a:\n\u003Ccode>msg._sessionid\u003C\u002Fcode> property that indicates which client session they came from. Any msg sent out that includes this property will ONLY be sent to that session - so you can target map updates to specific sessions if required.\n\u003Ccode>msg._sessionip\u003C\u002Fcode> property that shows the ip of the client that is connected to the session.\u003C\u002Fp>\n\u003Cp>The \"connected\" action additionally includes a:\n\u003Ccode>msg.payload.parameters\u003C\u002Fcode> property object that lists the parameters sent in the url.\n\u003Ccode>msg.payload.clientTimezone\u003C\u002Fcode> property string showing the clients local Timezone. Returns bool of \u003Ccode>false\u003C\u002Fcode> if unable to retrive clients local Timezone.\n\u003Ccode>msg._clientheaders\u003C\u002Fcode> property that shows the headers sent by the client to make a connection to the session.\u003C\u002Fp>\n\u003Ch3 id=\"utility-functions\">\u003Ca class=\"header-anchor\" href=\"#utility-functions\">Utility functions\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>There are some internal functions available to make interacting with Node-RED easier (e.g. from inside a user defined popup., these include:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>feedback()\u003C\u002Fstrong> : it takes 2, 3, or 4 parameters, name, value, and optionally an action name (defaults to \"feedback\"), and optional boolean to close the popup on calling this function, and can be used inside something like an input tag - \u003Ccode>onchange='feedback(this.name,this.value,null,true)'\u003C\u002Fcode>. Value can be a more complex object if required as long as it is serialisable. If used with a marker the name should be that of the marker - you can use \u003Ccode>${name}\u003C\u002Fcode> to let it be substituted automatically.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>addToForm()\u003C\u002Fstrong> : takes a property name value pair to add to a variable called \u003Ccode>form\u003C\u002Fcode>. When used with contextmenu feedback (above) you can set the feedback value to \u003Ccode>\"_form\"\u003C\u002Fcode> to substitute this accumulated value. This allows you to do things like \u003Ccode>onBlur='addToForm(this.name,this.value)'\u003C\u002Fcode> over several different fields in the menu and then use \u003Ccode>feedback(this.name,\"_form\")\u003C\u002Fcode> to submit them all at once. For example a simple multiple line form could be as per the example below:\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Retain Values - If you wish to retain the values between separate openings of this form you can assign property names to the value field in the form \u003Ccode>value=\"${foo}\u003C\u002Fcode>, etc. These will then appear as part of an \u003Cstrong>value\u003C\u002Fstrong> property on the worldmap-in node message.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>var menu = 'Add some data &lt;input name=\"foo\" value=\"${foo}\" onchange=\\'addToForm(this.name,this.value)\\'&gt;&lt;\u002Finput&gt;&lt;br\u002F&gt;'\nmenu += 'Add more data &lt;input name=\"bar\" value=\"${bar}\" onchange=\\'addToForm(this.name,this.value)\\'&gt;&lt;\u002Finput&gt;&lt;br\u002F&gt;'\nmenu += '&lt;button name=\"my_form\" onclick=\\'feedback(this.name,\"_form\",\"formAction\",true)\\'&gt;Submit&lt;\u002Fbutton&gt;'\nmsg.payload = { command: { \"contextmenu\":menu } }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Custom Feedback Content - The example below shows how you can pass the latitude and longitude location value from the contextmenu popup when right clicking the map. You can also use this method with other data you wish.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>var menu ='&lt;center&gt;&lt;br\u002F&gt;';\nmenu += 'Add some data &lt;input type=\"text\" id=\"foo\" placeholder=\"foo\"&gt;&lt;br\u002F&gt;';\nmenu += 'Add more data &lt;input type=\"text\" id=\"bar\" placeholder=\"bar\"&gt;&lt;br\u002F&gt;';\nmenu += '&lt;input type=\"button\" value=\"Submit\" onclick=';\nmenu += '\\'feedback(\"myform\",{';\nmenu += '\"foo\":document.getElementById(\"foo\").value,';\nmenu += '\"bar\":document.getElementById(\"bar\").value,';\nmenu += '\"lat\":rclk.lat.toFixed(12),';\nmenu += '\"lon\":rclk.lng.toFixed(12),';\nmenu += '},\"formAction\",true)\\' &gt; &lt;br\u002F&gt;&lt;br\u002F&gt; ';\nmsg.payload = { command: { \"contextmenu\":menu } }\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>For a more detailed example flow using this method see: \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdceejay\u002FRedMap\u002Fblob\u002Fmaster\u002Fexamples\u002FMoving%20Icons%20Demo%20%26%20Builder.json\">Moving Icons Demo &amp; Builder\u003C\u002Fa>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Cstrong>delMarker()\u003C\u002Fstrong> : takes the name of the marker as a parameter. In a popup this can be specified as \u003Ccode>${name}\u003C\u002Fcode> for dynamic substitution.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>editPoly()\u003C\u002Fstrong> : takes the name of the shape or line as a parameter. In a popup this can be specified as \u003Ccode>${name}\u003C\u002Fcode> for dynamic substitution.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"serving-maps\">\u003Ca class=\"header-anchor\" href=\"#serving-maps\">Serving maps\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>By default this node expects users to have access to the internet in order to access the map servers that provide all the built in mapping. As per above you are able to add your own sources of mapping and sometimes this includes the requirement for offline access, in which case maps must be served up locally. There are several ways to do this outlined below. My personal favourite is the Tileserver-gl docker option, but of course this does require Docker.\u003C\u002Fp>\n\u003Ch3 id=\"using-pmtiles-files\">\u003Ca class=\"header-anchor\" href=\"#using-pmtiles-files\">Using PMtiles files\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>You can use a PMtiles format map archive file from \u003Ca href=\"https:\u002F\u002Fdocs.protomaps.com\u002Fbasemaps\u002Fdownloads\">Protomaps\u003C\u002Fa> as a base layer map.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Note\u003C\u002Fstrong>: 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 \u003Cstrong>pmtiles\u003C\u002Fstrong> command line with the extract option. Use \u003Ccode>pmtiles extract --help\u003C\u002Fcode> to see the options.\u003C\u002Fp>\n\u003Cp>Copy your .pmtiles file(s) into your \u003Ccode>~\u002F.node-red\u003C\u002Fcode> 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.\u003C\u002Fp>\n\u003Cp>You can set some default options for the pmtiles by creating a file called \u003Cstrong>pmtiles.opts\u003C\u002Fstrong> in your user directory. For example to use a dark theme\u003C\u002Fp>\n\u003Cpre>\u003Ccode>{\n    \"attribution\": \"Protomaps and OSM\",\n    \"maxNativeZoom\": 15,\n    \"maxZoom\": 20,\n    \"theme\": \"dark\"\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>theme can be light, dark, white, black, or grayscale.\u003C\u002Fp>\n\u003Cp>The \u003Ccode>maxNativeZoom\u003C\u002Fcode> should match the maximum zoom level in you pmtiles file(s) - whereas the \u003Ccode>maxZoom\u003C\u002Fcode> is the leaflet maximum zoom level you want to support. \u003Ccode>theme\u003C\u002Fcode> can be 'light', 'dark', 'white', 'black', or 'grayscale'.\u003C\u002Fp>\n\u003Cp>You can also load them dynamically with a command like\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = {\"command\":{\"map\":{\"name\":\"MyMap\", \"pmtiles\":\"\u002Fpath\u002Fto\u002Fmymap.pmtiles\", \"opt\":myOptionsObject}}}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Where \u003Ccode>opt\u003C\u002Fcode> can be as per the options file mentioned above - or omitted completely.\u003C\u002Fp>\n\u003Cp>If you have multiple pmtiles loaded then the map will try to autoswitch if you move out of bounds of one and into another - or zoom in or out beyond the zoom limits and there is another suitable pmtiles file available.\u003C\u002Fp>\n\u003Cp>NOTE: for some reason many files converted to pmtiles format fail to load\u002Fdisplay. In this case you can easily use the tileserver-gl map server either natively or via docker (see below) to serve the pmtiles format file.\u003C\u002Fp>\n\u003Ch3 id=\"using-a-docker-map-server\">\u003Ca class=\"header-anchor\" href=\"#using-a-docker-map-server\">Using a Docker Map Server\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>I have found the easiest to use mapserver for a decent generic map to be Tileserver-gl. It uses mbtiles or pmtiles format maps - for example from \u003Ca href=\"https:\u002F\u002Fdata.maptiler.com\u002Fdownloads\u002Fplanet\u002F\">MapTiler Data\u003C\u002Fa>. You can download your mbtiles file into a directory and then from that directory run\u003C\u002Fp>\n\u003Cpre>\u003Ccode>docker run --name maptiler -d -v $(pwd):\u002Fdata -p 1884:8080 maptiler\u002Ftileserver-gl -p 8080 --mbtiles yourMapFile.mbtiles\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>and use a url like \u003Ccode>\"url\": \"http:\u002F\u002Flocalhost:1884\u002Fstyles\u002Fbasic-preview\u002F{z}\u002F{x}\u002F{y}.png\"\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>This also works for pmtiles format map files.\u003C\u002Fp>\n\u003Cp>Other more traditional map servers include containers like https:\u002F\u002Fhub.docker.com\u002Fr\u002Fcamptocamp\u002Fmapserver,  which then assuming you have the mapfile 'my-app.map' in the current working directory, you could mount it as:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>docker run -d --name camptocamp -v $(pwd):\u002Fetc\u002Fmapserver\u002F:ro -p 1881:80 camptocamp\u002Fmapserver\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>then the url should be of the form \u003Ccode>\"url\": \"http:\u002F\u002Flocalhost:1881\u002F?map=\u002Fetc\u002Fmapserver\u002Fmy-app.map\"\u003C\u002Fcode> where \u003Cem>my-app.map\u003C\u002Fem> is the name of your map file. A quick test of the server would be to browse to http:\u002F\u002Flocalhost:1881\u002F?map=\u002Fetc\u002Fmapserver\u002Fmy-app.map&amp;mode=map\u003C\u002Fp>\n\u003Cp>Or you can use a docker container like https:\u002F\u002Fhub.docker.com\u002Fr\u002Fgeodata\u002Fmapserver\u002F then assuming you have the mapfile 'my-app.map' in the current working directory, you could mount it as:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>docker run -d --name mapserver -v $(pwd):\u002Fmaps:ro -p 1882:80 geodata\u002Fmapserver\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>and use a url like \u003Ccode>\"url\": \"http:\u002F\u002Flocalhost:1882\u002F?map=\u002Fmaps\u002Fmy-app.map\",\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>Other useful map servers include Geoserver, a somewhat larger image but fully featured.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>docker run --name geoserver -d -v ${PWD}:\u002Fvar\u002Flocal\u002Fgeoserver -p 1885:8080 oscarfonts\u002Fgeoserver\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"using-a-local-map-server-wms-server\">\u003Ca class=\"header-anchor\" href=\"#using-a-local-map-server-wms-server\">Using a local Map Server (WMS server)\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>IMHO the easiest WMS map server to make work is the \u003Ca href=\"http:\u002F\u002Fwww.mapserver.org\u002F\" target=\"mapinfo\">mapserver\u003C\u002Fa> package in Ubuntu \u002F Debian. Usually you will start with\u003C\u002Fp>\n\u003Cpre>\u003Ccode>sudo apt-get install mapserver-bin cgi-mapserver gdal-bin\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Configuring that, setting up your tiles, and creating a \u003Cstrong>.map\u003C\u002Fstrong> file is way beyond the scope of this README so I will leave that as an exercise for the reader. Once set up you should have a cgi process you can run called \u003Ccode>mapserv\u003C\u002Fcode>, and a \u003Ccode>.map\u003C\u002Fcode> file that describes the layers available from the server.\u003C\u002Fp>\n\u003Cp>Create and edit these into an executeable file called \u003Cstrong>mapserv\u003C\u002Fstrong>, located in this node's directory, typically\n\u003Ccode>~\u002F.node-red\u002Fnode_modules\u002Fnode-red-contrib-web-worldmap\u002Fmapserv\u003C\u002Fcode>, for example:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>#! \u002Fbin\u002Fsh\n# set this to the path of your WMS map file (which in turn points to your tiles)\nMS_MAPFILE=\u002Fhome\u002Fpi\u002Fmaps\u002Fgb.map\nexport MS_MAPFILE\n# and set this to the path of your cgi-mapserv executable\n\u002Fusr\u002Fbin\u002Fmapserv\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>You can then add a new WMS Base layer by injecting a message like\u003C\u002Fp>\n\u003Cpre>\u003Ccode>msg.payload = { command : { map : {\n    \"name\": \"Local WMS\",\n    \"url\": \"\u002Fcgi-bin\u002Fmapserv\",   \u002F\u002F we will serve the tiles from this node locally.\n    \"opt\": {\n        \"layers\": \"gb\",          \u002F\u002F specifies a layer in your map file\n        \"format\": \"image\u002Fpng\",\n        \"transparent\": true,\n        \"attribution\": \"© Ordnance Survey, UK\"\n    },\n    \"wms\": true                  \u002F\u002F set to true for WMS type mapserver\n}}}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr \u002F>\n\u003Ch2 id=\"examples-and-demo-flow\">\u003Ca class=\"header-anchor\" href=\"#examples-and-demo-flow\">Examples and Demo Flow\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>There are several examples included when you install the node. Navigate to the menu - Import - Examples - node-red-contrib-web-worldmap\u003C\u002Fp>\n\u003Cp>The following example gets recent earthquakes from USGS, parses the result,\nformats up the msg as per above and sends to the node to plot on the map.\nIt also shows how to zoom and move the map or add a new layer.\u003C\u002Fp>\n\u003Cpre>\u003Ccode>[{\"id\":\"86457344.50e6b\",\"type\":\"inject\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"none\",\"x\":170,\"y\":500,\"wires\":[[\"9a142026.fa47f\"]]},{\"id\":\"9a142026.fa47f\",\"type\":\"function\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"add new layer\",\"func\":\"msg.payload = {};\\nmsg.payload.command = {};\\n\\nvar u = 'http:\u002F\u002F{s}.tile.openstreetmap.fr\u002Fhot\u002F{z}\u002F{x}\u002F{y}.png';\\nvar o = { maxZoom: 19, attribution: '&amp;copy; OpenStreetMap'};\\n\\nmsg.payload.command.map = {name:\\\"OSMhot\\\", url:u, opt:o};\\nmsg.payload.command.layer = \\\"OSMhot\\\";\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":400,\"y\":500,\"wires\":[[\"c643e022.1816c\"]]},{\"id\":\"c643e022.1816c\",\"type\":\"worldmap\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"\",\"lat\":\"30\",\"lon\":\"0\",\"zoom\":\"3\",\"layer\":\"OSMG\",\"cluster\":\"\",\"maxage\":\"\",\"usermenu\":\"show\",\"layers\":\"show\",\"panit\":\"false\",\"panlock\":\"false\",\"zoomlock\":\"false\",\"hiderightclick\":\"false\",\"coords\":\"deg\",\"showgrid\":\"false\",\"showruler\":\"false\",\"allowFileDrop\":\"false\",\"path\":\"worldmap\",\"overlist\":\"CO,RA,DN\",\"maplist\":\"OSMG,OSMH,EsriS\",\"mapname\":\"\",\"mapurl\":\"\",\"mapopt\":\"\",\"mapwms\":false,\"x\":640,\"y\":540,\"wires\":[]},{\"id\":\"2998e233.4ba64e\",\"type\":\"function\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"USGS Quake monitor csv re-parse\",\"func\":\"msg.payload.lat = msg.payload.latitude;\\nmsg.payload.lon = msg.payload.longitude;\\nmsg.payload.layer = \\\"earthquake\\\";\\nmsg.payload.name = msg.payload.id;\\nmsg.payload.icon = \\\"globe\\\";\\nmsg.payload.iconColor = \\\"orange\\\";\\n\\ndelete msg.payload.latitude;\\ndelete msg.payload.longitude;\\t\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":520,\"y\":640,\"wires\":[[\"c643e022.1816c\"]]},{\"id\":\"e72c5732.9fa198\",\"type\":\"function\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"move and zoom\",\"func\":\"msg.payload = { command:{layer:\\\"Esri Terrain\\\",lat:0,lon:-90,zoom:2} };\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":400,\"y\":540,\"wires\":[[\"c643e022.1816c\"]]},{\"id\":\"12317723.589249\",\"type\":\"csv\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"\",\"sep\":\",\",\"hdrin\":true,\"hdrout\":\"\",\"multi\":\"one\",\"ret\":\"\\\\n\",\"temp\":\"\",\"x\":370,\"y\":580,\"wires\":[[\"2998e233.4ba64e\"]]},{\"id\":\"10e5e5f0.8daeaa\",\"type\":\"inject\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"\",\"repeat\":\"\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"none\",\"x\":170,\"y\":540,\"wires\":[[\"e72c5732.9fa198\"]]},{\"id\":\"b6917d83.d1bac\",\"type\":\"http request\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"\",\"method\":\"GET\",\"url\":\"http:\u002F\u002Fearthquake.usgs.gov\u002Fearthquakes\u002Ffeed\u002Fv1.0\u002Fsummary\u002F2.5_day.csv\",\"x\":250,\"y\":640,\"wires\":[[\"12317723.589249\"]]},{\"id\":\"3842171.4d487e8\",\"type\":\"inject\",\"z\":\"cb7b09e3354afd4c\",\"name\":\"Quakes\",\"repeat\":\"900\",\"crontab\":\"\",\"once\":false,\"topic\":\"\",\"payload\":\"\",\"payloadType\":\"none\",\"x\":180,\"y\":580,\"wires\":[[\"b6917d83.d1bac\"]]}]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr \u002F>\n\u003Cp>Car, Bus and Helicopter icons originally made by \u003Ca href=\"http:\u002F\u002Fwww.freepik.com\" title=\"Freepik\">Freepik\u003C\u002Fa> from \u003Ca href=\"http:\u002F\u002Fwww.flaticon.com\" title=\"Flaticon\">www.flaticon.com\u003C\u002Fa> are licensed by \u003Ca href=\"http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby\u002F3.0\u002F\" title=\"Creative Commons BY 3.0\" target=\"mapinfo\">CC 3.0 BY\u003C\u002Fa>.\u003C\u002Fp>\n",1791886464050]