WME GPS Track View

Draws and visualizes custom GPS tracks in Waze Map Editor

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name                WME GPS Track View
// @namespace           https://greasyfork.org/en/scripts/40455-wme-gps-track-view
// @description         Draws and visualizes custom GPS tracks in Waze Map Editor
// @match               https://www.waze.com/editor*
// @match               https://www.waze.com/*/editor*
// @match               https://beta.waze.com*
// @exclude             https://www.waze.com/user*
// @require             https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
// @version             2023.04.03
// @grant               none
// @copyright           2014 wlodek76 / 2017 JustinS83
// ==/UserScript==

var gps_wazeMap;
var gps_wazeModel;
var gps_OpenLayers;

//---------------------------------------------------------------------------------------
function bootstrap_WME_GPS_Track(tries) {
    tries = tries || 1;

    if (W &&
        W.map &&
        W.model &&
        W.loginManager.user &&
        $ && OL) {
        Draw_WME_GPS_Track();
    } else if (tries < 1000) {
        setTimeout(function () {bootstrap_WME_GPS_Track(tries++);}, 400);
    }
}

//---------------------------------------------------------------------------------------
function min_to_deg(v)
{
    var fmin = parseFloat(v) * 0.01;
    var fdeg = parseInt(fmin);
    fmin -= fdeg;
    return (fdeg + fmin * 1.66666666666666666);
}
//---------------------------------------------------------------------------------------
function calc_azym(pt1, pt2, kierWidth)
{
    var dx = pt2.x - pt1.x;
    var dy = pt2.y - pt1.y;
    var azym = (Math.atan2(dx, dy) * 180.0 / Math.PI);
    if (azym > 360) azym -= 360;
    if (azym < 0)   azym += 360;
    return azym;
}
//---------------------------------------------------------------------------------------
function gps_parse()
{
    var obj1 = document.getElementById('wme_gps_layer_content');
    var obj2 = document.getElementById('wme_gps_layer_summary');
    var obj3 = document.getElementById('wme_gps_layer_speed');
    var obj4 = document.getElementById('wme_layer_polygon');

    if (obj1 === null) return;
    if (obj2 === null) return;
    if (obj3 === null) return;
    if (obj4 === null) return;

    var str = obj1.value;
    var speedmode = obj3.checked;
    var fillPolygon = obj4.checked;

    points = [];
    lineFeatures = [];
    pointFeatures = [];

    var proj1 = new OpenLayers.Projection('EPSG:4326');
    var proj2 = gps_wazeMap.getProjectionObject();

    var time1 = 0;
    var time2 = 0;

    var pt1 = null;
    var pt2 = null;

    var kier1 = 0;
    var kier2 = 0;
    var kiercolor  = new Array();
    var speedcolor = new Array();

    kiercolor.push('#ff0000');
    kiercolor.push('#00ff40');
    kiercolor.push('#00ff40');
    kiercolor.push('#0000ff');
    kiercolor.push('#0000ff');
    kiercolor.push('#fff000');
    kiercolor.push('#fff000');
    kiercolor.push('#ff0000');

    speedcolor[0]  = '#000000';
    speedcolor[1]  = '#505060';
    speedcolor[2]  = '#b0b0c0';
    speedcolor[3]  = '#FFFF00';
    speedcolor[4]  = '#68fdda';
    speedcolor[5]  = '#00d508';
    speedcolor[6]  = '#f68400';
    speedcolor[7]  = '#8e3f04';
    speedcolor[8]  = '#ff525a';
    speedcolor[9]  = '#e00000';
    speedcolor[10] = '#2594fb';
    speedcolor[11] = '#0500c9';
    speedcolor[12] = '#fa00e4';
    speedcolor[13] = '#68008d';
    speedcolor[14] = '#370143';
    speedcolor[15] = '#370143';
    speedcolor[16] = '#370143';
    speedcolor[17] = '#370143';
    speedcolor[18] = '#370143';
    speedcolor[19] = '#370143';
    speedcolor[20] = '#370143';

    var kierWidth = 360 / kiercolor.length;
    kiercolor.push(kiercolor[0]);

    var nmea_format = str.indexOf("$GPGGA");
    var gpx_format  = str.indexOf("<trkpt");
    var kml_format1 = str.indexOf("<gx:coord>");
    var kml_format2 = str.indexOf("<LineString>");

    if (typeof String.prototype.startsWith != 'function') {
        // see below for better implementation!
        String.prototype.startsWith = function (str){
            return this.indexOf(str) === 0;
        };
    }

    str.trim();
    var is_polygon = str.startsWith("POLYGON");

    if (is_polygon) {
        var opacity = 0.0;

        if (fillPolygon) {
            opacity = 0.3;
        }

        var aStyle = new gps_OpenLayers.Style({
            strokeDashstyle: 'solid',
            strokeColor : "#ff0000",
            strokeOpacity: 1.0,
            strokeWidth: 4,
            //strokeLinecap: 'square',
            fillColor: '#ff0000',
            fillOpacity: opacity
        });


        var wkt = new OpenLayers.Format.WKT();
        var polygonFeature = wkt.read(str);
        polygonFeature.geometry.transform(gps_wazeMap.displayProjection, gps_wazeMap.getProjectionObject());
        // polygonFeature.style = aStyle;


        var layers = gps_wazeMap.getLayersBy("uniqueName","__Polygon_View");
        // layers.styleMap = new gps_OpenLayers.StyleMap(aStyle);
        if(layers.length !== 0) {

            var gps_layer = layers[0];
            gps_layer.styleMap = new gps_OpenLayers.StyleMap(aStyle);
            gps_layer.addFeatures([polygonFeature]);
        }
        return;
    }

    var numPoints = 0;
    var sumDist = 0;

    if (nmea_format >= 0) {

        pt1 = null;
        pt2 = null;
        kier1 = 0;
        kier2 = 0;
        points.length = 0;

        var p = -1;
        for(;;) {
            p = str.indexOf("$GPGGA", p+1);
            if (p < 0) break;

            var s = str.substr(p, 80);
            var d = s.split(",");

            var lat = min_to_deg(d[2]);
            var lon = min_to_deg(d[4]);
            if (d[3] == 'S') lat = -lat;
            if (d[5] == 'W') lon = -lon;

            var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
            numPoints++;

            time1 = time2;
            time2 = parseInt(d[1]);
            var s = time2 % 100;
            time2 = (time2 - s) / 100;
            var m = time2 % 100;
            time2 = (time2 - m) / 100;
            var g = time2 % 100;
            time2 = (g*3600) + (m*60) + s;

            var angle = 0;
            var stop = 0;
            var dist = 0;
            var speed = 0;
            var dt = 0;

            if (pt1 !== null && pt2 !== null) {
                angle = calc_azym(pt1, pt2, kierWidth);
                dist = pt1.distanceTo(pt2);
                dt = Math.abs(time2 - time1);

                kier2 = parseInt(angle / kierWidth);

                if (speedmode) {
                    var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
                    var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));

                    var kmh = (geodist / dt) * 3.6;
                    speed = parseInt(kmh / 10);
                    if (speed < 0)  speed = 0;
                    if (speed > 20) speed = 20;
                    kier2 = speed;
                    if (dist < 5 && kier1<=2 && kier2<=2) continue;
                }
                else {
                    if (dist < 5) continue;
                }

                if (dist > 10000)   stop |= 1;
                if (dt > 60)	   stop |= 1;
                if (kier2 != kier1) stop |= 2;

            }

            //var ptFeature = new OpenLayers.Feature.Vector(pt1, {strokeColor: '#000000', labelText: '', lineWidth: 1 } );
            //pointFeatures.push(ptFeature);

            if (stop) {
                if (points.length >= 2) {
                    var k = kiercolor[kier1];
                    var szer = 3;

                    if (speedmode) {
                        k = speedcolor[kier1];
                        szer = 6;
                    }

                    var line = new gps_OpenLayers.Geometry.LineString(points);
                    sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                    var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                    lineFeatures.push(lineFeature);
                }
                points.length = 0;

                if (stop == 2) points.push(pt1);
            }

            points.push(pt2);
            pt1 = pt2;
            kier1 = kier2;
        }
    }


    if (gpx_format >= 0) {

        pt1 = null;
        pt2 = null;
        kier1 = 0;
        kier2 = 0;
        points.length = 0;

        var p = -1;
        var pend = str.indexOf("</trkseg");
        for (;;) {
            p = str.indexOf("<trkpt", p+1);
            if (p < 0) break;

            if (p > pend) {
                if (points.length >= 2) {
                    var k = kiercolor[kier1];
                    var szer = 3;

                    if (speedmode) {
                        k = speedcolor[kier1];
                        szer = 6;
                    }

                    var line = new gps_OpenLayers.Geometry.LineString(points);
                    sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                    var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                    lineFeatures.push(lineFeature);
                }

                pt1 = null;
                pt2 = null;
                kier1 = 0;
                kier2 = 0;
                points.length = 0;

                pend = str.indexOf("</trkseg", p+1);
            }

            var s = str.substr(p, 60);

            var lat = 0;
            var lon = 0;
            var plat = s.indexOf('lat="');
            var plon = s.indexOf('lon="');
            if (plat>=0 && plon>=0) {
                lat = parseFloat( s.substr(plat + 5, 10) );
                lon = parseFloat( s.substr(plon + 5, 10) );
            }

            var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
            numPoints++;

            var angle = 0;
            var stop = 0;
            var dist = 0;
            var speed = 0;
            var dt = 0;

            if (speedmode) {
                var p_speed  = str.indexOf("<speed>", p);
                var p_time   = str.indexOf("<time>",  p);
                var p_trkend = str.indexOf("</trkpt", p);

                if (p_time > p && p_time < p_trkend) {
                    var s	  = str.substr(p_time+6, 20);
                    var rok	= parseInt( s.substr(0, 4) );
                    var mies	= parseInt( s.substr(5, 2) );
                    var dzien	= parseInt( s.substr(8, 2) );
                    var godz	= parseInt( s.substr(11, 2) );
                    var minut	= parseInt( s.substr(14, 2) );
                    var sek	= parseInt( s.substr(17, 2) );

                    time1 = time2;
                    time2 = (dzien*24*3600) + (godz*3600) + (minut*60) + sek;
                    dt = Math.abs(time2 - time1);

                    var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
                    var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));

                    var kmh = (geodist / dt) * 3.6;
                    speed = parseInt(kmh / 10);
                    if (speed < 0)  speed = 0;
                    if (speed > 20) speed = 20;
                }
                else {
                    if (p_speed > p && p_speed < p_trkend) {
                        var s   = str.substr(p_speed+7, 8);
                        var kmh = parseFloat(s) * 3.6;
                        speed = parseInt(kmh / 10);
                        if (speed < 0)  speed = 0;
                        if (speed > 20) speed = 20;
                    }
                }
            }

            if (pt1 !== null && pt2 !== null) {
                angle = calc_azym(pt1, pt2, kierWidth);
                dist = pt1.distanceTo(pt2);

                kier2 = parseInt(angle / kierWidth);

                if (speedmode) {
                    kier2 = speed;
                    if (dist < 5 && kier1<=2 && kier2<=2) continue;
                }
                else {
                    if (dist < 5) continue;
                }

                if (dist > 10000)   stop |= 1;
                if (kier2 != kier1) stop |= 2;

            }

            //var ptFeature = new OpenLayers.Feature.Vector(pt1, {strokeColor: '#000000', labelText: '', lineWidth: 1 } );
            //pointFeatures.push(ptFeature);

            if (stop) {
                if (points.length >= 2) {
                    var k = kiercolor[kier1];
                    var szer = 3;

                    if (speedmode) {
                        k = speedcolor[kier1];
                        szer = 6;
                    }

                    var line = new gps_OpenLayers.Geometry.LineString(points);
                    sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                    var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                    lineFeatures.push(lineFeature);
                }
                points.length = 0;

                if (stop == 2) points.push(pt1);
            }

            points.push(pt2);
            pt1 = pt2;
            kier1 = kier2;
        }
    }


    if (kml_format1 >= 0) {

        pt1 = null;
        pt2 = null;
        kier1 = 0;
        kier2 = 0;
        points.length = 0;

        var p = -1;
        var pend = str.indexOf("</gx:Track>");

        for(;;) {
            p = str.indexOf("<gx:coord>", p+1);
            if (p < 0) break;

            if (p > pend) {
                if (points.length >= 2) {
                    var k = kiercolor[kier1];
                    var szer = 3;

                    if (speedmode) {
                        k = speedcolor[kier1];
                        szer = 6;
                    }

                    var line = new gps_OpenLayers.Geometry.LineString(points);
                    sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                    var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                    lineFeatures.push(lineFeature);
                }
                pt1 = null;
                pt2 = null;
                kier1 = 0;
                kier2 = 0;
                points.length = 0;

                pend = str.indexOf("</gx:Track>", pend + 1);
            }

            var s = str.substr(p + 10, 30);
            var coord = s.split(" ");

            var lon = parseFloat( coord[0] );
            var lat = parseFloat( coord[1] );

            var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
            numPoints++;

            var angle = 0;
            var stop = 0;
            var dist = 0;
            var speed = 0;
            var dt = 0;

            if (pt1 !== null && pt2 !== null) {
                angle = calc_azym(pt1, pt2, kierWidth);
                dist = pt1.distanceTo(pt2);
                dt = 0;

                kier2 = parseInt(angle / kierWidth);

                if (speedmode) {
                    kier2 = 0;
                }
                else {
                    if (dist < 5) continue;
                }

                if (dist > 10000)   stop |= 1;
                if (dt > 60)	   stop |= 1;
                if (kier2 != kier1) stop |= 2;

            }


            if (stop) {
                if (points.length >= 2) {
                    var k = kiercolor[kier1];
                    var szer = 3;
                    if (speedmode) {
                        k = speedcolor[kier1];
                        szer = 6;
                    }

                    var line = new gps_OpenLayers.Geometry.LineString(points);
                    sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                    var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                    lineFeatures.push(lineFeature);
                }
                points.length = 0;

                if (stop == 2) points.push(pt1);
            }

            points.push(pt2);
            pt1 = pt2;
            kier1 = kier2;
        }
    }

    else if (kml_format2 >= 0) {
        pt1 = null;
        pt2 = null;
        kier1 = 0;
        kier2 = 0;
        points.length = 0;

        var p = -1;

        for(;;) {
            p = str.indexOf("<LineString>", p + 1);
            if (p < 0) break;

            var block_start = str.indexOf("<coordinates>", p);
            var block_end   = str.indexOf("</coordinates>", p);

            if (block_start>=0 && block_end>=0) {

                block_start += 13;
                var s = str.substr(block_start, block_end - block_start);
                var coords = s.match(/\S+/g);

                pt1 = null;
                pt2 = null;
                kier1 = 0;
                kier2 = 0;
                points.length = 0;

                for(var i=0; i<coords.length; i++) {

                    var xyz = coords[i].split(",");
                    if (xyz[0]==='' || xyz[1]==='') continue;
                    var lon = parseFloat(xyz[0]);
                    var lat = parseFloat(xyz[1]);

                    var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
                    numPoints++;

                    var angle = 0;
                    var stop = 0;
                    var dist = 0;
                    var speed = 0;
                    var dt = 0;

                    if (pt1 !== null && pt2 !== null) {
                        angle = calc_azym(pt1, pt2, kierWidth);
                        dist = pt1.distanceTo(pt2);
                        dt = Math.abs(time2 - time1);

                        kier2 = parseInt(angle / kierWidth);

                        if (speedmode) {
                            kier2 = 0;
                        }
                        else {
                            if (dist < 5) continue;
                        }

                        if (dist > 10000)   stop |= 1;
                        if (dt > 60)	   stop |= 1;
                        if (kier2 != kier1) stop |= 2;

                    }




                    if (stop) {
                        if (points.length >= 2) {
                            var k = kiercolor[kier1];
                            var szer = 3;

                            if (speedmode) {
                                k = speedcolor[kier1];
                                szer = 6;
                            }

                            var line = new gps_OpenLayers.Geometry.LineString(points);
                            sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                            var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                            lineFeatures.push(lineFeature);
                        }
                        points.length = 0;

                        if (stop == 2) points.push(pt1);
                    }

                    points.push(pt2);
                    pt1 = pt2;
                    kier1 = kier2;

                }

                if (points.length >= 2) {
                    var k = kiercolor[kier1];
                    var szer = 3;

                    if (speedmode) {
                        k = speedcolor[kier1];
                        szer = 6;
                    }

                    var line = new gps_OpenLayers.Geometry.LineString(points);
                    sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                    var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                    lineFeatures.push(lineFeature);
                }


            }
        }
    }


    if (points.length >= 2) {
        var k = kiercolor[kier1];
        var szer = 3;

        if (speedmode) {
            k = speedcolor[kier1];
            szer = 6;
        }

        var line = new gps_OpenLayers.Geometry.LineString(points);
        sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
        var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
        lineFeatures.push(lineFeature);
        points.length = 0;
    }


    if (lineFeatures.length === 0) {

        pt1 = null;
        pt2 = null;
        kier1 = 0;
        kier2 = 0;
        points.length = 0;

        var lines = str.split("\n");

        if (lines.length >= 5) {
            var l0 = lines[0].split(',');
            var l1 = lines[1].split(',');
            var l2 = lines[2].split(',');
            var l3 = lines[3].split(',');
            var l4 = lines[4].split(',');
            var s0 = '';
            var s1 = '';
            var s2 = '';
            var s3 = '';
            var s4 = '';
            if (l0.length >= 2) s0 = l0[1].trim().toUpperCase();
            if (l1.length >= 2) s1 = l1[1].trim().toUpperCase();
            if (l2.length >= 2) s2 = l2[1].trim().toUpperCase();
            if (l3.length >= 2) s3 = l3[1].trim().toUpperCase();
            if (l4.length >= 2) s4 = l4[1].trim().toUpperCase();
            var len = s0.length + s1.length + s2.length + s3.length + s4.length;
            var c0 = s0.charCodeAt(0);
            var c1 = s1.charCodeAt(0);
            var c2 = s2.charCodeAt(0);
            var c3 = s3.charCodeAt(0);
            var c4 = s4.charCodeAt(0);

            if ( len==5 && s0=="S" && c1>=65 && c1<=90 && c2>=65 && c2<=90 && c3>=65 && c3<=90 && c4>=65 && c4<=90 ) {

                for(var i=1; i<lines.length; i++) {

                    var line = lines[i].split(',');
                    if (line.length < 5) continue;

                    var mode = line[1].trim();

                    if (mode != 'A') { numPoints++; continue; }

                    var lon = parseInt(line[2].trim()) / 1000000.0;
                    var lat = parseInt(line[3].trim()) / 1000000.0;

                    var pt2 = new gps_OpenLayers.Geometry.Point(lon, lat).transform(proj1, proj2);
                    numPoints++;

                    time1 = time2;
                    time2 = parseInt(line[0]);

                    var angle = 0;
                    var stop = 0;
                    var dist = 0;
                    var speed = 0;
                    var dt = 0;

                    if (pt1 !== null && pt2 !== null) {
                        angle = calc_azym(pt1, pt2, kierWidth);
                        dist = pt1.distanceTo(pt2);
                        dt = Math.abs(time2 - time1);

                        kier2 = parseInt(angle / kierWidth);

                        if (speedmode) {
                            var line = new OpenLayers.Geometry.LineString( [pt1, pt2] );
                            var geodist = line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));

                            var kmh = (geodist / dt) * 3.6;
                            speed = parseInt(kmh / 10);
                            alert("kmh "+ kmh + "\nspeed: speed");
                            if (speed < 0)  speed = 0;
                            if (speed > 20) speed = 20;
                            kier2 = speed;
                            if (dist < 5 && kier1<=2 && kier2<=2) continue;
                        }
                        else {
                            if (dist < 5) continue;
                        }

                        if (dist > 10000)   stop |= 1;
                        if (dt > 60)	   stop |= 1;
                        if (kier2 != kier1) stop |= 2;
                    }


                    if (stop) {
                        if (points.length >= 2) {
                            var k = kiercolor[kier1];
                            var szer = 3;

                            if (speedmode) {
                                k = speedcolor[kier1];
                                szer = 6;
                            }

                            var line = new gps_OpenLayers.Geometry.LineString(points);
                            sumDist += line.getGeodesicLength(new OpenLayers.Projection("EPSG:900913"));
                            var lineFeature = new gps_OpenLayers.Feature.Vector(line, {strokeColor: k, labelText: '', lineWidth: szer } );
                            lineFeatures.push(lineFeature);
                        }
                        points.length = 0; //points = []; //points.splice(0, 99999999);

                        if (stop == 2) points.push(pt1);
                    }

                    points.push(pt2);
                    pt1 = pt2;

                }
            }

        }
    }



    var layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
    if(layers.length !== 0) {

        var gps_layer = layers[0];
        if (lineFeatures.length > 0)  gps_layer.addFeatures(lineFeatures);
        if (pointFeatures.length > 0) gps_layer.addFeatures(pointFeatures);
    }

    if (lineFeatures.length > 0) {
        obj1.value = '';
    }
    obj2.innerHTML = 'Processed:  ' + '\n';
    obj2.innerHTML += numPoints + ' points,  ';
    obj2.innerHTML += parseInt(sumDist/10) / 100 + ' km.';
}

function clear_layers()
{
    let layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
    if(layers.length !== 0) {

        var gps_layer = layers[0];

        gps_layer.removeAllFeatures();
    }

    layers = gps_wazeMap.getLayersBy("uniqueName","__Polygon_View");
    // layers.styleMap = new gps_OpenLayers.StyleMap(aStyle);
    if(layers.length !== 0) {

        var gps_layer = layers[0];
        gps_layer.removeAllFeatures();
    }

}
//---------------------------------------------------------------------------------------
function Draw_WME_GPS_Track()
{
    gps_wazeMap = W.map;
    gps_wazeModel = W.model;
    gps_OpenLayers = OpenLayers;

    var layers = gps_wazeMap.getLayersBy("uniqueName","__WME_GPS_Track");
    if(layers.length === 0) {
        var gps_style = new gps_OpenLayers.Style({
            strokeDashstyle: 'solid',
            strokeColor : "${strokeColor}",
            strokeOpacity: 1.0,
            strokeWidth: "${lineWidth}",
            //strokeLinecap: 'square',
            fillColor: '#000000',
            fillOpacity: 1.0,
            pointRadius: 2,
            fontWeight: "normal",
            label : "${labelText}",
            fontFamily: "Tahoma, Courier New",
            labelOutlineColor: "#FFFFFF",
            labelOutlineWidth: 2,
            fontColor: '#000000',
            fontSize: "10px"
        });

        var gps_mapLayer = new gps_OpenLayers.Layer.Vector("GPS Track View", {
            displayInLayerSwitcher: true,
            uniqueName: "__WME_GPS_Track",
            styleMap: new gps_OpenLayers.StyleMap(gps_style)
        });

        I18n.translations[I18n.currentLocale()].layers.name["__WME_GPS_Track"] = "GPS Track View";
        gps_wazeMap.addLayer(gps_mapLayer);
        gps_mapLayer.setVisibility(true);

        var polygon_mapLayer = new gps_OpenLayers.Layer.Vector("Polygon View", {
            displayInLayerSwitcher: true,
            uniqueName: "__Polygon_View"
            // styleMap: new gps_OpenLayers.StyleMap(gps_style)
        });

        I18n.translations[I18n.currentLocale()].layers.name["__Polygon_View"] = "Polygon View";
        gps_wazeMap.addLayer(polygon_mapLayer);
        polygon_mapLayer.setVisibility(true);

        var cnt = '';
        cnt += '<br><div id="wme_gps_layer" style="color:#000000; ">';
        cnt += '<b>GPS Track View:</b>';
        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; " ';
        cnt += 'placeholder="Paste a gps track (nmea, gpx, kml, gps.csv) or a polygon (WKT format) here..." ></textarea>';
        cnt += '<br>';
        cnt += '</div>';

        var btn = $('<button id="wme_gps_layer_button" title="" >Add feature</button>');
        //btn.click(gps_parse);

        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>';
        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>';

        var btnClear = $('<button id="wme_clear_layers_button" title="" >Clear</button>');
        //btnClear.click(clear_layers);

        var info = '<p style="font-family: Tahoma; font-size:9px; color:#808080; " id="wme_gps_layer_summary" ></p>';

        let $tab = $("<div>", {style:"padding:8px 16px", id:"WMEGPSTrackViewSettings"});
        $tab.append(cnt);
        $tab.append(btn);
        $tab.append(spd);
        $tab.append(follPolygon);
        $tab.append("<br>");
        $tab.append(btnClear);
        $tab.append(info);
        new WazeWrap.Interface.Tab('GPS', $tab.html(), hookClickEvents);
        //new WazeWrap.Interface.Tab('<span class="fa fa-map-o"></span>', $tab.html());
        /*$("#sidepanel-drives").append(cnt);
		$("#sidepanel-drives").append(btn);
		$("#sidepanel-drives").append(spd);
		$("#sidepanel-drives").append(follPolygon);
		$("#sidepanel-drives").append("<br>");
		$("#sidepanel-drives").append(btnClear);
		$("#sidepanel-drives").append(info);*/


        function hookClickEvents(){
            $('#wme_clear_layers_button').click(clear_layers);
            $('#wme_gps_layer_button').click(gps_parse);
        }


    }

}
//---------------------------------------------------------------------------------------
bootstrap_WME_GPS_Track();