WME GPS Tracer

Load and show tracks in WME

目前为 2016-02-28 提交的版本。查看 最新版本

// ==UserScript==
// @name         WME GPS Tracer
// @namespace    https://gf.qytechs.cn/ru/users/26764-alexletov-wme-gps-tracer
// @version      0.1
// @description  Load and show tracks in WME
// @author       alexletov
// @include      https://www.waze.com/editor/*
// @include      https://www.waze.com/*/editor/*
// @include      https://editor-beta.waze.com/*
// @license      https://opensource.org/licenses/BSD-3-Clause
// @copyright    2016 alexletov
// @grant        none
// ==/UserScript==

var VERSION = '0.1 beta';

var server_url;

var start, end;

function gpsTracer_init() {
    try {
        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) )) {
            setTimeout(gpsTracer_init, 1000);
            return;
        }
    } catch (err) {
        setTimeout(gpsTracer_init, 1000);
        return;
    }

    console.log('WME GPS Tracer: init');
    
    var userInfo = getElId("user-info");
    if (userInfo === null) {
      window.setTimeout(gpsTracer_init, 500);
      return;
    }
    
    var navTabs = userInfo.getElementsByTagName("ul");
    if (navTabs.length === 0) {
      window.setTimeout(gpsTracer_init, 500);
      return;
    }
    
    if (typeof navTabs[0] === undefined) {
      window.setTimeout(gpsTracer_init, 500);
      return;
    }
    var tabContents = userInfo.getElementsByTagName("div");
    if (tabContents.length === 0) {
      window.setTimeout(gpsTracer_init, 500);
      return;
    }

    if (typeof tabContents[0] === undefined) {
      window.setTimeout(gpsTracer_init, 500);
      return;
    }
    gpsTracer_loadSettings();
    gpsTracer_init_showUI();
    $('#_bGPSTProcessSave').click(gpsTracer_saveSettings);
}

function gpsTracer_init_showUI() {
    addon = document.createElement('section');
    addon.innerHTML = '<b>WME GPS Tracer</b> v' + VERSION;

    section = document.createElement('p');
    section.style.paddingTop = "8px";
    section.style.textIndent = "16px";
    section.id = "gpstracer_settings";
    section.innerHTML += 'Select track to show: <select id="_iGPST_track_list" name="_iGPST_track_list" disabled></select><br />';
    section.innerHTML += '<button id="_bGPSTProcessLoadTrack" name="_bGPSTProcessLoadTrack" width="100%" disabled>Load track</button><br/>';
    section.innerHTML += '<button id="_bGPSTGoToStartOfTrack" name="_bGPSTGoToStartOfTrack" width="100%" disabled>Go to start</button><br/>';
    section.innerHTML += '<button id="_bGPSTGoToEndOfTrack" name="_bGPSTGoToEndOfTrack" width="100%" disabled>Go to end</button><br/>';
    section.innerHTML += '<br/><br/><hr /><br/><br/>';
    section.innerHTML += 'Server url: <input id="_iGPSTServerUrl" name="_iGPSTServerUrl" type="text" value="' + ((server_url === undefined || server_url === null) ? '' : server_url ) + '" /><br />';
    section.innerHTML += '<button id="_bGPSTProcessSave" name="_bGPSTProcessSave" width="100%">Save</button><br/>';

    addon.appendChild(section);
    
    userTabs = getElId("user-tabs");
    userInfo = getElId("user-info");
    sidePanelPrefs = getElId("sidepanel-prefs");
    navTabs = getElClass("nav-tabs", userTabs)[0];
    tabContent = sidePanelPrefs.parentNode;    

    newtab = document.createElement('li');
    newtab.innerHTML = '<a href="#sidepanel-gpstracer" data-toggle="tab">GPS-T</a>';
    navTabs.appendChild(newtab);

    addon.id = "sidepanel-gpstracer";
    addon.className = "tab-pane";
    tabContent.appendChild(addon);
}

function gpsTracer_request_track_list() {
    if (server_url !== null) {
        $.ajax({
            url: server_url + '/track_list.php',
            type: "POST",
            dataType: "jsonp",
            data: null,
            success: function (resp) {
                gpsTracer_update_track_list(resp.tracks);
                console.log(resp);
            },
            error: function (xhr, status) {
                alert("Error: " + status);
            }
        });
    } else {
        console.log("server url is null");
    }
}

function gpsTracer_update_track_list(list) {
    $('#_iGPST_track_list').empty();
    for (var i = 0; i < list.length; i++) {
        $('#_iGPST_track_list').append( new Option(list[i].name, list[i].id) );
    };
    $("#_iGPST_track_list").removeAttr("disabled");
    $("#_bGPSTProcessLoadTrack").removeAttr("disabled");
    $('#_bGPSTProcessLoadTrack').click(gpsTracer_load_track);
}

function isValidURL(s) {    
    var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
    return regexp.test(s);    
}

function gpsTracer_loadSettings() {
    server_url = localStorage.getItem("GPST_Server_Url");
    gpsTracer_request_track_list();
}

function gpsTracer_load_track() {
    if (server_url !== null) {
        $.ajax({
            url: server_url + '/' + $('#_iGPST_track_list').val() + '.php',
            type: "POST",
            dataType: "jsonp",
            data: null,
            success: function (resp) {
                gpsTracer_show_track(resp);
    
                $('#_bGPSTGoToStartOfTrack').click(gpsTracer_goto_start);
                $("#_bGPSTGoToStartOfTrack").removeAttr("disabled");
                $('#_bGPSTGoToEndOfTrack').click(gpsTracer_goto_end);
                $("#_bGPSTGoToEndOfTrack").removeAttr("disabled");
            },
            error: function (xhr, status) {
                alert("Error: " + status);
            }
        });
    } else {
        console.log("server url is null");
    }
}

function gpsTracer_saveSettings() {
    url = $('#_iGPSTServerUrl').val();
    if (!isValidURL(url)) {
        $('#_iGPSTServerUrl').val(server_url === null ? '' : server_url);
        alert(url + ' is not valid URL!');
        return;
    }
    
    server_url = url;

    localStorage.setItem("GPST_Server_Url", url);
    gpsTracer_request_track_list();
}

function gpsTracer_goto_start() {
    Waze.map.setCenter([start.x, start.y], 4);
}

function gpsTracer_goto_end() {
    Waze.map.setCenter([end.x, end.y], 4);
}

function gpsTracer_show_track(coordinates) {
    var points = [];
    var lineFeatures = [];
    var proj1 = new OpenLayers.Projection('EPSG:4326');
    var proj2 = Waze.map.getProjectionObject();
    var numPoints = 0;
    
    gpsTracer_clear_track();

    for (var i = 0; i < coordinates.length; i++) {
        var point = new OpenLayers.Geometry.Point(coordinates[i].lat, coordinates[i].lon).transform(proj1, proj2);
        points.push(point);
        if (i == 0) {
            start = point;
        }
        end = point;
        numPoints++;
    }

    var line = new OpenLayers.Geometry.LineString(points);
    var size = 6;
    var lineFeature = new OpenLayers.Feature.Vector(line, {strokeColor: '#ff0000'} );
    lineFeatures.push(lineFeature);

    var layers = Waze.map.getLayersBy("uniqueName","__WME_GPS_Tracer");
    var gps_mapLayer;
    if(layers.length == 0) {
        var new_layer_style = new 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"
        });

        gps_mapLayer = new OpenLayers.Layer.Vector("GPS Tracer", {
            displayInLayerSwitcher: true,
            uniqueName: "__WME_GPS_Tracer",
            styleMap: new OpenLayers.StyleMap(new_layer_style)
        });

        I18n.translations.en.layers.name["__WME_GPS_Tracer"] = "GPS Tracer";
        Waze.map.addLayer(gps_mapLayer);
    } else {
        gps_mapLayer = layers[0];
    }
    
    gps_mapLayer.setVisibility(true);
    
    if (lineFeatures.length > 0)  gps_mapLayer.addFeatures(lineFeatures);

    // go to the center of added features
    if (lineFeatures.length > 0 || pointFeatures.length > 0) {
        var bounds = new OpenLayers.Bounds();

        for (var i = 0; i < lineFeatures.length; ++i) {
            var line = lineFeatures[i];
            bounds.extend(line.geometry.bounds);
        }

        var center = bounds.getCenterPixel();
        var zoom = Waze.map.getZoom();
        Waze.map.setCenter([center.x, center.y], zoom);
    }
}

function gpsTracer_clear_track()
{
    var layers = Waze.map.getLayersBy("uniqueName","__WME_GPS_Tracer");
    if(layers.length != 0) {        
        var gps_layer = layers[0];        
        gps_layer.removeAllFeatures();
    }
}

/* helper function */
function getElClass(classname, node) {
    if (!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for (var i = 0, j = els.length; i < j; i++)
        if (re.test(els[i].className)) a.push(els[i]);
    return a;
}

function getElId(node) {
    return document.getElementById(node);
}

gpsTracer_init();

QingJ © 2025

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