WME LiveMap closures

Shows road closures from Waze Live map in WME

当前为 2020-08-24 提交的版本,查看 最新版本

  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.3
  9. // @copyright 2014-2020, 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();
  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. if (closuresLayer.getVisibility()) {
  100. var extent = uWaze.map.getExtent();
  101. var oh = 500;
  102. var pLB = new uOpenLayers.Geometry.Point(extent.left - oh, extent.bottom - oh).transform(epsg900913, epsg4326);
  103. var pRT = new uOpenLayers.Geometry.Point(extent.right + oh, extent.top + oh).transform(epsg900913, epsg4326);
  104. var data = {
  105. ma: "600",
  106. mj: "100",
  107. mu: "100",
  108. types: "traffic",
  109. left: pLB.x,
  110. right: pRT.x,
  111. bottom: pLB.y,
  112. top: pRT.y
  113. };
  114. var url = getRoutingURL();
  115.  
  116. $.ajax({
  117. dataType: "json",
  118. url: url,
  119. data: data,
  120. success: function(json) {
  121. if (json.error != undefined) {
  122. } else {
  123. closuresLayer.destroyFeatures();
  124. var ids = [];
  125. if ("undefined" !== typeof(json.jams)) {
  126. var numjams = json.jams.length;
  127. for (var i = 0; i < numjams; i++) {
  128. var jam = json.jams[i];
  129. drawLine(jam.line);
  130. }
  131. }
  132. }
  133. }
  134. });
  135. }
  136. }
  137.  
  138.  
  139. function changeLayer()
  140. {
  141. localStorage.DrawLiveMapClosures = closuresLayer.getVisibility();
  142. requestClosures();
  143. }
  144.  
  145.  
  146. function liveMapClosures_init()
  147. {
  148. closuresLayer = new uOpenLayers.Layer.Vector("LiveMap closures", {
  149. displayInLayerSwitcher: true,
  150. uniqueName: "__DrawLiveMapClosures"
  151. });
  152. uWaze.map.addLayer(closuresLayer);
  153. if (localStorage.DrawLiveMapClosures) {
  154. closuresLayer.setVisibility(localStorage.DrawLiveMapClosures == "true");
  155. } else {
  156. closuresLayer.setVisibility(true);
  157. }
  158. var roadGroupSelector = document.getElementById('layer-switcher-group_road');
  159. if (roadGroupSelector != null) {
  160. var roadGroup = roadGroupSelector.parentNode.parentNode.getElementsByTagName("UL")[0];
  161. var toggler = document.createElement('li');
  162. var checkbox = document.createElement("wz-checkbox");
  163. checkbox.id = 'layer-switcher-item_livemap_closures';
  164. checkbox.className = "hydrated";
  165. checkbox.disabled = !roadGroupSelector.checked;
  166. checkbox.checked = closuresLayer.getVisibility();
  167. checkbox.appendChild(document.createTextNode("LiveMap closures"));
  168. toggler.appendChild(checkbox);
  169. roadGroup.appendChild(toggler);
  170. checkbox.addEventListener('click', function(e) {
  171. closuresLayer.setVisibility(e.target.checked);
  172. });
  173. roadGroupSelector.addEventListener('click', function(e) {
  174. closuresLayer.setVisibility(e.target.checked && checkbox.checked);
  175. checkbox.disabled = !e.target.checked;
  176. });
  177. }
  178.  
  179. var alertsLayer = uWaze.map.getLayerByUniqueName('__livemap_alerts');
  180. if (typeof(alertsLayer) !== "undefined") {
  181. var closuresLayerZIdx = closuresLayer.getZIndex();
  182. var alertsLayerZIdx = alertsLayer.getZIndex();
  183. if (closuresLayerZIdx > alertsLayerZIdx) {
  184. closuresLayer.setZIndex(alertsLayerZIdx);
  185. alertsLayer.setZIndex(closuresLayerZIdx);
  186. }
  187. }
  188.  
  189. uWaze.map.events.register("zoomend", null, requestClosures);
  190. uWaze.map.events.register("moveend", null, requestClosures);
  191. uWaze.map.events.register("changelayer", null, changeLayer);
  192. requestClosures();
  193.  
  194. }
  195.  
  196.  
  197. function liveMapClosures_bootstrap()
  198. {
  199. uWaze = unsafeWindow.W;
  200. uOpenLayers = unsafeWindow.OpenLayers;
  201. if (typeof(uOpenLayers) === 'undefined' || typeof (uWaze) === 'undefined' || typeof (uWaze.map) === 'undefined' || document.querySelector('.list-unstyled.togglers .group') === null) {
  202. setTimeout(liveMapClosures_bootstrap, 500);
  203. } else {
  204. epsg900913 = new uOpenLayers.Projection("EPSG:900913");
  205. epsg4326 = new uOpenLayers.Projection("EPSG:4326");
  206. liveMapClosures_init();
  207. }
  208. }
  209.  
  210.  
  211. liveMapClosures_bootstrap();