WME LiveMap closures

Shows road closures from Waze Live map in WME

当前为 2018-07-28 提交的版本,查看 最新版本

  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.15.1
  9. // @copyright 2014-2018, 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 = uWaze.location.code;
  70. var routingURL = 'https://www.waze.com';
  71. if (~document.URL.indexOf('https://beta.waze.com')) {
  72.         routingURL = 'https://beta.waze.com';
  73.     }
  74. switch(server){
  75. case 'usa':
  76. routingURL += '/rtserver/web/TGeoRSS';
  77. break;
  78. case 'row':
  79. routingURL += '/row-rtserver/web/TGeoRSS';
  80. break;
  81. case 'il':
  82. routingURL += '/il-rtserver/web/TGeoRSS';
  83. break;
  84. default:
  85. routingURL += '/rtserver/web/TGeoRSS';
  86. }
  87.  
  88. return routingURL;
  89. }
  90.  
  91.  
  92. function requestClosures()
  93. {
  94. if (closuresLayer.getVisibility()) {
  95. var extent = uWaze.map.getExtent();
  96. var oh = 500;
  97. var pLB = new uOpenLayers.Geometry.Point(extent.left - oh, extent.bottom - oh).transform(epsg900913, epsg4326);
  98. var pRT = new uOpenLayers.Geometry.Point(extent.right + oh, extent.top + oh).transform(epsg900913, epsg4326);
  99. var data = {
  100. ma: "600",
  101. mj: "100",
  102. mu: "100",
  103. types: "traffic",
  104. left: pLB.x,
  105. right: pRT.x,
  106. bottom: pLB.y,
  107. top: pRT.y
  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.blockType === "ROAD_CLOSED_EVENT" || jam.blockType === "ROAD_CLOSED_CONSTRUCTION" || (typeof(jam.causeAlert) !== "undefined" && jam.causeAlert.subtype === "ROAD_CLOSED_EVENT")) {
  125. if (typeof(ids[jam.segments[0].ID]) === "undefined") {
  126. drawLine(jam.line);
  127. ids[jam.segments[0].ID] = 1;
  128. }
  129. }
  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.querySelector('.children');
  161. var toggler = document.createElement('li');
  162. var togglerContainer = document.createElement('div');
  163. togglerContainer.className = 'controls-container toggler';
  164. var checkbox = document.createElement('input');
  165. checkbox.type = 'checkbox';
  166. checkbox.id = 'layer-switcher-item_livemap_closures';
  167. checkbox.className = 'toggle';
  168. checkbox.checked = closuresLayer.getVisibility();
  169. checkbox.addEventListener('click', function(e) {
  170. closuresLayer.setVisibility(e.target.checked);
  171. });
  172. roadGroupSelector.addEventListener('click', function(e) {
  173. closuresLayer.setVisibility(e.target.checked & checkbox.checked);
  174. checkbox.disabled = !e.target.checked;
  175. });
  176. togglerContainer.appendChild(checkbox);
  177. var label = document.createElement('label');
  178. label.htmlFor = checkbox.id;
  179. var labelText = document.createElement('span');
  180. labelText.className = 'label-text';
  181. labelText.appendChild(document.createTextNode('LiveMap closures'));
  182. label.appendChild(labelText);
  183. togglerContainer.appendChild(label);
  184. toggler.appendChild(togglerContainer);
  185. roadGroup.appendChild(toggler);
  186. }
  187. var alertsLayer = uWaze.map.getLayerByUniqueName('__livemap_alerts');
  188. if (typeof(alertsLayer) !== "undefined") {
  189. var closuresLayerZIdx = closuresLayer.getZIndex();
  190. var alertsLayerZIdx = alertsLayer.getZIndex();
  191. if (closuresLayerZIdx > alertsLayerZIdx) {
  192. closuresLayer.setZIndex(alertsLayerZIdx);
  193. alertsLayer.setZIndex(closuresLayerZIdx);
  194. }
  195. }
  196.  
  197. uWaze.map.events.register("zoomend", null, requestClosures);
  198. uWaze.map.events.register("moveend", null, requestClosures);
  199. uWaze.map.events.register("changelayer", null, changeLayer);
  200. requestClosures();
  201.  
  202. }
  203.  
  204.  
  205. function liveMapClosures_bootstrap()
  206. {
  207. uWaze = unsafeWindow.W;
  208. uOpenLayers = unsafeWindow.OL;
  209. if (typeof(uOpenLayers) === 'undefined' || typeof (uWaze) === 'undefined' || typeof (uWaze.map) === 'undefined' || document.querySelector('.list-unstyled.togglers .group') === null) {
  210. setTimeout(liveMapClosures_bootstrap, 500);
  211. } else {
  212. epsg900913 = new uOpenLayers.Projection("EPSG:900913");
  213. epsg4326 = new uOpenLayers.Projection("EPSG:4326");
  214. liveMapClosures_init();
  215. }
  216. }
  217.  
  218.  
  219. liveMapClosures_bootstrap();