WME GPS Tracer

Load and show tracks in WME

  1. // ==UserScript==
  2. // @name WME GPS Tracer
  3. // @namespace https://gf.qytechs.cn/ru/users/26764-alexletov-wme-gps-tracer
  4. // @version 0.1
  5. // @description Load and show tracks in WME
  6. // @author alexletov
  7. // @include https://www.waze.com/editor/*
  8. // @include https://www.waze.com/*/editor/*
  9. // @include https://editor-beta.waze.com/*
  10. // @license https://opensource.org/licenses/BSD-3-Clause
  11. // @copyright 2016 alexletov
  12. // @grant none
  13. // ==/UserScript==
  14.  
  15. var VERSION = '0.1 beta';
  16.  
  17. var server_url;
  18.  
  19. var start, end;
  20.  
  21. function gpsTracer_init() {
  22. try {
  23. if (!((typeof window.Waze.map !== undefined) && (undefined !== typeof window.Waze.map.events.register) && (undefined !== typeof window.Waze.selectionManager.events.register ) && (undefined !== typeof window.Waze.loginManager.events.register) )) {
  24. setTimeout(gpsTracer_init, 1000);
  25. return;
  26. }
  27. } catch (err) {
  28. setTimeout(gpsTracer_init, 1000);
  29. return;
  30. }
  31.  
  32. console.log('WME GPS Tracer: init');
  33. var userInfo = getElId("user-info");
  34. if (userInfo === null) {
  35. window.setTimeout(gpsTracer_init, 500);
  36. return;
  37. }
  38. var navTabs = userInfo.getElementsByTagName("ul");
  39. if (navTabs.length === 0) {
  40. window.setTimeout(gpsTracer_init, 500);
  41. return;
  42. }
  43. if (typeof navTabs[0] === undefined) {
  44. window.setTimeout(gpsTracer_init, 500);
  45. return;
  46. }
  47. var tabContents = userInfo.getElementsByTagName("div");
  48. if (tabContents.length === 0) {
  49. window.setTimeout(gpsTracer_init, 500);
  50. return;
  51. }
  52.  
  53. if (typeof tabContents[0] === undefined) {
  54. window.setTimeout(gpsTracer_init, 500);
  55. return;
  56. }
  57. gpsTracer_loadSettings();
  58. gpsTracer_init_showUI();
  59. $('#_bGPSTProcessSave').click(gpsTracer_saveSettings);
  60. }
  61.  
  62. function gpsTracer_init_showUI() {
  63. addon = document.createElement('section');
  64. addon.innerHTML = '<b>WME GPS Tracer</b> v' + VERSION;
  65.  
  66. section = document.createElement('p');
  67. section.style.paddingTop = "8px";
  68. section.style.textIndent = "16px";
  69. section.id = "gpstracer_settings";
  70. section.innerHTML += 'Select track to show: <select id="_iGPST_track_list" name="_iGPST_track_list" disabled></select><br />';
  71. section.innerHTML += '<button id="_bGPSTProcessLoadTrack" name="_bGPSTProcessLoadTrack" width="100%" disabled>Load track</button><br/>';
  72. section.innerHTML += '<button id="_bGPSTGoToStartOfTrack" name="_bGPSTGoToStartOfTrack" width="100%" disabled>Go to start</button><br/>';
  73. section.innerHTML += '<button id="_bGPSTGoToEndOfTrack" name="_bGPSTGoToEndOfTrack" width="100%" disabled>Go to end</button><br/>';
  74. section.innerHTML += '<br/><br/><hr /><br/><br/>';
  75. section.innerHTML += 'Server url: <input id="_iGPSTServerUrl" name="_iGPSTServerUrl" type="text" value="' + ((server_url === undefined || server_url === null) ? '' : server_url ) + '" /><br />';
  76. section.innerHTML += '<button id="_bGPSTProcessSave" name="_bGPSTProcessSave" width="100%">Save</button><br/>';
  77.  
  78. addon.appendChild(section);
  79. userTabs = getElId("user-tabs");
  80. userInfo = getElId("user-info");
  81. sidePanelPrefs = getElId("sidepanel-prefs");
  82. navTabs = getElClass("nav-tabs", userTabs)[0];
  83. tabContent = sidePanelPrefs.parentNode;
  84.  
  85. newtab = document.createElement('li');
  86. newtab.innerHTML = '<a href="#sidepanel-gpstracer" data-toggle="tab">GPS-T</a>';
  87. navTabs.appendChild(newtab);
  88.  
  89. addon.id = "sidepanel-gpstracer";
  90. addon.className = "tab-pane";
  91. tabContent.appendChild(addon);
  92. }
  93.  
  94. function gpsTracer_request_track_list() {
  95. if (server_url !== null) {
  96. $.ajax({
  97. url: server_url + '/track_list.php',
  98. type: "POST",
  99. dataType: "jsonp",
  100. data: null,
  101. success: function (resp) {
  102. gpsTracer_update_track_list(resp.tracks);
  103. console.log(resp);
  104. },
  105. error: function (xhr, status) {
  106. alert("Error: " + status);
  107. }
  108. });
  109. } else {
  110. console.log("server url is null");
  111. }
  112. }
  113.  
  114. function gpsTracer_update_track_list(list) {
  115. $('#_iGPST_track_list').empty();
  116. for (var i = 0; i < list.length; i++) {
  117. $('#_iGPST_track_list').append( new Option(list[i].name, list[i].id) );
  118. };
  119. $("#_iGPST_track_list").removeAttr("disabled");
  120. $("#_bGPSTProcessLoadTrack").removeAttr("disabled");
  121. $('#_bGPSTProcessLoadTrack').click(gpsTracer_load_track);
  122. }
  123.  
  124. function isValidURL(s) {
  125. var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
  126. return regexp.test(s);
  127. }
  128.  
  129. function gpsTracer_loadSettings() {
  130. server_url = localStorage.getItem("GPST_Server_Url");
  131. gpsTracer_request_track_list();
  132. }
  133.  
  134. function gpsTracer_load_track() {
  135. if (server_url !== null) {
  136. $.ajax({
  137. url: server_url + '/' + $('#_iGPST_track_list').val() + '.php',
  138. type: "POST",
  139. dataType: "jsonp",
  140. data: null,
  141. success: function (resp) {
  142. gpsTracer_show_track(resp);
  143. $('#_bGPSTGoToStartOfTrack').click(gpsTracer_goto_start);
  144. $("#_bGPSTGoToStartOfTrack").removeAttr("disabled");
  145. $('#_bGPSTGoToEndOfTrack').click(gpsTracer_goto_end);
  146. $("#_bGPSTGoToEndOfTrack").removeAttr("disabled");
  147. },
  148. error: function (xhr, status) {
  149. alert("Error: " + status);
  150. }
  151. });
  152. } else {
  153. console.log("server url is null");
  154. }
  155. }
  156.  
  157. function gpsTracer_saveSettings() {
  158. url = $('#_iGPSTServerUrl').val();
  159. if (!isValidURL(url)) {
  160. $('#_iGPSTServerUrl').val(server_url === null ? '' : server_url);
  161. alert(url + ' is not valid URL!');
  162. return;
  163. }
  164. server_url = url;
  165.  
  166. localStorage.setItem("GPST_Server_Url", url);
  167. gpsTracer_request_track_list();
  168. }
  169.  
  170. function gpsTracer_goto_start() {
  171. Waze.map.setCenter([start.x, start.y], 4);
  172. }
  173.  
  174. function gpsTracer_goto_end() {
  175. Waze.map.setCenter([end.x, end.y], 4);
  176. }
  177.  
  178. function gpsTracer_show_track(coordinates) {
  179. var points = [];
  180. var lineFeatures = [];
  181. var proj1 = new OpenLayers.Projection('EPSG:4326');
  182. var proj2 = Waze.map.getProjectionObject();
  183. var numPoints = 0;
  184. gpsTracer_clear_track();
  185.  
  186. for (var i = 0; i < coordinates.length; i++) {
  187. var point = new OpenLayers.Geometry.Point(coordinates[i].lat, coordinates[i].lon).transform(proj1, proj2);
  188. points.push(point);
  189. if (i == 0) {
  190. start = point;
  191. }
  192. end = point;
  193. numPoints++;
  194. }
  195.  
  196. var line = new OpenLayers.Geometry.LineString(points);
  197. var size = 6;
  198. var lineFeature = new OpenLayers.Feature.Vector(line, {strokeColor: '#ff0000'} );
  199. lineFeatures.push(lineFeature);
  200.  
  201. var layers = Waze.map.getLayersBy("uniqueName","__WME_GPS_Tracer");
  202. var gps_mapLayer;
  203. if(layers.length == 0) {
  204. var new_layer_style = new OpenLayers.Style({
  205. strokeDashstyle: 'solid',
  206. strokeColor : "${strokeColor}",
  207. strokeOpacity: 1.0,
  208. strokeWidth: "${lineWidth}",
  209. //strokeLinecap: 'square',
  210. fillColor: '#000000',
  211. fillOpacity: 1.0,
  212. pointRadius: 2,
  213. fontWeight: "normal",
  214. label : "${labelText}",
  215. fontFamily: "Tahoma, Courier New",
  216. labelOutlineColor: "#FFFFFF",
  217. labelOutlineWidth: 2,
  218. fontColor: '#000000',
  219. fontSize: "10px"
  220. });
  221.  
  222. gps_mapLayer = new OpenLayers.Layer.Vector("GPS Tracer", {
  223. displayInLayerSwitcher: true,
  224. uniqueName: "__WME_GPS_Tracer",
  225. styleMap: new OpenLayers.StyleMap(new_layer_style)
  226. });
  227.  
  228. I18n.translations.en.layers.name["__WME_GPS_Tracer"] = "GPS Tracer";
  229. Waze.map.addLayer(gps_mapLayer);
  230. } else {
  231. gps_mapLayer = layers[0];
  232. }
  233. gps_mapLayer.setVisibility(true);
  234. if (lineFeatures.length > 0) gps_mapLayer.addFeatures(lineFeatures);
  235.  
  236. // go to the center of added features
  237. if (lineFeatures.length > 0 || pointFeatures.length > 0) {
  238. var bounds = new OpenLayers.Bounds();
  239.  
  240. for (var i = 0; i < lineFeatures.length; ++i) {
  241. var line = lineFeatures[i];
  242. bounds.extend(line.geometry.bounds);
  243. }
  244.  
  245. var center = bounds.getCenterPixel();
  246. var zoom = Waze.map.getZoom();
  247. Waze.map.setCenter([center.x, center.y], zoom);
  248. }
  249. }
  250.  
  251. function gpsTracer_clear_track()
  252. {
  253. var layers = Waze.map.getLayersBy("uniqueName","__WME_GPS_Tracer");
  254. if(layers.length != 0) {
  255. var gps_layer = layers[0];
  256. gps_layer.removeAllFeatures();
  257. }
  258. }
  259.  
  260. /* helper function */
  261. function getElClass(classname, node) {
  262. if (!node) node = document.getElementsByTagName("body")[0];
  263. var a = [];
  264. var re = new RegExp('\\b' + classname + '\\b');
  265. var els = node.getElementsByTagName("*");
  266. for (var i = 0, j = els.length; i < j; i++)
  267. if (re.test(els[i].className)) a.push(els[i]);
  268. return a;
  269. }
  270.  
  271. function getElId(node) {
  272. return document.getElementById(node);
  273. }
  274.  
  275. gpsTracer_init();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址