WME LiveMap closures

Shows road closures from Waze Live map in WME

当前为 2016-11-09 提交的版本,查看 最新版本

  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://editor-beta.waze.com/*
  7. // @version 1.7
  8. // @grant none
  9. // @copyright 2014, pvo11
  10. // @namespace https://greasyfork.org/scripts/5144-wme-road-closures
  11. // ==/UserScript==
  12.  
  13.  
  14. var epsg900913 = new OpenLayers.Projection("EPSG:900913");
  15. var epsg4326 = new OpenLayers.Projection("EPSG:4326");
  16. var closuresLayer;
  17.  
  18. lineWidth = [
  19. [4, 5],
  20. [5, 6],
  21. [6, 7],
  22. [7, 8],
  23. [8, 9],
  24. [10, 12],
  25. [12, 14],
  26. [14, 16],
  27. [15, 17],
  28. [16, 18],
  29. [17, 19]
  30. ];
  31.  
  32. function drawLine(line) {
  33. var linePoints = [];
  34.  
  35. var zoom = Waze.map.getZoom();
  36. if (zoom >= lineWidth.length) {
  37. zoom = lineWidth.length - 1;
  38. }
  39.  
  40. var p = new OpenLayers.Geometry.Point(line[0].x, line[0].y).transform(epsg4326, epsg900913);
  41. linePoints.push(p);
  42. for(var i = 1; i < line.length-1; i++) {
  43. var lp1 = line[i];
  44. var lp2 = line[i + 1];
  45. var dif_lon = Math.abs(lp1.x - lp2.x);
  46. var dif_lat = Math.abs(lp1.y - lp2.y);
  47. if (dif_lon < 0.0000001 && dif_lat < 0.0000001) continue;
  48. p = new OpenLayers.Geometry.Point(lp1.x, lp1.y).transform(epsg4326, epsg900913);
  49. linePoints.push(p);
  50. }
  51. p = new OpenLayers.Geometry.Point(line[line.length-1].x, line[line.length-1].y).transform(epsg4326, epsg900913);
  52. linePoints.push(p);
  53. var lineString = new OpenLayers.Geometry.LineString(linePoints);
  54. var lineFeature = new OpenLayers.Feature.Vector(lineString, null, { strokeColor: '#000000', strokeDashstyle: 'solid', strokeLinecap: 'round', strokeWidth: lineWidth[zoom][1]} );
  55. closuresLayer.addFeatures(lineFeature);
  56. lineString = new OpenLayers.Geometry.LineString(linePoints);
  57. lineFeature = new OpenLayers.Feature.Vector(lineString, null, { strokeColor: '#FF0000', strokeDashstyle: 'solid', strokeLinecap: 'round', strokeWidth: lineWidth[zoom][0] } );
  58. closuresLayer.addFeatures(lineFeature);
  59. lineString = new OpenLayers.Geometry.LineString(linePoints);
  60. lineFeature = new OpenLayers.Feature.Vector(lineString, null, { strokeColor: '#FFFFFF', strokeDashstyle: 'dot', strokeLinecap: 'square', strokeWidth: lineWidth[zoom][0] } );
  61. closuresLayer.addFeatures(lineFeature);
  62. }
  63.  
  64.  
  65. function getRoutingURL(){
  66. var server = Waze.location.code;
  67. var routingURL = 'https://www.waze.com';
  68. switch(server){
  69. case 'usa':
  70. routingURL += '/rtserver/web/TGeoRSS';
  71. break;
  72. case 'row':
  73. routingURL += '/row-rtserver/web/TGeoRSS';
  74. break;
  75. case 'il':
  76. routingURL += '/il-rtserver/web/TGeoRSS';
  77. break;
  78. default:
  79. routingURL += '/rtserver/web/TGeoRSS';
  80. }
  81.  
  82. return routingURL;
  83. }
  84.  
  85.  
  86. function requestClosures()
  87. {
  88. if (closuresLayer.getVisibility()) {
  89. var extent = Waze.map.getExtent();
  90. var oh = 500;
  91. var pLB = new OpenLayers.Geometry.Point(extent.left - oh, extent.bottom - oh).transform(epsg900913, epsg4326);
  92. var pRT = new OpenLayers.Geometry.Point(extent.right + oh, extent.top + oh).transform(epsg900913, epsg4326);
  93. var data = {
  94. ma: "600",
  95. mj: "100",
  96. mu: "100",
  97. left: pLB.x,
  98. right: pRT.x,
  99. bottom: pLB.y,
  100. top: pRT.y
  101. };
  102. var url = getRoutingURL();
  103.  
  104. $.ajax({
  105. dataType: "json",
  106. url: url,
  107. data: data,
  108. success: function(json) {
  109. if (json.error != undefined) {
  110. } else {
  111. closuresLayer.destroyFeatures();
  112. var ids = [];
  113. if ("undefined" !== typeof(json.jams)) {
  114. var numjams = json.jams.length;
  115. for (var i = 0; i < numjams; i++) {
  116. var jam = json.jams[i];
  117. if (jam.blockType === "ROAD_CLOSED_EVENT" || jam.blockType === "ROAD_CLOSED_CONSTRUCTION" || (typeof(jam.causeAlert) !== "undefined" && jam.causeAlert.subtype === "ROAD_CLOSED_EVENT")) {
  118. if (typeof(ids[jam.segments[0].ID]) === "undefined") {
  119. drawLine(jam.line);
  120. ids[jam.segments[0].ID] = 1;
  121. }
  122. }
  123. }
  124. }
  125. }
  126. }
  127. });
  128. }
  129. }
  130.  
  131.  
  132. function changeLayer()
  133. {
  134. localStorage.DrawLiveMapClosures = closuresLayer.getVisibility();
  135. requestClosures();
  136. }
  137.  
  138.  
  139. function liveMapClosures_init()
  140. {
  141. closuresLayer = new OpenLayers.Layer.Vector("LiveMap closures", {
  142. displayInLayerSwitcher: true,
  143. uniqueName: "__DrawLiveMapClosures"
  144. });
  145. // I18n.translations.en.layers.name["__DrawLiveMapClosures"] = "LiveMap closures";
  146. Waze.map.addLayer(closuresLayer);
  147. if (localStorage.DrawLiveMapClosures) {
  148. closuresLayer.setVisibility(localStorage.DrawLiveMapClosures == "true");
  149. } else {
  150. closuresLayer.setVisibility(true);
  151. }
  152. var alertsLayer = Waze.map.getLayersBy('uniqueName', '__livemap_alerts').first();
  153. if (typeof(alertsLayer) !== "undefined") {
  154. var closuresLayerZIdx = closuresLayer.getZIndex();
  155. var alertsLayerZIdx = alertsLayer.getZIndex();
  156. if (closuresLayerZIdx > alertsLayerZIdx) {
  157. closuresLayer.setZIndex(alertsLayerZIdx);
  158. alertsLayer.setZIndex(closuresLayerZIdx);
  159. }
  160. }
  161.  
  162. Waze.map.events.register("zoomend", null, requestClosures);
  163. Waze.map.events.register("moveend", null, requestClosures);
  164. Waze.map.events.register("changelayer", null, changeLayer);
  165. requestClosures();
  166.  
  167. }
  168.  
  169.  
  170. function liveMapClosures_bootstrap()
  171. {
  172. if (typeof Waze === 'undefined' || typeof Waze.map === 'undefined') {
  173. setTimeout(liveMapClosures_bootstrap, 500);
  174. } else {
  175. liveMapClosures_init();
  176. }
  177. }
  178.  
  179.  
  180. liveMapClosures_bootstrap();