WME Road Closures

Shows road closures from Waze Live map in WME

当前为 2014-09-21 提交的版本,查看 最新版本

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