WME GPS Track View

Draws and visualizes custom GPS tracks in Waze Map Editor

  1. // ==UserScript==
  2. // @name WME GPS Track View
  3. // @namespace http://userscripts.org/scripts/show/461960
  4. // @description Draws and visualizes custom GPS tracks in Waze Map Editor
  5. // @include https://www.waze.com/editor/*
  6. // @include https://www.waze.com/*/editor/*
  7. // @include https://editor-beta.waze.com/*
  8. // @version 1.2.4
  9. // @grant none
  10. // @copyright 2014 wlodek76
  11. // @copyright 2014 FZ69617
  12. // ==/UserScript==
  13.  
  14. var wmech_version = "1.2.4";
  15.  
  16. /*
  17. * Version history:
  18. *
  19. * 1.2.4 (20141005)
  20. * - New: Tracks layer summary with clean tracks button.
  21. * - Revert: Temporary from previous version removed.
  22. *
  23. * 1.2.3 (20141004)
  24. * - Improvement: Map panning to the center of added points.
  25. * - Temporary: Tracks layer cleaning before track addition.
  26. * - Other: Minor code changes.
  27. */
  28.  
  29.  
  30.  
  31. var gps_num_tracks = 0;
  32. var gps_num_points = 0;
  33. var gps_total_distance = 0;
  34.  
  35.  
  36. //---------------------------------------------------------------------------------------
  37. function bootstrap_WME_GPS_Track()
  38. {
  39. var bGreasemonkeyServiceDefined = false;
  40.  
  41. try {
  42. bGreasemonkeyServiceDefined = (typeof Components.interfaces.gmIGreasemonkeyService === "object");
  43. }
  44. catch (err) { /* Ignore */ }
  45.  
  46. if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
  47. unsafeWindow = ( function () {
  48. var dummyElem = document.createElement('p');
  49. dummyElem.setAttribute('onclick', 'return window;');
  50. return dummyElem.onclick();
  51. }) ();
  52. }
  53.  
  54. /* begin running the code! */
  55. setInterval(Draw_WME_GPS_Track, 1000);
  56. console.log("WME GPS Track View " + wmech_version + " loaded.");
  57. }
  58. //---------------------------------------------------------------------------------------
  59. function min_to_deg(v)
  60. {
  61. var fmin = parseFloat(v) * 0.01;
  62. var fdeg = parseInt(fmin);
  63. fmin -= fdeg;
  64. return (fdeg + fmin * 1.66666666666666666);
  65. }
  66. //---------------------------------------------------------------------------------------
  67. function calc_azym(pt1, pt2, kierWidth)
  68. {
  69. var dx = pt2.x - pt1.x;
  70. var dy = pt2.y - pt1.y;
  71. var azym = (Math.atan2(dx, dy) * 180.0 / Math.PI);
  72. if (azym > 360) azym -= 360;
  73. if (azym < 0) azym += 360;
  74. return azym;
  75. }
  76. //---------------------------------------------------------------------------------------
  77. function gps_parse()
  78. {
  79. var gps_wazeMap = unsafeWindow.Waze.map;
  80. var gps_wazeModel = unsafeWindow.Waze.model;
  81. var gps_OpenLayers = unsafeWindow.OpenLayers;
  82. var obj1 = document.getElementById('wme_gps_layer_content');
  83. var obj2 = document.getElementById('wme_gps_layer_info');
  84. var obj3 = document.getElementById('wme_gps_layer_speed');
  85. if (obj1 == null) return;
  86. if (obj2 == null) return;
  87. if (obj3 == null) return;
  88.  
  89. var str = obj1.value;
  90. var speedmode = obj3.checked;
  91. var points = [];
  92. var lineFeatures = [];
  93. var pointFeatures = [];
  94. var proj1 = new OpenLayers.Projection('EPSG:4326');
  95. var proj2 = gps_wazeMap.getProjectionObject();
  96. var time1 = 0;
  97. var time2 = 0;
  98. var pt1 = null;
  99. var pt2 = null;
  100. var kier1 = 0;
  101. var kier2 = 0;
  102. var kiercolor = new Array();
  103. var speedcolor = new Array();
  104.  
  105. kiercolor.push('#ff0000');
  106. kiercolor.push('#00ff40');
  107. kiercolor.push('#00ff40');
  108. kiercolor.push('#0000ff');
  109. kiercolor.push('#0000ff');
  110. kiercolor.push('#fff000');
  111. kiercolor.push('#fff000');
  112. kiercolor.push('#ff0000');
  113.  
  114. speedcolor[0] = '#000000';
  115. speedcolor[1] = '#505060';
  116. speedcolor[2] = '#b0b0c0';
  117. speedcolor[3] = '#FFFF00';
  118. speedcolor[4] = '#68fdda';
  119. speedcolor[5] = '#00d508';
  120. speedcolor[6] = '#f68400';
  121. speedcolor[7] = '#8e3f04';
  122. speedcolor[8] = '#ff525a';
  123. speedcolor[9] = '#e00000';
  124. speedcolor[10] = '#2594fb';
  125. speedcolor[11] = '#0500c9';
  126. speedcolor[12] = '#fa00e4';
  127. speedcolor[13] = '#68008d';
  128. speedcolor[14] = '#370143';
  129. speedcolor[15] = '#370143';
  130. speedcolor[16] = '#370143';
  131. speedcolor[17] = '#370143';
  132. speedcolor[18] = '#370143';
  133. speedcolor[19] = '#370143';
  134. speedcolor[20] = '#370143';
  135. var kierWidth = 360 / kiercolor.length;
  136. kiercolor.push(kiercolor[0]);
  137. var nmea_format = str.indexOf("$GPGGA");
  138. var gpx_format = str.indexOf("<trkpt");
  139. var kml_format1 = str.indexOf("<gx:coord>");
  140. var kml_format2 = str.indexOf("<LineString>");
  141.  
  142. var numPoints = 0;
  143. var sumDist = 0;
  144. if (nmea_format >= 0) {
  145. pt1 = null;
  146. pt2 = null;
  147. kier1 = 0;
  148. kier2 = 0;
  149. points.length = 0;
  150. var p = -1;
  151. for(;;) {
  152. p = str.indexOf("$GPGGA", p+1);
  153. if (p < 0) break;
  154. var s = str.substr(p, 80);
  155. var d = s.split(",");
  156. var lat = min_to_deg(d[2]);
  157. var lon = min_to_deg(d[4]);
  158. if (d[3] == 'S') lat = -lat;
  159. if (d[5] == 'W') lon = -lon;
  160. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  161. numPoints++;
  162. time1 = time2;
  163. time2 = parseInt(d[1]);
  164. var s = time2 % 100;
  165. time2 = (time2 - s) / 100;
  166. var m = time2 % 100;
  167. time2 = (time2 - m) / 100;
  168. var g = time2 % 100;
  169. time2 = (g*3600) + (m*60) + s;
  170. var angle = 0;
  171. var stop = 0;
  172. var dist = 0;
  173. var speed = 0;
  174. var dt = 0;
  175. if (pt1 != null && pt2 != null) {
  176. angle = calc_azym(pt1, pt2, kierWidth);
  177. dist = pt1.distanceTo(pt2);
  178. dt = Math.abs(time2 - time1);
  179. kier2 = parseInt(angle / kierWidth);
  180. if (speedmode) {
  181. var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
  182. var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  183. var kmh = (geodist / dt) * 3.6;
  184. speed = parseInt(kmh / 10);
  185. if (speed < 0) speed = 0;
  186. if (speed > 20) speed = 20;
  187. kier2 = speed;
  188. if (dist < 5 && kier1<=2 && kier2<=2) continue;
  189. }
  190. else {
  191. if (dist < 5) continue;
  192. }
  193. if (dist > 10000) stop |= 1;
  194. if (dt > 60) stop |= 1;
  195. if (kier2 != kier1) stop |= 2;
  196.  
  197. }
  198. //var ptFeature = new OpenLayers.Feature.Vector(pt1, {strokeColor: '#000000', labelText: '', lineWidth: 1 } );
  199. //pointFeatures.push(ptFeature);
  200. if (stop) {
  201. if (points.length >= 2) {
  202. var k = kiercolor[kier1];
  203. var szer = 3;
  204. if (speedmode) {
  205. k = speedcolor[kier1];
  206. szer = 6;
  207. }
  208. var line = new gps_OpenLayers.Geometry.LineString(points);
  209. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  210. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  211. lineFeatures.push(lineFeature);
  212. }
  213. points.length = 0;
  214. if (stop == 2) points.push(pt1);
  215. }
  216.  
  217. points.push(pt2);
  218. pt1 = pt2;
  219. kier1 = kier2;
  220. }
  221. }
  222.  
  223. if (gpx_format >= 0) {
  224. pt1 = null;
  225. pt2 = null;
  226. kier1 = 0;
  227. kier2 = 0;
  228. points.length = 0;
  229. var p = -1;
  230. var pend = str.indexOf("</trkseg");
  231. for (;;) {
  232. p = str.indexOf("<trkpt", p+1);
  233. if (p < 0) break;
  234. if (p > pend) {
  235. if (points.length >= 2) {
  236. var k = kiercolor[kier1];
  237. var szer = 3;
  238. if (speedmode) {
  239. k = speedcolor[kier1];
  240. szer = 6;
  241. }
  242. var line = new gps_OpenLayers.Geometry.LineString(points);
  243. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  244. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  245. lineFeatures.push(lineFeature);
  246. }
  247.  
  248. pt1 = null;
  249. pt2 = null;
  250. kier1 = 0;
  251. kier2 = 0;
  252. points.length = 0;
  253.  
  254. pend = str.indexOf("</trkseg", p+1);
  255. }
  256.  
  257. var s = str.substr(p, 60);
  258. var lat = 0;
  259. var lon = 0;
  260. var plat = s.indexOf('lat="');
  261. var plon = s.indexOf('lon="');
  262. if (plat>=0 && plon>=0) {
  263. lat = parseFloat( s.substr(plat + 5, 10) );
  264. lon = parseFloat( s.substr(plon + 5, 10) );
  265. }
  266.  
  267. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  268. numPoints++;
  269. var angle = 0;
  270. var stop = 0;
  271. var dist = 0;
  272. var speed = 0;
  273. var dt = 0;
  274. if (speedmode) {
  275. var p_speed = str.indexOf("<speed>", p);
  276. var p_time = str.indexOf("<time>", p);
  277. var p_trkend = str.indexOf("</trkpt", p);
  278. if (p_time > p && p_time < p_trkend) {
  279. var s = str.substr(p_time+6, 20);
  280. var rok = parseInt( s.substr(0, 4) );
  281. var mies = parseInt( s.substr(5, 2) );
  282. var dzien = parseInt( s.substr(8, 2) );
  283. var godz = parseInt( s.substr(11, 2) );
  284. var minut = parseInt( s.substr(14, 2) );
  285. var sek = parseInt( s.substr(17, 2) );
  286. time1 = time2;
  287. time2 = (dzien*24*3600) + (godz*3600) + (minut*60) + sek;
  288. dt = Math.abs(time2 - time1);
  289. var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
  290. var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  291. var kmh = (geodist / dt) * 3.6;
  292. speed = parseInt(kmh / 10);
  293. if (speed < 0) speed = 0;
  294. if (speed > 20) speed = 20;
  295. }
  296. else {
  297. if (p_speed > p && p_speed < p_trkend) {
  298. var s = str.substr(p_speed+7, 8);
  299. var kmh = parseFloat(s) * 3.6;
  300. speed = parseInt(kmh / 10);
  301. if (speed < 0) speed = 0;
  302. if (speed > 20) speed = 20;
  303. }
  304. }
  305.  
  306. }
  307. if (pt1 != null && pt2 != null) {
  308. angle = calc_azym(pt1, pt2, kierWidth);
  309. dist = pt1.distanceTo(pt2);
  310. kier2 = parseInt(angle / kierWidth);
  311. if (speedmode) {
  312. kier2 = speed;
  313. if (dist < 5 && kier1<=2 && kier2<=2) continue;
  314. }
  315. else {
  316. if (dist < 5) continue;
  317. }
  318. if (dist > 10000) stop |= 1;
  319. if (kier2 != kier1) stop |= 2;
  320.  
  321. }
  322. //var ptFeature = new OpenLayers.Feature.Vector(pt1, {strokeColor: '#000000', labelText: '', lineWidth: 1 } );
  323. //pointFeatures.push(ptFeature);
  324. if (stop) {
  325. if (points.length >= 2) {
  326. var k = kiercolor[kier1];
  327. var szer = 3;
  328. if (speedmode) {
  329. k = speedcolor[kier1];
  330. szer = 6;
  331. }
  332. var line = new gps_OpenLayers.Geometry.LineString(points);
  333. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  334. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  335. lineFeatures.push(lineFeature);
  336. }
  337. points.length = 0;
  338. if (stop == 2) points.push(pt1);
  339. }
  340.  
  341. points.push(pt2);
  342. pt1 = pt2;
  343. kier1 = kier2;
  344. }
  345. }
  346. if (kml_format1 >= 0) {
  347. pt1 = null;
  348. pt2 = null;
  349. kier1 = 0;
  350. kier2 = 0;
  351. points.length = 0;
  352.  
  353. var p = -1;
  354. var pend = str.indexOf("</gx:Track>");
  355. for(;;) {
  356. p = str.indexOf("<gx:coord>", p+1);
  357. if (p < 0) break;
  358. if (p > pend) {
  359. if (points.length >= 2) {
  360. var k = kiercolor[kier1];
  361. var szer = 3;
  362. if (speedmode) {
  363. k = speedcolor[kier1];
  364. szer = 6;
  365. }
  366. var line = new gps_OpenLayers.Geometry.LineString(points);
  367. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  368. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  369. lineFeatures.push(lineFeature);
  370. }
  371. pt1 = null;
  372. pt2 = null;
  373. kier1 = 0;
  374. kier2 = 0;
  375. points.length = 0;
  376.  
  377. pend = str.indexOf("</gx:Track>", pend + 1);
  378. }
  379. var s = str.substr(p + 10, 30);
  380. var coord = s.split(" ");
  381. var lon = parseFloat( coord[0] );
  382. var lat = parseFloat( coord[1] );
  383. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  384. numPoints++;
  385. var angle = 0;
  386. var stop = 0;
  387. var dist = 0;
  388. var speed = 0;
  389. var dt = 0;
  390. if (pt1 != null && pt2 != null) {
  391. angle = calc_azym(pt1, pt2, kierWidth);
  392. dist = pt1.distanceTo(pt2);
  393. dt = 0;
  394. kier2 = parseInt(angle / kierWidth);
  395. if (speedmode) {
  396. kier2 = 0;
  397. }
  398. else {
  399. if (dist < 5) continue;
  400. }
  401. if (dist > 10000) stop |= 1;
  402. if (dt > 60) stop |= 1;
  403. if (kier2 != kier1) stop |= 2;
  404.  
  405. }
  406. if (stop) {
  407. if (points.length >= 2) {
  408. var k = kiercolor[kier1];
  409. var szer = 3;
  410. if (speedmode) {
  411. k = speedcolor[kier1];
  412. szer = 6;
  413. }
  414. var line = new gps_OpenLayers.Geometry.LineString(points);
  415. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  416. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  417. lineFeatures.push(lineFeature);
  418. }
  419. points.length = 0;
  420. if (stop == 2) points.push(pt1);
  421. }
  422. points.push(pt2);
  423. pt1 = pt2;
  424. kier1 = kier2;
  425. }
  426. }
  427. else if (kml_format2 >= 0) {
  428. pt1 = null;
  429. pt2 = null;
  430. kier1 = 0;
  431. kier2 = 0;
  432. points.length = 0;
  433.  
  434. var p = -1;
  435. for(;;) {
  436. p = str.indexOf("<LineString>", p + 1);
  437. if (p < 0) break;
  438. var block_start = str.indexOf("<coordinates>", p);
  439. var block_end = str.indexOf("</coordinates>", p);
  440. if (block_start>=0 && block_end>=0) {
  441. block_start += 13;
  442. var s = str.substr(block_start, block_end - block_start);
  443. var coords = s.split(" ");
  444. pt1 = null;
  445. pt2 = null;
  446. kier1 = 0;
  447. kier2 = 0;
  448. points.length = 0;
  449. for(var i=0; i<coords.length; i++) {
  450. var xyz = coords[i].split(",");
  451. if (xyz[0]=='' || xyz[1]=='') continue;
  452. var lon = parseFloat(xyz[0]);
  453. var lat = parseFloat(xyz[1]);
  454. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  455. numPoints++;
  456. var angle = 0;
  457. var stop = 0;
  458. var dist = 0;
  459. var speed = 0;
  460. var dt = 0;
  461. if (pt1 != null && pt2 != null) {
  462. angle = calc_azym(pt1, pt2, kierWidth);
  463. dist = pt1.distanceTo(pt2);
  464. dt = Math.abs(time2 - time1);
  465. kier2 = parseInt(angle / kierWidth);
  466. if (speedmode) {
  467. kier2 = 0;
  468. }
  469. else {
  470. if (dist < 5) continue;
  471. }
  472. if (dist > 10000) stop |= 1;
  473. if (dt > 60) stop |= 1;
  474. if (kier2 != kier1) stop |= 2;
  475. }
  476. if (stop) {
  477. if (points.length >= 2) {
  478. var k = kiercolor[kier1];
  479. var szer = 3;
  480. if (speedmode) {
  481. k = speedcolor[kier1];
  482. szer = 6;
  483. }
  484. var line = new gps_OpenLayers.Geometry.LineString(points);
  485. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  486. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  487. lineFeatures.push(lineFeature);
  488. }
  489. points.length = 0;
  490. if (stop == 2) points.push(pt1);
  491. }
  492. points.push(pt2);
  493. pt1 = pt2;
  494. kier1 = kier2;
  495. }
  496. if (points.length >= 2) {
  497. var k = kiercolor[kier1];
  498. var szer = 3;
  499. if (speedmode) {
  500. k = speedcolor[kier1];
  501. szer = 6;
  502. }
  503. var line = new gps_OpenLayers.Geometry.LineString(points);
  504. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  505. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  506. lineFeatures.push(lineFeature);
  507. }
  508. }
  509. }
  510. }
  511. if (points.length >= 2) {
  512. var k = kiercolor[kier1];
  513. var szer = 3;
  514. if (speedmode) {
  515. k = speedcolor[kier1];
  516. szer = 6;
  517. }
  518. var line = new gps_OpenLayers.Geometry.LineString(points);
  519. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  520. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  521. lineFeatures.push(lineFeature);
  522. points.length = 0;
  523. }
  524. if (lineFeatures.length == 0) {
  525. pt1 = null;
  526. pt2 = null;
  527. kier1 = 0;
  528. kier2 = 0;
  529. points.length = 0;
  530. var lines = str.split("\n");
  531. if (lines.length >= 5) {
  532. var l0 = lines[0].split(',');
  533. var l1 = lines[1].split(',');
  534. var l2 = lines[2].split(',');
  535. var l3 = lines[3].split(',');
  536. var l4 = lines[4].split(',');
  537. var s0 = '';
  538. var s1 = '';
  539. var s2 = '';
  540. var s3 = '';
  541. var s4 = '';
  542. if (l0.length >= 2) s0 = l0[1].trim().toUpperCase();
  543. if (l1.length >= 2) s1 = l1[1].trim().toUpperCase();
  544. if (l2.length >= 2) s2 = l2[1].trim().toUpperCase();
  545. if (l3.length >= 2) s3 = l3[1].trim().toUpperCase();
  546. if (l4.length >= 2) s4 = l4[1].trim().toUpperCase();
  547. var len = s0.length + s1.length + s2.length + s3.length + s4.length;
  548. var c0 = s0.charCodeAt(0);
  549. var c1 = s1.charCodeAt(0);
  550. var c2 = s2.charCodeAt(0);
  551. var c3 = s3.charCodeAt(0);
  552. var c4 = s4.charCodeAt(0);
  553. if ( len==5 && s0=="S" && c1>=65 && c1<=90 && c2>=65 && c2<=90 && c3>=65 && c3<=90 && c4>=65 && c4<=90 ) {
  554. for(var i=1; i<lines.length; i++) {
  555. var line = lines[i].split(',');
  556. if (line.length < 5) continue;
  557. var mode = line[1].trim();
  558. if (mode != 'A') { numPoints++; continue; }
  559. var lon = parseInt(line[2].trim()) / 1000000.0;
  560. var lat = parseInt(line[3].trim()) / 1000000.0;
  561. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  562. numPoints++;
  563. time1 = time2;
  564. time2 = parseInt(line[0]);
  565. var angle = 0;
  566. var stop = 0;
  567. var dist = 0;
  568. var speed = 0;
  569. var dt = 0;
  570. if (pt1 != null && pt2 != null) {
  571. angle = calc_azym(pt1, pt2, kierWidth);
  572. dist = pt1.distanceTo(pt2);
  573. dt = Math.abs(time2 - time1);
  574. kier2 = parseInt(angle / kierWidth);
  575. if (speedmode) {
  576. var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
  577. var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  578. var kmh = (geodist / dt) * 3.6;
  579. speed = parseInt(kmh / 10);
  580. if (speed < 0) speed = 0;
  581. if (speed > 20) speed = 20;
  582. kier2 = speed;
  583. if (dist < 5 && kier1<=2 && kier2<=2) continue;
  584. }
  585. else {
  586. if (dist < 5) continue;
  587. }
  588. if (dist > 10000) stop |= 1;
  589. if (dt > 60) stop |= 1;
  590. if (kier2 != kier1) stop |= 2;
  591. }
  592. if (stop) {
  593. if (points.length >= 2) {
  594. var k = kiercolor[kier1];
  595. var szer = 3;
  596. if (speedmode) {
  597. k = speedcolor[kier1];
  598. szer = 6;
  599. }
  600. var line = new gps_OpenLayers.Geometry.LineString(points);
  601. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  602. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  603. lineFeatures.push(lineFeature);
  604. }
  605. points.length = 0; //points = []; //points.splice(0, 99999999);
  606. if (stop == 2) points.push(pt1);
  607. }
  608. points.push(pt2);
  609. pt1 = pt2;
  610. kier1 = kier2;
  611. }
  612. }
  613. }
  614. }
  615. var layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
  616. if(layers.length != 0) {
  617. var gps_layer = layers[0];
  618.  
  619.  
  620. if (lineFeatures.length > 0) gps_layer.addFeatures(lineFeatures);
  621. if (pointFeatures.length > 0) gps_layer.addFeatures(pointFeatures);
  622. // go to the center of added features
  623. if (lineFeatures.length > 0 || pointFeatures.length > 0) {
  624. var bounds = new OpenLayers.Bounds();
  625.  
  626. for (var i = 0; i < lineFeatures.length; ++i) {
  627. var line = lineFeatures[i];
  628. bounds.extend(line.geometry.bounds);
  629. }
  630. for (var i = 0; i < pointFeatures.length; ++i) {
  631. var point = pointFeatures[i];
  632. bounds.extend(point.geometry.bounds);
  633. }
  634.  
  635. var center = bounds.getCenterPixel();
  636. var zoom = unsafeWindow.Waze.map.getZoom();
  637. unsafeWindow.Waze.map.setCenter([center.x, center.y], zoom);
  638. }
  639. }
  640. if (lineFeatures.length > 0) {
  641. obj1.value = '';
  642. gps_num_tracks += 1;
  643. gps_num_points += numPoints;
  644. gps_total_distance += sumDist;
  645. }
  646. obj2.innerHTML = 'Processed '
  647.  
  648. + numPoints + ' point' + (numPoints != 1 ? 's' : '') + ', '
  649. + parseInt(sumDist/10) / 100 + ' km';
  650. updateSummary();
  651. }
  652. //---------------------------------------------------------------------------------------
  653. function gps_clear()
  654. {
  655. var gps_wazeMap = unsafeWindow.Waze.map;
  656.  
  657. var layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
  658. if(layers.length != 0) {
  659. var gps_layer = layers[0];
  660. gps_layer.removeAllFeatures();
  661. }
  662. gps_num_tracks = 0;
  663. gps_num_points = 0;
  664. gps_total_distance = 0;
  665. updateSummary();
  666. }
  667. //---------------------------------------------------------------------------------------
  668. function updateSummary() {
  669. var msg = '';
  670. var clear_display = 'inline';
  671. if (gps_num_tracks == 0) {
  672. msg = 'No tracks';
  673. clear_display = 'none';
  674. } else {
  675. msg = gps_num_tracks + ' track' + (gps_num_tracks != 1 ? 's' : '') + ', '
  676. + gps_num_points + ' point' + (gps_num_points != 1 ? 's' : '') + ', '
  677. + parseInt(gps_total_distance/10) / 100 + 'km';
  678. }
  679. document.getElementById('wme_gps_layer_summary').innerHTML = msg;
  680. document.getElementById("wme_gps_layer_clear_button").style.display = clear_display;
  681. }
  682. //---------------------------------------------------------------------------------------
  683. function Draw_WME_GPS_Track()
  684. {
  685. if(document.getElementById('wme_gps_layer') == null) {
  686. var cnt = '';
  687. cnt += '<br><div id="wme_gps_layer" style="color:#000000; ">';
  688. cnt += '<b>GPS Track View:</b>';
  689. cnt += '<textarea id="wme_gps_layer_content" style="font-family: Tahoma; font-size:9px; min-width:270px; max-width:270px; width:270px; min-height:100px; height: 100px; " ';
  690. cnt += 'placeholder="Paste a GPS track (nmea, gpx, kml, gps.csv) here..." ></textarea>';
  691. cnt += '<br>';
  692. cnt += '</div>';
  693.  
  694. var add_btn = $('<button id="wme_gps_layer_add_button" title="" >Add track</button>');
  695. add_btn.click(gps_parse);
  696.  
  697. var clear_btn = $('<button id="wme_gps_layer_clear_button" title="" style="display:none;" >Clear tracks</button>');
  698. clear_btn.click(gps_clear);
  699. var spd = '&nbsp;&nbsp;&nbsp;<input id="wme_gps_layer_speed" type="checkbox" title="Colour GPS tracks by speed" ><span style="font-family: Tahoma; font-size:9px; position:relative; top:-3px;"> Speed</span>';
  700.  
  701. var info = '<p style="font-family: Tahoma; font-size:9px; color:#808080; " id="wme_gps_layer_info" ></p>';
  702.  
  703. var summary = '<p id="wme_gps_layer_summary" ></p>';
  704.  
  705. $("#sidepanel-drives").append(cnt);
  706. $("#sidepanel-drives").append(add_btn);
  707. $("#sidepanel-drives").append(spd);
  708. $("#sidepanel-drives").append(info);
  709. $("#sidepanel-drives").append(summary);
  710. $("#sidepanel-drives").append(clear_btn);
  711.  
  712. updateSummary();
  713. return;
  714. }
  715.  
  716. var gps_wazeMap = unsafeWindow.Waze.map;
  717. var gps_wazeModel = unsafeWindow.Waze.model;
  718. var gps_OpenLayers = unsafeWindow.OpenLayers;
  719.  
  720. if (gps_wazeMap == null) return;
  721. if (gps_wazeModel == null) return;
  722. if (gps_OpenLayers == null) return;
  723.  
  724. var layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
  725. if(layers.length == 0) {
  726. var gps_style = new gps_OpenLayers.Style({
  727. strokeDashstyle: 'solid',
  728. strokeColor : "${strokeColor}",
  729. strokeOpacity: 1.0,
  730. strokeWidth: "${lineWidth}",
  731. //strokeLinecap: 'square',
  732. fillColor: '#000000',
  733. fillOpacity: 1.0,
  734. pointRadius: 2,
  735. fontWeight: "normal",
  736. label : "${labelText}",
  737. fontFamily: "Tahoma, Courier New",
  738. labelOutlineColor: "#FFFFFF",
  739. labelOutlineWidth: 2,
  740. fontColor: '#000000',
  741. fontSize: "10px"
  742. });
  743.  
  744. var gps_mapLayer = new gps_OpenLayers.Layer.Vector("GPS Track View", {
  745. displayInLayerSwitcher: true,
  746. uniqueName: "__WME_GPS_Track",
  747. styleMap: new gps_OpenLayers.StyleMap(gps_style)
  748. });
  749. I18n.translations.en.layers.name["__WME_GPS_Track"] = "GPS Track View";
  750. gps_wazeMap.addLayer(gps_mapLayer);
  751. gps_mapLayer.setVisibility(true);
  752. return;
  753. }
  754. }
  755. //---------------------------------------------------------------------------------------
  756. bootstrap_WME_GPS_Track();