WME GPS Track View

Draws and visualizes custom GPS tracks in Waze Map Editor

  1. // ==UserScript==
  2. // @name WME GPS Track View
  3. // @namespace https://greatest.deepsurf.us/en/scripts/40455-wme-gps-track-view
  4. // @description Draws and visualizes custom GPS tracks in Waze Map Editor
  5. // @match https://www.waze.com/editor*
  6. // @match https://www.waze.com/*/editor*
  7. // @match https://beta.waze.com*
  8. // @exclude https://www.waze.com/user*
  9. // @require https://greatest.deepsurf.us/scripts/24851-wazewrap/code/WazeWrap.js
  10. // @version 2023.04.03
  11. // @grant none
  12. // @copyright 2014 wlodek76 / 2017 JustinS83
  13. // ==/UserScript==
  14.  
  15. var gps_wazeMap;
  16. var gps_wazeModel;
  17. var gps_OpenLayers;
  18.  
  19. //---------------------------------------------------------------------------------------
  20. function bootstrap_WME_GPS_Track(tries) {
  21. tries = tries || 1;
  22.  
  23. if (W &&
  24. W.map &&
  25. W.model &&
  26. W.loginManager.user &&
  27. $ && OL) {
  28. Draw_WME_GPS_Track();
  29. } else if (tries < 1000) {
  30. setTimeout(function () {bootstrap_WME_GPS_Track(tries++);}, 400);
  31. }
  32. }
  33.  
  34. //---------------------------------------------------------------------------------------
  35. function min_to_deg(v)
  36. {
  37. var fmin = parseFloat(v) * 0.01;
  38. var fdeg = parseInt(fmin);
  39. fmin -= fdeg;
  40. return (fdeg + fmin * 1.66666666666666666);
  41. }
  42. //---------------------------------------------------------------------------------------
  43. function calc_azym(pt1, pt2, kierWidth)
  44. {
  45. var dx = pt2.x - pt1.x;
  46. var dy = pt2.y - pt1.y;
  47. var azym = (Math.atan2(dx, dy) * 180.0 / Math.PI);
  48. if (azym > 360) azym -= 360;
  49. if (azym < 0) azym += 360;
  50. return azym;
  51. }
  52. //---------------------------------------------------------------------------------------
  53. function gps_parse()
  54. {
  55. var obj1 = document.getElementById('wme_gps_layer_content');
  56. var obj2 = document.getElementById('wme_gps_layer_summary');
  57. var obj3 = document.getElementById('wme_gps_layer_speed');
  58. var obj4 = document.getElementById('wme_layer_polygon');
  59.  
  60. if (obj1 === null) return;
  61. if (obj2 === null) return;
  62. if (obj3 === null) return;
  63. if (obj4 === null) return;
  64.  
  65. var str = obj1.value;
  66. var speedmode = obj3.checked;
  67. var fillPolygon = obj4.checked;
  68.  
  69. points = [];
  70. lineFeatures = [];
  71. pointFeatures = [];
  72.  
  73. var proj1 = new OpenLayers.Projection('EPSG:4326');
  74. var proj2 = gps_wazeMap.getProjectionObject();
  75.  
  76. var time1 = 0;
  77. var time2 = 0;
  78.  
  79. var pt1 = null;
  80. var pt2 = null;
  81.  
  82. var kier1 = 0;
  83. var kier2 = 0;
  84. var kiercolor = new Array();
  85. var speedcolor = new Array();
  86.  
  87. kiercolor.push('#ff0000');
  88. kiercolor.push('#00ff40');
  89. kiercolor.push('#00ff40');
  90. kiercolor.push('#0000ff');
  91. kiercolor.push('#0000ff');
  92. kiercolor.push('#fff000');
  93. kiercolor.push('#fff000');
  94. kiercolor.push('#ff0000');
  95.  
  96. speedcolor[0] = '#000000';
  97. speedcolor[1] = '#505060';
  98. speedcolor[2] = '#b0b0c0';
  99. speedcolor[3] = '#FFFF00';
  100. speedcolor[4] = '#68fdda';
  101. speedcolor[5] = '#00d508';
  102. speedcolor[6] = '#f68400';
  103. speedcolor[7] = '#8e3f04';
  104. speedcolor[8] = '#ff525a';
  105. speedcolor[9] = '#e00000';
  106. speedcolor[10] = '#2594fb';
  107. speedcolor[11] = '#0500c9';
  108. speedcolor[12] = '#fa00e4';
  109. speedcolor[13] = '#68008d';
  110. speedcolor[14] = '#370143';
  111. speedcolor[15] = '#370143';
  112. speedcolor[16] = '#370143';
  113. speedcolor[17] = '#370143';
  114. speedcolor[18] = '#370143';
  115. speedcolor[19] = '#370143';
  116. speedcolor[20] = '#370143';
  117.  
  118. var kierWidth = 360 / kiercolor.length;
  119. kiercolor.push(kiercolor[0]);
  120.  
  121. var nmea_format = str.indexOf("$GPGGA");
  122. var gpx_format = str.indexOf("<trkpt");
  123. var kml_format1 = str.indexOf("<gx:coord>");
  124. var kml_format2 = str.indexOf("<LineString>");
  125.  
  126. if (typeof String.prototype.startsWith != 'function') {
  127. // see below for better implementation!
  128. String.prototype.startsWith = function (str){
  129. return this.indexOf(str) === 0;
  130. };
  131. }
  132.  
  133. str.trim();
  134. var is_polygon = str.startsWith("POLYGON");
  135.  
  136. if (is_polygon) {
  137. var opacity = 0.0;
  138.  
  139. if (fillPolygon) {
  140. opacity = 0.3;
  141. }
  142.  
  143. var aStyle = new gps_OpenLayers.Style({
  144. strokeDashstyle: 'solid',
  145. strokeColor : "#ff0000",
  146. strokeOpacity: 1.0,
  147. strokeWidth: 4,
  148. //strokeLinecap: 'square',
  149. fillColor: '#ff0000',
  150. fillOpacity: opacity
  151. });
  152.  
  153.  
  154. var wkt = new OpenLayers.Format.WKT();
  155. var polygonFeature = wkt.read(str);
  156. polygonFeature.geometry.transform(gps_wazeMap.displayProjection, gps_wazeMap.getProjectionObject());
  157. // polygonFeature.style = aStyle;
  158.  
  159.  
  160. var layers = gps_wazeMap.getLayersBy("uniqueName","__Polygon_View");
  161. // layers.styleMap = new gps_OpenLayers.StyleMap(aStyle);
  162. if(layers.length !== 0) {
  163.  
  164. var gps_layer = layers[0];
  165. gps_layer.styleMap = new gps_OpenLayers.StyleMap(aStyle);
  166. gps_layer.addFeatures([polygonFeature]);
  167. }
  168. return;
  169. }
  170.  
  171. var numPoints = 0;
  172. var sumDist = 0;
  173.  
  174. if (nmea_format >= 0) {
  175.  
  176. pt1 = null;
  177. pt2 = null;
  178. kier1 = 0;
  179. kier2 = 0;
  180. points.length = 0;
  181.  
  182. var p = -1;
  183. for(;;) {
  184. p = str.indexOf("$GPGGA", p+1);
  185. if (p < 0) break;
  186.  
  187. var s = str.substr(p, 80);
  188. var d = s.split(",");
  189.  
  190. var lat = min_to_deg(d[2]);
  191. var lon = min_to_deg(d[4]);
  192. if (d[3] == 'S') lat = -lat;
  193. if (d[5] == 'W') lon = -lon;
  194.  
  195. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  196. numPoints++;
  197.  
  198. time1 = time2;
  199. time2 = parseInt(d[1]);
  200. var s = time2 % 100;
  201. time2 = (time2 - s) / 100;
  202. var m = time2 % 100;
  203. time2 = (time2 - m) / 100;
  204. var g = time2 % 100;
  205. time2 = (g*3600) + (m*60) + s;
  206.  
  207. var angle = 0;
  208. var stop = 0;
  209. var dist = 0;
  210. var speed = 0;
  211. var dt = 0;
  212.  
  213. if (pt1 !== null && pt2 !== null) {
  214. angle = calc_azym(pt1, pt2, kierWidth);
  215. dist = pt1.distanceTo(pt2);
  216. dt = Math.abs(time2 - time1);
  217.  
  218. kier2 = parseInt(angle / kierWidth);
  219.  
  220. if (speedmode) {
  221. var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
  222. var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  223.  
  224. var kmh = (geodist / dt) * 3.6;
  225. speed = parseInt(kmh / 10);
  226. if (speed < 0) speed = 0;
  227. if (speed > 20) speed = 20;
  228. kier2 = speed;
  229. if (dist < 5 && kier1<=2 && kier2<=2) continue;
  230. }
  231. else {
  232. if (dist < 5) continue;
  233. }
  234.  
  235. if (dist > 10000) stop |= 1;
  236. if (dt > 60) stop |= 1;
  237. if (kier2 != kier1) stop |= 2;
  238.  
  239. }
  240.  
  241. //var ptFeature = new OpenLayers.Feature.Vector(pt1, {strokeColor: '#000000', labelText: '', lineWidth: 1 } );
  242. //pointFeatures.push(ptFeature);
  243.  
  244. if (stop) {
  245. if (points.length >= 2) {
  246. var k = kiercolor[kier1];
  247. var szer = 3;
  248.  
  249. if (speedmode) {
  250. k = speedcolor[kier1];
  251. szer = 6;
  252. }
  253.  
  254. var line = new gps_OpenLayers.Geometry.LineString(points);
  255. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  256. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  257. lineFeatures.push(lineFeature);
  258. }
  259. points.length = 0;
  260.  
  261. if (stop == 2) points.push(pt1);
  262. }
  263.  
  264. points.push(pt2);
  265. pt1 = pt2;
  266. kier1 = kier2;
  267. }
  268. }
  269.  
  270.  
  271. if (gpx_format >= 0) {
  272.  
  273. pt1 = null;
  274. pt2 = null;
  275. kier1 = 0;
  276. kier2 = 0;
  277. points.length = 0;
  278.  
  279. var p = -1;
  280. var pend = str.indexOf("</trkseg");
  281. for (;;) {
  282. p = str.indexOf("<trkpt", p+1);
  283. if (p < 0) break;
  284.  
  285. if (p > pend) {
  286. if (points.length >= 2) {
  287. var k = kiercolor[kier1];
  288. var szer = 3;
  289.  
  290. if (speedmode) {
  291. k = speedcolor[kier1];
  292. szer = 6;
  293. }
  294.  
  295. var line = new gps_OpenLayers.Geometry.LineString(points);
  296. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  297. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  298. lineFeatures.push(lineFeature);
  299. }
  300.  
  301. pt1 = null;
  302. pt2 = null;
  303. kier1 = 0;
  304. kier2 = 0;
  305. points.length = 0;
  306.  
  307. pend = str.indexOf("</trkseg", p+1);
  308. }
  309.  
  310. var s = str.substr(p, 60);
  311.  
  312. var lat = 0;
  313. var lon = 0;
  314. var plat = s.indexOf('lat="');
  315. var plon = s.indexOf('lon="');
  316. if (plat>=0 && plon>=0) {
  317. lat = parseFloat( s.substr(plat + 5, 10) );
  318. lon = parseFloat( s.substr(plon + 5, 10) );
  319. }
  320.  
  321. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  322. numPoints++;
  323.  
  324. var angle = 0;
  325. var stop = 0;
  326. var dist = 0;
  327. var speed = 0;
  328. var dt = 0;
  329.  
  330. if (speedmode) {
  331. var p_speed = str.indexOf("<speed>", p);
  332. var p_time = str.indexOf("<time>", p);
  333. var p_trkend = str.indexOf("</trkpt", p);
  334.  
  335. if (p_time > p && p_time < p_trkend) {
  336. var s = str.substr(p_time+6, 20);
  337. var rok = parseInt( s.substr(0, 4) );
  338. var mies = parseInt( s.substr(5, 2) );
  339. var dzien = parseInt( s.substr(8, 2) );
  340. var godz = parseInt( s.substr(11, 2) );
  341. var minut = parseInt( s.substr(14, 2) );
  342. var sek = parseInt( s.substr(17, 2) );
  343.  
  344. time1 = time2;
  345. time2 = (dzien*24*3600) + (godz*3600) + (minut*60) + sek;
  346. dt = Math.abs(time2 - time1);
  347.  
  348. var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
  349. var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  350.  
  351. var kmh = (geodist / dt) * 3.6;
  352. speed = parseInt(kmh / 10);
  353. if (speed < 0) speed = 0;
  354. if (speed > 20) speed = 20;
  355. }
  356. else {
  357. if (p_speed > p && p_speed < p_trkend) {
  358. var s = str.substr(p_speed+7, 8);
  359. var kmh = parseFloat(s) * 3.6;
  360. speed = parseInt(kmh / 10);
  361. if (speed < 0) speed = 0;
  362. if (speed > 20) speed = 20;
  363. }
  364. }
  365. }
  366.  
  367. if (pt1 !== null && pt2 !== null) {
  368. angle = calc_azym(pt1, pt2, kierWidth);
  369. dist = pt1.distanceTo(pt2);
  370.  
  371. kier2 = parseInt(angle / kierWidth);
  372.  
  373. if (speedmode) {
  374. kier2 = speed;
  375. if (dist < 5 && kier1<=2 && kier2<=2) continue;
  376. }
  377. else {
  378. if (dist < 5) continue;
  379. }
  380.  
  381. if (dist > 10000) stop |= 1;
  382. if (kier2 != kier1) stop |= 2;
  383.  
  384. }
  385.  
  386. //var ptFeature = new OpenLayers.Feature.Vector(pt1, {strokeColor: '#000000', labelText: '', lineWidth: 1 } );
  387. //pointFeatures.push(ptFeature);
  388.  
  389. if (stop) {
  390. if (points.length >= 2) {
  391. var k = kiercolor[kier1];
  392. var szer = 3;
  393.  
  394. if (speedmode) {
  395. k = speedcolor[kier1];
  396. szer = 6;
  397. }
  398.  
  399. var line = new gps_OpenLayers.Geometry.LineString(points);
  400. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  401. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  402. lineFeatures.push(lineFeature);
  403. }
  404. points.length = 0;
  405.  
  406. if (stop == 2) points.push(pt1);
  407. }
  408.  
  409. points.push(pt2);
  410. pt1 = pt2;
  411. kier1 = kier2;
  412. }
  413. }
  414.  
  415.  
  416. if (kml_format1 >= 0) {
  417.  
  418. pt1 = null;
  419. pt2 = null;
  420. kier1 = 0;
  421. kier2 = 0;
  422. points.length = 0;
  423.  
  424. var p = -1;
  425. var pend = str.indexOf("</gx:Track>");
  426.  
  427. for(;;) {
  428. p = str.indexOf("<gx:coord>", p+1);
  429. if (p < 0) break;
  430.  
  431. if (p > pend) {
  432. if (points.length >= 2) {
  433. var k = kiercolor[kier1];
  434. var szer = 3;
  435.  
  436. if (speedmode) {
  437. k = speedcolor[kier1];
  438. szer = 6;
  439. }
  440.  
  441. var line = new gps_OpenLayers.Geometry.LineString(points);
  442. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  443. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  444. lineFeatures.push(lineFeature);
  445. }
  446. pt1 = null;
  447. pt2 = null;
  448. kier1 = 0;
  449. kier2 = 0;
  450. points.length = 0;
  451.  
  452. pend = str.indexOf("</gx:Track>", pend + 1);
  453. }
  454.  
  455. var s = str.substr(p + 10, 30);
  456. var coord = s.split(" ");
  457.  
  458. var lon = parseFloat( coord[0] );
  459. var lat = parseFloat( coord[1] );
  460.  
  461. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  462. numPoints++;
  463.  
  464. var angle = 0;
  465. var stop = 0;
  466. var dist = 0;
  467. var speed = 0;
  468. var dt = 0;
  469.  
  470. if (pt1 !== null && pt2 !== null) {
  471. angle = calc_azym(pt1, pt2, kierWidth);
  472. dist = pt1.distanceTo(pt2);
  473. dt = 0;
  474.  
  475. kier2 = parseInt(angle / kierWidth);
  476.  
  477. if (speedmode) {
  478. kier2 = 0;
  479. }
  480. else {
  481. if (dist < 5) continue;
  482. }
  483.  
  484. if (dist > 10000) stop |= 1;
  485. if (dt > 60) stop |= 1;
  486. if (kier2 != kier1) stop |= 2;
  487.  
  488. }
  489.  
  490.  
  491. if (stop) {
  492. if (points.length >= 2) {
  493. var k = kiercolor[kier1];
  494. var szer = 3;
  495. if (speedmode) {
  496. k = speedcolor[kier1];
  497. szer = 6;
  498. }
  499.  
  500. var line = new gps_OpenLayers.Geometry.LineString(points);
  501. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  502. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  503. lineFeatures.push(lineFeature);
  504. }
  505. points.length = 0;
  506.  
  507. if (stop == 2) points.push(pt1);
  508. }
  509.  
  510. points.push(pt2);
  511. pt1 = pt2;
  512. kier1 = kier2;
  513. }
  514. }
  515.  
  516. else if (kml_format2 >= 0) {
  517. pt1 = null;
  518. pt2 = null;
  519. kier1 = 0;
  520. kier2 = 0;
  521. points.length = 0;
  522.  
  523. var p = -1;
  524.  
  525. for(;;) {
  526. p = str.indexOf("<LineString>", p + 1);
  527. if (p < 0) break;
  528.  
  529. var block_start = str.indexOf("<coordinates>", p);
  530. var block_end = str.indexOf("</coordinates>", p);
  531.  
  532. if (block_start>=0 && block_end>=0) {
  533.  
  534. block_start += 13;
  535. var s = str.substr(block_start, block_end - block_start);
  536. var coords = s.match(/\S+/g);
  537.  
  538. pt1 = null;
  539. pt2 = null;
  540. kier1 = 0;
  541. kier2 = 0;
  542. points.length = 0;
  543.  
  544. for(var i=0; i<coords.length; i++) {
  545.  
  546. var xyz = coords[i].split(",");
  547. if (xyz[0]==='' || xyz[1]==='') continue;
  548. var lon = parseFloat(xyz[0]);
  549. var lat = parseFloat(xyz[1]);
  550.  
  551. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  552. numPoints++;
  553.  
  554. var angle = 0;
  555. var stop = 0;
  556. var dist = 0;
  557. var speed = 0;
  558. var dt = 0;
  559.  
  560. if (pt1 !== null && pt2 !== null) {
  561. angle = calc_azym(pt1, pt2, kierWidth);
  562. dist = pt1.distanceTo(pt2);
  563. dt = Math.abs(time2 - time1);
  564.  
  565. kier2 = parseInt(angle / kierWidth);
  566.  
  567. if (speedmode) {
  568. kier2 = 0;
  569. }
  570. else {
  571. if (dist < 5) continue;
  572. }
  573.  
  574. if (dist > 10000) stop |= 1;
  575. if (dt > 60) stop |= 1;
  576. if (kier2 != kier1) stop |= 2;
  577.  
  578. }
  579.  
  580.  
  581.  
  582.  
  583. if (stop) {
  584. if (points.length >= 2) {
  585. var k = kiercolor[kier1];
  586. var szer = 3;
  587.  
  588. if (speedmode) {
  589. k = speedcolor[kier1];
  590. szer = 6;
  591. }
  592.  
  593. var line = new gps_OpenLayers.Geometry.LineString(points);
  594. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  595. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  596. lineFeatures.push(lineFeature);
  597. }
  598. points.length = 0;
  599.  
  600. if (stop == 2) points.push(pt1);
  601. }
  602.  
  603. points.push(pt2);
  604. pt1 = pt2;
  605. kier1 = kier2;
  606.  
  607. }
  608.  
  609. if (points.length >= 2) {
  610. var k = kiercolor[kier1];
  611. var szer = 3;
  612.  
  613. if (speedmode) {
  614. k = speedcolor[kier1];
  615. szer = 6;
  616. }
  617.  
  618. var line = new gps_OpenLayers.Geometry.LineString(points);
  619. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  620. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  621. lineFeatures.push(lineFeature);
  622. }
  623.  
  624.  
  625. }
  626. }
  627. }
  628.  
  629.  
  630. if (points.length >= 2) {
  631. var k = kiercolor[kier1];
  632. var szer = 3;
  633.  
  634. if (speedmode) {
  635. k = speedcolor[kier1];
  636. szer = 6;
  637. }
  638.  
  639. var line = new gps_OpenLayers.Geometry.LineString(points);
  640. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  641. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  642. lineFeatures.push(lineFeature);
  643. points.length = 0;
  644. }
  645.  
  646.  
  647. if (lineFeatures.length === 0) {
  648.  
  649. pt1 = null;
  650. pt2 = null;
  651. kier1 = 0;
  652. kier2 = 0;
  653. points.length = 0;
  654.  
  655. var lines = str.split("\n");
  656.  
  657. if (lines.length >= 5) {
  658. var l0 = lines[0].split(',');
  659. var l1 = lines[1].split(',');
  660. var l2 = lines[2].split(',');
  661. var l3 = lines[3].split(',');
  662. var l4 = lines[4].split(',');
  663. var s0 = '';
  664. var s1 = '';
  665. var s2 = '';
  666. var s3 = '';
  667. var s4 = '';
  668. if (l0.length >= 2) s0 = l0[1].trim().toUpperCase();
  669. if (l1.length >= 2) s1 = l1[1].trim().toUpperCase();
  670. if (l2.length >= 2) s2 = l2[1].trim().toUpperCase();
  671. if (l3.length >= 2) s3 = l3[1].trim().toUpperCase();
  672. if (l4.length >= 2) s4 = l4[1].trim().toUpperCase();
  673. var len = s0.length + s1.length + s2.length + s3.length + s4.length;
  674. var c0 = s0.charCodeAt(0);
  675. var c1 = s1.charCodeAt(0);
  676. var c2 = s2.charCodeAt(0);
  677. var c3 = s3.charCodeAt(0);
  678. var c4 = s4.charCodeAt(0);
  679.  
  680. if ( len==5 && s0=="S" && c1>=65 && c1<=90 && c2>=65 && c2<=90 && c3>=65 && c3<=90 && c4>=65 && c4<=90 ) {
  681.  
  682. for(var i=1; i<lines.length; i++) {
  683.  
  684. var line = lines[i].split(',');
  685. if (line.length < 5) continue;
  686.  
  687. var mode = line[1].trim();
  688.  
  689. if (mode != 'A') { numPoints++; continue; }
  690.  
  691. var lon = parseInt(line[2].trim()) / 1000000.0;
  692. var lat = parseInt(line[3].trim()) / 1000000.0;
  693.  
  694. var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
  695. numPoints++;
  696.  
  697. time1 = time2;
  698. time2 = parseInt(line[0]);
  699.  
  700. var angle = 0;
  701. var stop = 0;
  702. var dist = 0;
  703. var speed = 0;
  704. var dt = 0;
  705.  
  706. if (pt1 !== null && pt2 !== null) {
  707. angle = calc_azym(pt1, pt2, kierWidth);
  708. dist = pt1.distanceTo(pt2);
  709. dt = Math.abs(time2 - time1);
  710.  
  711. kier2 = parseInt(angle / kierWidth);
  712.  
  713. if (speedmode) {
  714. var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
  715. var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  716.  
  717. var kmh = (geodist / dt) * 3.6;
  718. speed = parseInt(kmh / 10);
  719. alert("kmh "+ kmh + "\nspeed: speed");
  720. if (speed < 0) speed = 0;
  721. if (speed > 20) speed = 20;
  722. kier2 = speed;
  723. if (dist < 5 && kier1<=2 && kier2<=2) continue;
  724. }
  725. else {
  726. if (dist < 5) continue;
  727. }
  728.  
  729. if (dist > 10000) stop |= 1;
  730. if (dt > 60) stop |= 1;
  731. if (kier2 != kier1) stop |= 2;
  732. }
  733.  
  734.  
  735. if (stop) {
  736. if (points.length >= 2) {
  737. var k = kiercolor[kier1];
  738. var szer = 3;
  739.  
  740. if (speedmode) {
  741. k = speedcolor[kier1];
  742. szer = 6;
  743. }
  744.  
  745. var line = new gps_OpenLayers.Geometry.LineString(points);
  746. sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
  747. var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
  748. lineFeatures.push(lineFeature);
  749. }
  750. points.length = 0; //points = []; //points.splice(0, 99999999);
  751.  
  752. if (stop == 2) points.push(pt1);
  753. }
  754.  
  755. points.push(pt2);
  756. pt1 = pt2;
  757.  
  758. }
  759. }
  760.  
  761. }
  762. }
  763.  
  764.  
  765.  
  766. var layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
  767. if(layers.length !== 0) {
  768.  
  769. var gps_layer = layers[0];
  770. if (lineFeatures.length > 0) gps_layer.addFeatures(lineFeatures);
  771. if (pointFeatures.length > 0) gps_layer.addFeatures(pointFeatures);
  772. }
  773.  
  774. if (lineFeatures.length > 0) {
  775. obj1.value = '';
  776. }
  777. obj2.innerHTML = 'Processed: ' + '\n';
  778. obj2.innerHTML += numPoints + ' points, ';
  779. obj2.innerHTML += parseInt(sumDist/10) / 100 + ' km.';
  780. }
  781.  
  782. function clear_layers()
  783. {
  784. let layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
  785. if(layers.length !== 0) {
  786.  
  787. var gps_layer = layers[0];
  788.  
  789. gps_layer.removeAllFeatures();
  790. }
  791.  
  792. layers = gps_wazeMap.getLayersBy("uniqueName","__Polygon_View");
  793. // layers.styleMap = new gps_OpenLayers.StyleMap(aStyle);
  794. if(layers.length !== 0) {
  795.  
  796. var gps_layer = layers[0];
  797. gps_layer.removeAllFeatures();
  798. }
  799.  
  800. }
  801. //---------------------------------------------------------------------------------------
  802. function Draw_WME_GPS_Track()
  803. {
  804. gps_wazeMap = W.map;
  805. gps_wazeModel = W.model;
  806. gps_OpenLayers = OpenLayers;
  807.  
  808. var layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
  809. if(layers.length === 0) {
  810. var gps_style = new gps_OpenLayers.Style({
  811. strokeDashstyle: 'solid',
  812. strokeColor : "${strokeColor}",
  813. strokeOpacity: 1.0,
  814. strokeWidth: "${lineWidth}",
  815. //strokeLinecap: 'square',
  816. fillColor: '#000000',
  817. fillOpacity: 1.0,
  818. pointRadius: 2,
  819. fontWeight: "normal",
  820. label : "${labelText}",
  821. fontFamily: "Tahoma, Courier New",
  822. labelOutlineColor: "#FFFFFF",
  823. labelOutlineWidth: 2,
  824. fontColor: '#000000',
  825. fontSize: "10px"
  826. });
  827.  
  828. var gps_mapLayer = new gps_OpenLayers.Layer.Vector("GPS Track View", {
  829. displayInLayerSwitcher: true,
  830. uniqueName: "__WME_GPS_Track",
  831. styleMap: new gps_OpenLayers.StyleMap(gps_style)
  832. });
  833.  
  834. I18n.translations[I18n.currentLocale()].layers.name["__WME_GPS_Track"] = "GPS Track View";
  835. gps_wazeMap.addLayer(gps_mapLayer);
  836. gps_mapLayer.setVisibility(true);
  837.  
  838. var polygon_mapLayer = new gps_OpenLayers.Layer.Vector("Polygon View", {
  839. displayInLayerSwitcher: true,
  840. uniqueName: "__Polygon_View"
  841. // styleMap: new gps_OpenLayers.StyleMap(gps_style)
  842. });
  843.  
  844. I18n.translations[I18n.currentLocale()].layers.name["__Polygon_View"] = "Polygon View";
  845. gps_wazeMap.addLayer(polygon_mapLayer);
  846. polygon_mapLayer.setVisibility(true);
  847.  
  848. var cnt = '';
  849. cnt += '<br><div id="wme_gps_layer" style="color:#000000; ">';
  850. cnt += '<b>GPS Track View:</b>';
  851. 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; " ';
  852. cnt += 'placeholder="Paste a gps track (nmea, gpx, kml, gps.csv) or a polygon (WKT format) here..." ></textarea>';
  853. cnt += '<br>';
  854. cnt += '</div>';
  855.  
  856. var btn = $('<button id="wme_gps_layer_button" title="" >Add feature</button>');
  857. //btn.click(gps_parse);
  858.  
  859. 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>';
  860. var follPolygon = '&nbsp;&nbsp;&nbsp;<input id="wme_layer_polygon" type="checkbox" checked title="Color fill Polygon" ><span style="font-family: Tahoma; font-size:9px; position:relative; top:-3px;"> Color fill polygon</span>';
  861.  
  862. var btnClear = $('<button id="wme_clear_layers_button" title="" >Clear</button>');
  863. //btnClear.click(clear_layers);
  864.  
  865. var info = '<p style="font-family: Tahoma; font-size:9px; color:#808080; " id="wme_gps_layer_summary" ></p>';
  866.  
  867. let $tab = $("<div>", {style:"padding:8px 16px", id:"WMEGPSTrackViewSettings"});
  868. $tab.append(cnt);
  869. $tab.append(btn);
  870. $tab.append(spd);
  871. $tab.append(follPolygon);
  872. $tab.append("<br>");
  873. $tab.append(btnClear);
  874. $tab.append(info);
  875. new WazeWrap.Interface.Tab('GPS', $tab.html(), hookClickEvents);
  876. //new WazeWrap.Interface.Tab('<span class="fa fa-map-o"></span>', $tab.html());
  877. /*$("#sidepanel-drives").append(cnt);
  878. $("#sidepanel-drives").append(btn);
  879. $("#sidepanel-drives").append(spd);
  880. $("#sidepanel-drives").append(follPolygon);
  881. $("#sidepanel-drives").append("<br>");
  882. $("#sidepanel-drives").append(btnClear);
  883. $("#sidepanel-drives").append(info);*/
  884.  
  885.  
  886. function hookClickEvents(){
  887. $('#wme_clear_layers_button').click(clear_layers);
  888. $('#wme_gps_layer_button').click(gps_parse);
  889. }
  890.  
  891.  
  892. }
  893.  
  894. }
  895. //---------------------------------------------------------------------------------------
  896. bootstrap_WME_GPS_Track();