WME LiveMap closures

Shows road closures from Waze Live map in WME

当前为 2020-06-16 提交的版本,查看 最新版本

  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.2
  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. if (jam.blockType === "ROAD_CLOSED_EVENT" || jam.blockType === "ROAD_CLOSED_CONSTRUCTION" || (typeof(jam.causeAlert) !== "undefined" && jam.causeAlert.subtype === "ROAD_CLOSED_EVENT")) {
  130. if (typeof(ids[jam.segments[0].ID]) === "undefined") {
  131. drawLine(jam.line);
  132. ids[jam.segments[0].ID] = 1;
  133. }
  134. }
  135. }
  136. }
  137. }
  138. }
  139. });
  140. }
  141. }
  142.  
  143.  
  144. function changeLayer()
  145. {
  146. localStorage.DrawLiveMapClosures = closuresLayer.getVisibility();
  147. requestClosures();
  148. }
  149.  
  150.  
  151. function liveMapClosures_init()
  152. {
  153. closuresLayer = new uOpenLayers.Layer.Vector("LiveMap closures", {
  154. displayInLayerSwitcher: true,
  155. uniqueName: "__DrawLiveMapClosures"
  156. });
  157. uWaze.map.addLayer(closuresLayer);
  158. if (localStorage.DrawLiveMapClosures) {
  159. closuresLayer.setVisibility(localStorage.DrawLiveMapClosures == "true");
  160. } else {
  161. closuresLayer.setVisibility(true);
  162. }
  163. var roadGroupSelector = document.getElementById('layer-switcher-group_road');
  164. if (roadGroupSelector != null) {
  165. var roadGroup = roadGroupSelector.parentNode.parentNode.getElementsByTagName("UL")[0];
  166. var toggler = document.createElement('li');
  167. var checkbox = document.createElement("wz-checkbox");
  168. checkbox.id = 'layer-switcher-item_livemap_closures';
  169. checkbox.className = "hydrated";
  170. checkbox.disabled = !roadGroupSelector.checked;
  171. checkbox.checked = closuresLayer.getVisibility();
  172. checkbox.appendChild(document.createTextNode("LiveMap closures"));
  173. toggler.appendChild(checkbox);
  174. roadGroup.appendChild(toggler);
  175. checkbox.addEventListener('click', function(e) {
  176. closuresLayer.setVisibility(e.target.checked);
  177. });
  178. roadGroupSelector.addEventListener('click', function(e) {
  179. closuresLayer.setVisibility(e.target.checked & checkbox.checked);
  180. checkbox.disabled = !e.target.checked;
  181. });
  182. }
  183.  
  184. var alertsLayer = uWaze.map.getLayerByUniqueName('__livemap_alerts');
  185. if (typeof(alertsLayer) !== "undefined") {
  186. var closuresLayerZIdx = closuresLayer.getZIndex();
  187. var alertsLayerZIdx = alertsLayer.getZIndex();
  188. if (closuresLayerZIdx > alertsLayerZIdx) {
  189. closuresLayer.setZIndex(alertsLayerZIdx);
  190. alertsLayer.setZIndex(closuresLayerZIdx);
  191. }
  192. }
  193.  
  194. uWaze.map.events.register("zoomend", null, requestClosures);
  195. uWaze.map.events.register("moveend", null, requestClosures);
  196. uWaze.map.events.register("changelayer", null, changeLayer);
  197. requestClosures();
  198.  
  199. }
  200.  
  201.  
  202. function liveMapClosures_bootstrap()
  203. {
  204. uWaze = unsafeWindow.W;
  205. uOpenLayers = unsafeWindow.OpenLayers;
  206. if (typeof(uOpenLayers) === 'undefined' || typeof (uWaze) === 'undefined' || typeof (uWaze.map) === 'undefined' || document.querySelector('.list-unstyled.togglers .group') === null) {
  207. setTimeout(liveMapClosures_bootstrap, 500);
  208. } else {
  209. epsg900913 = new uOpenLayers.Projection("EPSG:900913");
  210. epsg4326 = new uOpenLayers.Projection("EPSG:4326");
  211. liveMapClosures_init();
  212. }
  213. }
  214.  
  215.  
  216. liveMapClosures_bootstrap();