[script] WME Junction Angle Info

Discussion for the unofficial, community-developed addons, extensions and scripts built for the Waze Map Editor.

The official index of these tools is the Community Plugins, Extensions and Tools wiki page.

Moderators: krankyd, Unholy

Forum rules
Discussion for the unofficial, community-developed addons, extensions and scripts built for the Waze Map Editor.

DO NOT START a new thread unless it is about a new idea. Keep discussion of existing tools within the main thread for that tool.

The official index of these tools is the Community Plugins, Extensions and Tools wiki page.

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Wed Sep 11, 2013 3:34 am

jondrush wrote:Not sure why one of my favorite scripts isn't listed here. But I think Junction Angle Info should be in every serious editor's toolbox.

http://userscripts.org/scripts/show/160864

It's in the wiki. Several scripts are there which aren't listed here. Just the way it is.
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Wed Nov 06, 2013 5:57 pm

shawndoc wrote:I've disabled all other scripts, tried uninstalling and reinstalling, but can't get angle info to show up.

Still working for me, too. Do you have the layer enabled?
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Wed Nov 06, 2013 10:46 pm

shawndoc wrote:Just installed on Firefox using Greasemonkey, and it works in the regular editor but not the beta editor.

Using the 1.5.6 version.

Agreed. Based on what I see in the header, the URLs it is programmed to work with does not include the current beta URL.
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Thu Nov 07, 2013 12:44 am

shawndoc wrote:I see a 1.5.7 version listed on the project site, but no where to download. Although I doubt that will fix things as there's no mention of changes for the beta editor.

Yes, there is. But the header info for allowed URLs is the same. I don't read regexp very well, but I don't see that "editor-beta" is a valid URL for this code. You can download the raw user.js file and see if it works in firefox. It doesn't work in Chrome for me.
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Thu Feb 06, 2014 4:46 am

I sent a PM to milkboy. We'll see.
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Thu Feb 06, 2014 5:16 pm

SpeedDzel wrote:Yeees! it's working again, Thank You! :D

It is not working for me. :\
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Sat Feb 08, 2014 7:49 am

I've tried to update this script to work. That should be relatively simple, but I've failed repeatedly.
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Sat Feb 08, 2014 3:30 pm

I've had the CWS version (it's been there a long time) and it wasn't working. Maybe I'll load it again.
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Tue Feb 11, 2014 1:52 am

Still has two errors for which berestovskyy provided me code fixes for earlier.
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Re: [script] WME Junction Angle Info

Postby AlanOfTheBerg » Tue Feb 11, 2014 7:12 am

Here's my proposal for v1.5.7.3 which is based on tk85's changes previously posted, and includes some important code changes from berestovskyy and myself. It runs without throwing any errors for me in Chrome.

If someone would like to officially take over this script, go for it.
Code: Select all
// ==UserScript==
// @name WME Junction Angle info
// @namespace http://pyrczak.pl/
// @description Show the angle between two selected (and connected) segments
// @include         https://*.waze.com/*/editor/*
// @include         https://*.waze.com/editor/*
// @include         https://*.waze.com/map-editor/*
// @include         https://*.waze.com/beta_editor/*
// @include         https://editor-beta.waze.com/*
// @version 1.5.7.3
// @grant none
// @copyright                2013 Michael Wikberg <michael@wikberg.fi>
// @license CC-BY-NC-SA
// ==/UserScript==

/**
* Copyright 2013 Michael Wikberg <michael@wikberg.fi>
*
* Fixed for new WME: 2014 Paweł Pyrczak <support@pyrczak.pl>
*
*/
function run_ja() {


var junctionangle_version = "1.5.7.3";
var junctionangle_debug = 1;        //0: no output, 1: basic info, 2: debug 3: crazy debug
var ja_wazeModel, ja_wazeMap, $;
var ja_features = [];

        var ja_wazeMap = {};
        var ja_wazeModel = {};
        var ja_loginManager = {};
        var ja_selectionManager = {};
        var ja_OpenLayers = {};



function junctionangle_bootstrap() {
        var bGreasemonkeyServiceDefined = false;

       
        // not needed
        /*
         
        try
        {
                if (typeof Components.interfaces.gmIGreasemonkeyService === "object")
                {
                        bGreasemonkeyServiceDefined = true;
                }
        }
        catch (err)
        {
                //Ignore.
        }
        if ( typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined)
        {
                unsafeWindow = ( function ()
                {
                        var dummyElem = document.createElement('p');
                        dummyElem.setAttribute ('onclick', 'return window;');
                        return dummyElem.onclick ();
                } ) ();
        }
       
        */
        /* begin running the code! */
        setTimeout(ja_startcode, 500);
}


function ja_startcode() {
       // 
   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(junctionangle_init, 500);
      } else {
         setTimeout(ja_startcode, 1000);
      }
   } catch(err) {
         setTimeout(ja_startcode, 1000);
   }

}


function ja_log(ja_log_msg, ja_log_level) {
       return true;
       
        if(ja_log_level <= junctionangle_debug) {
                if(typeof ja_log_msg == "object") {
                        //ja_log(arguments.callee.caller.toString(), ja_log_level);
                       // console.log(ja_log_msg);
                }
                else {
                        //console.log("WME Junction Angle: " + ja_log_msg);
                }
        }
}

function junctionangle_init()
{


        ja_wazeMap = window.Waze.map;
        ja_wazeModel = window.Waze.model;
        ja_loginManager = window.Waze.loginManager;
        ja_selectionManager = window.Waze.selectionManager;
        ja_OpenLayers = window.OpenLayers;
        //get jQuery support (not needed now)
        //$ = window.$;

   //selected nodes changed
   ja_selectionManager.events.register("selectionchanged", null, ja_calculate);
   
   //probably unnecessary
   //map is moved or resized
   //ja_wazeMap.events.register("moveend", null, ja_calculate);

   //mouse button released (FIXME: wanted to listen to "segment or node moved", but could not find a suitable event...)
   // FIXED
   //ja_wazeMap.events.register("mouseup", null, ja_calculate);
   ja_wazeModel.segments.events.on({
      "objectschanged": ja_calculate,
      "objectsremoved": ja_calculate,
   });
   ja_wazeModel.nodes.events.on({
      "objectschanged": ja_calculate,
      "objectsremoved": ja_calculate,
   });

   //HTML changes after login. Better do init again.
   ja_loginManager.events.register("afterloginchanged", null, junctionangle_init);
       
        /**
         * Make some style settings
         */
         var ja_style = new ja_OpenLayers.Style({
                fillColor: "#ffcc88",
                strokeColor: "#ff9966",
                strokeWidth: 2,
                label: "${angle}",
                fontWeight: "bold",
                pointRadius: 10,
                fontSize: "10px"
        }, {
                rules: [
                        new window.OpenLayers.Rule({
                                symbolizer: {
                                }
                        }),
                        new window.OpenLayers.Rule({
                                filter: new window.OpenLayers.Filter.Comparison({
                                         type: window.OpenLayers.Filter.Comparison.EQUAL_TO,
                                         property: "ja_type",
                                         value: "junction"
                                 }),
                                symbolizer: {
                                        pointRadius: 13,
                                        fontSize: "12px",
                                        fillColor: "#4cc600",
                                        strokeColor: "#183800"
                                }
                        })
                ]
        });

        //try to see if we already have a layer
        if(window.Waze.map.getLayersByName("Junction Angles").length > 0) {
       
        } else {
            // Create a vector layer and give it your style map.
            ja_mapLayer = new ja_OpenLayers.Layer.Vector("Junction Angles", {
               displayInLayerSwitcher: true,
               uniqueName: "JunctionAngles",
               shortcutKey: "S+j",
               accelerator: "toggleJunctionAngles",

               styleMap: new ja_OpenLayers.StyleMap(ja_style)
          });

                ja_wazeMap.addLayer(ja_mapLayer);
                ja_log("version " + junctionangle_version + " loaded.", 0);
               
                ja_log(ja_wazeMap,3);
                ja_log(ja_wazeModel,3);
                ja_log(ja_loginManager,3);
                ja_log(ja_selectionManager,3);
                ja_log(ja_mapLayer,3);
                ja_log(ja_OpenLayers,3);

                //try to resize the layer selection box... Apparently the only (easy) way is to actually override the CSS
                //No longer needed. Commented out.
                //var newSwitcherStyle = $('<style>.WazeControlLayerSwitcher:hover {background-color: #FFFFFF; max-height: 390px; width: 200px;}</style>');
                //$('html > head').append(newSwitcherStyle);
        }
}

function ja_calculate()
{
        //clear old info
        ja_mapLayer.destroyFeatures();

        //try to show all angles for all selected segments
        if(ja_selectionManager.selectedItems.length == 0) return 1;
        ja_log("Checking junctions for " + ja_selectionManager.selectedItems.length + " segments", 1);
        var ja_nodes = [];

        for(i = 0; i < ja_selectionManager.selectedItems.length; i++) {
                ja_log(ja_selectionManager.selectedItems[i],3);
                switch(ja_selectionManager.selectedItems[i].type) {
                        case "node":
                                ja_nodes.push(ja_selectionManager.selectedItems[i].fid);
                                break;
                        case "segment":
                //segments selected?
                                if(ja_selectionManager.selectedItems[i].attributes.fromNodeID != null &&
                                        ja_nodes.indexOf(ja_selectionManager.selectedItems[i].attributes.fromNodeID) == -1) {
                                        ja_nodes.push(ja_selectionManager.selectedItems[i].attributes.fromNodeID);
                                }
                                if(ja_nodes.indexOf(ja_selectionManager.selectedItems[i].attributes.toNodeID != null &&
                                        ja_nodes.indexOf(ja_selectionManager.selectedItems[i].attributes.toNodeID) == -1)) {
                                        ja_nodes.push(ja_selectionManager.selectedItems[i].attributes.toNodeID);
                                }
                                break;
                        default:
                                ja_log("Found unknown item type: " + ja_selectionManager.selectedItems[i].type,1);
                }
        }

        ja_features = [];

        for(i = 0; i < ja_nodes.length; i++) {
                node = ja_wazeModel.nodes.get(ja_nodes[i]);
                if(node == null || !node.hasOwnProperty('attributes')) {
                        //Oh oh.. should not happen?
                        ja_log(ja_nodes,2)
                        ja_log(ja_wazeModel,3)
                        ja_log(ja_wazeModel.nodes,3)
                        continue;
                }
                //check connected segments
                segments = node.attributes.segIDs;
                ja_log(node,2);
               
                //ignore of we have less than 2 segments
                if(segments.length <= 1) {
                        ja_log("Found only " + segments.length + " connected segments at " + ja_nodes[i] + ", not calculating anything...", 2);
                        continue;
                }
               
                ja_log("Calculating angles for " + segments.length + " segments", 2);
               
                angles = new Array();
                selected_segments = 0;

                for(j = 0; j < segments.length; j++) {
                        s = ja_wazeModel.segments.get(segments[j]);
                        a = ja_getAngle(ja_nodes[i], s);
                        ja_log("j: " + j + "; Segment " + segments[j] + " angle is " + a, 3);
                        angles[j] = new Array(a, segments[j], s != null ? s.isSelected() : false);
                        if(s != null ? s.isSelected() : false) selected_segments++;
                }

                ja_log(angles,2);
                //sort angle data (ascending)
                angles.sort(function(a,b){return a[0] - b[0]});
                ja_log(angles,3);
                ja_log(selected_segments,3);

                switch (ja_wazeMap.zoom) {
                        case 9:
                                ja_label_distance = 4;
                                break;
                        case 8:
                                ja_label_distance = 8;
                                break;
                        case 7:
                                ja_label_distance = 15;
                                break;
                        case 6:
                                ja_label_distance = 25;
                                break;
                        case 5:
                                ja_label_distance = 40;
                                break;
                        case 4:
                                ja_label_distance = 80;
                                break;
                        case 3:
                                ja_label_distance = 140;
                                break;
                        case 2:
                                ja_label_distance = 300;
                                break;
                        case 1:
                                ja_label_distance = 400;
                                break;
                }
                ja_log("zoom: " + ja_wazeMap.zoom + " -> distance: " + ja_label_distance, 2);
               
                //if we have two connected segments selected, do some magic to get the turn angle only =)
                if(selected_segments == 2) {
                        ja_selected = [];
                        ja_extra_space_multiplier = 1;
                       
                        for(j = 0; j < angles.length; j++) {
                                if(angles[j][2]) {
                                        ja_selected.push(angles[j]);
                                }
                        }
                       
                        a = ((ja_selected[1][0] - ja_selected[0][0]) + 360) % 360;
                        ha = (360 + (ja_selected[0][0]+ja_selected[1][0])/2) % 360;

                        ja_log(a,3);
                        if(a < 60) {
                                ja_log("Sharp angle", 2);
                                ja_extra_space_multiplier = 2;
                        }

                        if(a > 180) {
                                //a2 = a - 180;
                                ha = ha + 180;
                        }

                       
                        ja_log("Angle between " + ja_selected[0][1] + " and " + ja_selected[1][1] + " is " + a + " and position for label should be at " + ha, 3);

                        //put the angle point
                        ja_features.push(new ja_OpenLayers.Feature.Vector(
                                new ja_OpenLayers.Geometry.Point(
                                        node.geometry.x + (ja_extra_space_multiplier * ja_label_distance * Math.cos((ha*Math.PI)/180)),
                                        node.geometry.y + (ja_extra_space_multiplier * ja_label_distance * Math.sin((ha*Math.PI)/180))
                                        )
                                        , { angle: Math.round(Math.abs(180 - a))+"°", ja_type: "junction" }
                        ));
                }
                else {
                        //get all segment angles
                        for(j = 0; j < angles.length; j++) {
                                a = (360 + (angles[(j+1)%angles.length][0] - angles[j][0])) % 360;
                                ha = (360 + ((a/2) + angles[j][0])) % 360;
                               
                                ja_log("Angle between " + angles[j][1] + " and " + angles[(j+1)%angles.length][1] + " is " + a + " and position for label should be at " + ha, 3);
                                //push the angle point
                                ja_features.push(new ja_OpenLayers.Feature.Vector(
                                        new ja_OpenLayers.Geometry.Point(
                                                node.geometry.x + (ja_label_distance * Math.cos((ha*Math.PI)/180)), node.geometry.y + (ja_label_distance * Math.sin((ha*Math.PI)/180))
                                                )
                                                , { angle: Math.round(a)+"°", ja_type: "generic" }
                                ));
                        }
                }
        }

        ja_log(ja_features, 2);
        //Update the displayed angles
        ja_mapLayer.addFeatures(ja_features);
}

function ja_points_equal(point1, point2) {
        return (point1.x == point2.x && point1.y == point2.y);
}

function ja_get_first_point(segment) {
        return segment.geometry.components[0];
}

function ja_get_last_point(segment) {
        return segment.geometry.components[segment.geometry.components.length-1];
}

function ja_get_second_point(segment) {
        return segment.geometry.components[1];
}

function ja_get_next_to_last_point(segment) {
        return segment.geometry.components[segment.geometry.components.length-2];
}

//get the absolute angle for a segment end point
function ja_getAngle(ja_node, ja_segment) {
        if(ja_node == null || ja_segment == null) return null;
        if(ja_segment.attributes.fromNodeID == ja_node) {
                ja_dx = ja_get_second_point(ja_segment).x - ja_get_first_point(ja_segment).x;
                ja_dy = ja_get_second_point(ja_segment).y - ja_get_first_point(ja_segment).y;
        } else {
                ja_dx = ja_get_next_to_last_point(ja_segment).x - ja_get_last_point(ja_segment).x;
                ja_dy = ja_get_next_to_last_point(ja_segment).y - ja_get_last_point(ja_segment).y;
        }
        ja_log(ja_node + " / " + ja_segment + ": dx:" + ja_dx + ", dy:" + ja_dy);
        ja_angle = Math.atan2(ja_dy,ja_dx);
        return (360+(ja_angle*180/Math.PI))%360;
}

junctionangle_bootstrap();


}

var DLscript = document.createElement("script");
DLscript.textContent =''+
run_ja.toString()+' \n'+
'run_ja();';
DLscript.setAttribute("type", "application/javascript");
document.body.appendChild(DLscript);
Wiki Resources: Map Editing Manual | Oregon Project/To-Do List
Oregon-based US Country Manager | iPhone5 - VZ - iOS 7.0.6 | Waze v3.7.9.992
AlanOfTheBerg
Waze Global Champs
Waze Global Champs
 
Posts: 19472
Joined: Sat Aug 28, 2010 8:48 pm
Location: US Country Manager - Oregon, USA
Has thanked: 649 times
Been thanked: 2249 times

Next

Return to Addons, Extensions, and Scripts

Who is online

Users browsing this forum: No registered users