WME LiveMap closures

Shows road closures from Waze Live map in WME

当前为 2022-08-22 提交的版本,查看 最新版本

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