WME Road Closures

Shows road closures from Waze Live map in WME

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

  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.1
  8. // @grant none
  9. // @copyright 2014, pvo11
  10. // @namespace https://greasyfork.org/scripts/3462-wme-road-closures
  11. // ==/UserScript==
  12.  
  13. roadClosures_version = '0.1';
  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 lineFeatures = [];
  22.  
  23. for(var i = 0; i < line.length-1; i++) {
  24. var lp1 = line[i];
  25. var lp2 = line[i + 1];
  26. var dif_lon = Math.abs(lp1.x - lp2.x);
  27. var dif_lat = Math.abs(lp1.y - lp2.y);
  28. if (dif_lon < 0.0000001 && dif_lat < 0.0000001) continue;
  29. var p1 = new OpenLayers.Geometry.Point(lp1.x, lp1.y).transform(epsg4326, epsg900913);
  30. var p2 = new OpenLayers.Geometry.Point(lp2.x, lp2.y).transform(epsg4326, epsg900913);
  31. var points = [];
  32. points.push(p1);
  33. points.push(p2);
  34. var line_part = new OpenLayers.Geometry.LineString(points);
  35. var lineFeature = new OpenLayers.Feature.Vector(line_part, { strokeColor: '#FF0000', labelText: '', strokeWidth: 12 } );
  36. lineFeatures.push(lineFeature);
  37. }
  38. closuresLayer.addFeatures(lineFeatures);
  39. }
  40.  
  41.  
  42. function requestClosures()
  43. {
  44. if (closuresLayer.getVisibility() === true) {
  45. var extent = Waze.map.getExtent();
  46. var pLB = new OpenLayers.Geometry.Point(extent.left, extent.bottom).transform(epsg900913, epsg4326);
  47. var pRT = new OpenLayers.Geometry.Point(extent.right, extent.top).transform(epsg900913, epsg4326);
  48. var url = 'https://www.waze.com/row-rtserver/web/GeoRSS?os=60&atof=false&format=JSON&ma=200&mj=100&mu=100&jmu=0&types=alerts%2Cusers%2Ctraffic&left=' + pLB.x + '&right=' + pRT.x + '&bottom=' + pLB.y + '&top=' + pRT.y;
  49.  
  50. $.ajax({
  51. dataType: "json",
  52. url: url,
  53. success: function(json) {
  54. if (json.error != undefined) {
  55. } else {
  56. if ("undefined" !== typeof(json.jams)) {
  57. var numjams = json.jams.length;
  58. for (var i = 0; i < numjams; i++) {
  59. var jam = json.jams[i];
  60. if (jam.blockType === "ROAD_CLOSED_EVENT") {
  61. drawLine(jam.line);
  62. }
  63. }
  64. }
  65. }
  66. }
  67. });
  68. }
  69. }
  70.  
  71.  
  72. function roadClosures_init()
  73. {
  74. var style = new OpenLayers.Style({
  75. strokeDashstyle: 'solid',
  76. strokeColor : "${strokeColor}",
  77. strokeOpacity: 1.0,
  78. strokeWidth: "${strokeWidth}",
  79. fillColor: '#0040FF',
  80. fillOpacity: 1.0,
  81. pointRadius: "${pointRadius}",
  82. label : "${labelText}",
  83. fontFamily: "Tahoma, Courier New",
  84. labelOutlineColor: '#FFFFFF',
  85. labelOutlineWidth: 0,
  86. fontColor: "${fontColor}",
  87. fontOpacity: 1.0,
  88. fontSize: "10px",
  89. display: 'block'
  90. });
  91.  
  92. closuresLayer = new unsafeWindow.OpenLayers.Layer.Vector("Road Closures", {
  93. displayInLayerSwitcher: true,
  94. uniqueName: "__DrawRouteClosures",
  95. styleMap: new OL.StyleMap(style)
  96. });
  97. I18n.translations.en.layers.name["__DrawRouteClosures"] = "Road Closures";
  98. unsafeWindow.Waze.map.addLayer(closuresLayer);
  99. closuresLayer.setVisibility(true);
  100.  
  101. Waze.map.events.register("zoomend", null, requestClosures);
  102. Waze.map.events.register("moveend", null, requestClosures);
  103. Waze.map.events.register("changelayer", null, requestClosures);
  104. requestClosures();
  105.  
  106. }
  107.  
  108.  
  109. function roadClosures_bootstrap()
  110. {
  111. var bGreasemonkeyServiceDefined = false;
  112.  
  113. try
  114. {
  115. bGreasemonkeyServiceDefined = ("object" === typeof Components.interfaces.gmIGreasemonkeyService);
  116. }
  117. catch (err)
  118. { /* Ignore */ }
  119.  
  120. if ( "undefined" === typeof unsafeWindow || ! bGreasemonkeyServiceDefined)
  121. {
  122. unsafeWindow = ( function ()
  123. {
  124. var dummyElem = document.createElement('p');
  125. dummyElem.setAttribute ('onclick', 'return window;');
  126. return dummyElem.onclick ();
  127. } ) ();
  128. }
  129. setTimeout(roadClosures_init, 3000);
  130. }
  131.  
  132.  
  133. roadClosures_bootstrap();