Greasy Fork is available in English.

WME LiveMap closures

Shows road closures from Waze Live map in WME

  1. // ==UserScript==
  2. // @name WME LiveMap closures
  3. // @description Shows road closures from Waze Live map in WME
  4. // @match https://www.waze.com/*editor*
  5. // @match https://beta.waze.com/*editor*
  6. // @version 1.16.12
  7. // @copyright 2014-2025, pvo11
  8. // @namespace https://greatest.deepsurf.us/scripts/5144-wme-road-closures
  9. // ==/UserScript==
  10.  
  11.  
  12. var epsg900913;
  13. var epsg4326;
  14. var closuresLayer;
  15.  
  16. var uOpenLayers;
  17. var uWaze;
  18.  
  19. var lineWidth = [
  20. [4, 5],
  21. [5, 6],
  22. [6, 7],
  23. [7, 8],
  24. [8, 9],
  25. [10, 12],
  26. [12, 14],
  27. [14, 16],
  28. [15, 17],
  29. [16, 18],
  30. [17, 19]
  31. ];
  32.  
  33.  
  34. function drawLine(line) {
  35. var linePoints = [];
  36.  
  37. var zoom = uWaze.map.getZoom() - 12;
  38. if (zoom >= lineWidth.length) {
  39. zoom = lineWidth.length - 1;
  40. }
  41.  
  42. var p = new uOpenLayers.Geometry.Point(line[0].x, line[0].y).transform(epsg4326, epsg900913);
  43. linePoints.push(p);
  44. for(var i = 1; i < line.length-1; i++) {
  45. var lp1 = line[i];
  46. var lp2 = line[i + 1];
  47.  
  48. var dif_lon = Math.abs(lp1.x - lp2.x);
  49. var dif_lat = Math.abs(lp1.y - lp2.y);
  50.  
  51. if (dif_lon < 0.0000001 && dif_lat < 0.0000001) continue;
  52. p = new uOpenLayers.Geometry.Point(lp1.x, lp1.y).transform(epsg4326, epsg900913);
  53. linePoints.push(p);
  54. }
  55. p = new uOpenLayers.Geometry.Point(line[line.length-1].x, line[line.length-1].y).transform(epsg4326, epsg900913);
  56. linePoints.push(p);
  57. var lineString = new uOpenLayers.Geometry.LineString(linePoints);
  58. var lineFeature = new uOpenLayers.Feature.Vector(lineString, null, { strokeColor: '#000000', strokeDashstyle: 'solid', strokeLinecap: 'round', strokeWidth: lineWidth[zoom][1]} );
  59. closuresLayer.addFeatures(lineFeature);
  60. lineString = new uOpenLayers.Geometry.LineString(linePoints);
  61. lineFeature = new uOpenLayers.Feature.Vector(lineString, null, { strokeColor: '#FF0000', strokeDashstyle: 'solid', strokeLinecap: 'round', strokeWidth: lineWidth[zoom][0] } );
  62. closuresLayer.addFeatures(lineFeature);
  63. lineString = new uOpenLayers.Geometry.LineString(linePoints);
  64. lineFeature = new uOpenLayers.Feature.Vector(lineString, null, { strokeColor: '#FFFFFF', strokeDashstyle: 'dot', strokeLinecap: 'square', strokeWidth: lineWidth[zoom][0] } );
  65. closuresLayer.addFeatures(lineFeature);
  66. }
  67.  
  68.  
  69. function getRoutingURL(){
  70. var server;
  71. if (typeof (uWaze.location) === 'undefined') {
  72. server = uWaze.app.getAppRegionCode();
  73. } else {
  74. server = uWaze.location.code;
  75. }
  76. var routingURL = 'https://www.waze.com';
  77. if (~document.URL.indexOf('https://beta.waze.com')) {
  78.         routingURL = 'https://beta.waze.com';
  79.     }
  80.  
  81. routingURL += '/live-map/api/georss';
  82.  
  83. return routingURL;
  84. }
  85.  
  86.  
  87. function requestClosures()
  88. {
  89. var zoom = uWaze.map.getZoom() - 12;
  90. var env = uWaze.app.getAppRegionCode();
  91. if (env == 'usa') {
  92. env = 'na';
  93. }
  94. if (zoom >= 0) {
  95. if (closuresLayer.getVisibility()) {
  96. var extent = uWaze.map.getExtent();
  97. var data;
  98. data = {
  99. env: env,
  100. ma: "600",
  101. mj: "100",
  102. mu: "100",
  103. types: "traffic",
  104. left: extent[0],
  105. top: extent[1],
  106. right: extent[2],
  107. bottom: extent[3]
  108. };
  109. var url = getRoutingURL();
  110.  
  111. $.ajax({
  112. dataType: "json",
  113. url: url,
  114. data: data,
  115. success: function(json) {
  116. if (json.error != undefined) {
  117. } else {
  118. closuresLayer.destroyFeatures();
  119. var ids = [];
  120. if ("undefined" !== typeof(json.jams)) {
  121. var numjams = json.jams.length;
  122. for (var i = 0; i < numjams; i++) {
  123. var jam = json.jams[i];
  124. if (jam.delay === -1){
  125. drawLine(jam.line);
  126. }
  127. }
  128. }
  129. }
  130. }
  131. });
  132. }
  133. }
  134. }
  135.  
  136.  
  137. function changeLayer()
  138. {
  139. localStorage.DrawLiveMapClosures = closuresLayer.getVisibility();
  140. requestClosures();
  141. }
  142.  
  143.  
  144. function liveMapClosures_init()
  145. {
  146. uWaze = unsafeWindow.W;
  147. uOpenLayers = unsafeWindow.OpenLayers;
  148.  
  149. epsg900913 = new uOpenLayers.Projection("EPSG:900913");
  150. epsg4326 = new uOpenLayers.Projection("EPSG:4326");
  151.  
  152. closuresLayer = new uOpenLayers.Layer.Vector("LiveMap closures", {
  153. displayInLayerSwitcher: true,
  154. });
  155. uWaze.map.addLayer(closuresLayer);
  156. if (localStorage.DrawLiveMapClosures) {
  157. closuresLayer.setVisibility(localStorage.DrawLiveMapClosures == "true");
  158. } else {
  159. closuresLayer.setVisibility(true);
  160. }
  161. var roadGroupSelector = document.getElementById('layer-switcher-group_road');
  162. if (roadGroupSelector != null) {
  163. var roadGroup = roadGroupSelector.parentNode.parentNode.getElementsByTagName("UL")[0];
  164. var toggler = document.createElement('li');
  165. var checkbox = document.createElement("wz-checkbox");
  166. checkbox.id = 'layer-switcher-item_livemap_closures';
  167. checkbox.className = "hydrated";
  168. checkbox.disabled = !roadGroupSelector.checked;
  169. checkbox.checked = closuresLayer.getVisibility();
  170. checkbox.appendChild(document.createTextNode("LiveMap closures"));
  171. toggler.appendChild(checkbox);
  172. roadGroup.appendChild(toggler);
  173. checkbox.addEventListener('click', function(e) {
  174. closuresLayer.setVisibility(e.target.checked);
  175. });
  176. roadGroupSelector.addEventListener('click', function(e) {
  177. closuresLayer.setVisibility(e.target.checked && checkbox.checked);
  178. checkbox.disabled = !e.target.checked;
  179. });
  180. }
  181.  
  182. var alertsLayer = uWaze.map.getLayerByName('Livemap Alerts');
  183. if (typeof(alertsLayer) !== "undefined") {
  184. var closuresLayerZIdx = closuresLayer.getZIndex();
  185. var alertsLayerZIdx = alertsLayer.getZIndex();
  186. if (closuresLayerZIdx > alertsLayerZIdx) {
  187. closuresLayer.setZIndex(alertsLayerZIdx);
  188. alertsLayer.setZIndex(closuresLayerZIdx);
  189. }
  190. }
  191.  
  192. uWaze.map.events.register("zoomend", null, requestClosures);
  193. uWaze.map.events.register("moveend", null, requestClosures);
  194. uWaze.map.events.register("changelayer", null, changeLayer);
  195. requestClosures();
  196.  
  197. }
  198.  
  199.  
  200. document.addEventListener("wme-map-data-loaded", liveMapClosures_init, {once: true});
  201.