[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: Unholy, bextein

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 tkr85 » Mon Sep 29, 2014 7:04 pm

Working Version :)
Based on code from milkboy's GitHub.
What was fixed ?
In general:
Code: Select all
selectedItems[i].attributes   => selectedItems[i].model.attributes

and some minor changes.


Code: Select all
// ==UserScript==
// @name                WME Junction Angle info
// @namespace           http://userscripts.org/users/508112
// @description         Show the angle between two selected (and connected) segments
// @include             /^https:\/\/(www|editor-beta)\.waze\.com\/(.{2,6}\/)?editor\/.*$/
// @version             1.5.9.1
// @grant               none
// @copyright      2013 Michael Wikberg <michael@wikberg.fi>
// @license CC-BY-NC-SA
// ==/UserScript==

/**
 * Copyright 2014 Michael Wikberg <waze@wikberg.fi>
 * WME Junction Angle Info extension is licensed under a Creative Commons
 * Attribution-NonCommercial-ShareAlike 3.0 Unported License.
 *
 * Contributions by:
 *     2014 Paweł Pyrczak "tkr85" <support@pyrczak.pl>
 *     2014 "AlanOfTheBerg" <alanoftheberg@gmail.com>
 *     2014 "berestovskyy" <?>
 */

function run_ja() {

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

    function ja_bootstrap() {
        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_bootstrap, 1000);
            }
        } catch (err) {
            setTimeout(ja_bootstrap, 1000);
        }
    }

    function ja_log(ja_log_msg, ja_log_level) {
        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() {

        //Listen for selected nodes change event
        window.Waze.selectionManager.events.register("selectionchanged", null, ja_calculate);

        window.Waze.model.segments.events.on({
            "objectschanged": ja_calculate,
            "objectsremoved": ja_calculate
        });
        window.Waze.model.nodes.events.on({
            "objectschanged": ja_calculate,
            "objectsremoved": ja_calculate
        });

        //HTML changes after login, even though the page is not reloaded. Better do init again.
        window.Waze.loginManager.events.register("afterloginchanged", null, junctionangle_init);

        /**
         * Make some style settings
         */
        var ja_style = new window.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"
                    }
                })
            ]
        });

        //Add support for translations. Default (and fallback) is "en".
        //Note, don't make typos in "acceleratorName", as it has to match the layer name (with whitespace removed
        // to actually work. Took me a while to figure that out...
        I18n.translations.en.layers.name["junction_angles"] = "Junction Angles";

        switch(window.I18n.locale) {
            case 'sv':
                I18n.translations.sv.layers.name["junction_angles"] = "Korsningsvinklar";
                break;
            case 'fi':
                I18n.translations.fi.layers.name["junction_angles"] = "Risteyskulmat";
                break;
        }

        layername = I18n.translate("layers.name.junction_angles","bar");

        //try to see if we already have a layer
        if (window.Waze.map.getLayersBy("uniqueName","junction_angles").length == 0) {

            // Create a vector layer and give it your style map.
            ja_mapLayer = new window.OpenLayers.Layer.Vector(layername, {
                displayInLayerSwitcher: true,
                uniqueName: "junction_angles",
                shortcutKey: "S+j",
                accelerator: "toggle" + layername.replace(/\s+/g,''),
                className: "junction-angles",
                styleMap: new window.OpenLayers.StyleMap(ja_style)
            });

            window.Waze.map.addLayer(ja_mapLayer);
            ja_log("version " + junctionangle_version + " loaded.", 0);

            ja_log(window.Waze.map, 3);
            ja_log(window.Waze.model, 3);
            ja_log(window.Waze.loginManager, 3);
            ja_log(window.Waze.selectionManager, 3);
            ja_log(ja_mapLayer, 3);
            ja_log(window.OpenLayers, 3);
        } else {
            ja_log("Oh, nice.. We already had a layer?", 3);
        }
    }

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

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

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

        ja_features = [];

        for (i = 0; i < ja_nodes.length; i++) {
            node = window.Waze.model.nodes.get(ja_nodes[i]);
            if (node == null || !node.hasOwnProperty('attributes')) {
                //Oh oh.. should not happen?
                ja_log("Oh oh.. should not happen?",1);
                ja_log(ja_nodes, 2);
                ja_log(window.Waze.model, 3);
                ja_log(window.Waze.model.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 = [];
            selected_segments = 0;

            for (j = 0; j < segments.length; j++) {
                s = window.Waze.model.segments.get(segments[j]);
                a = ja_getAngle(ja_nodes[i], s);
                ja_log("j: " + j + "; Segment " + segments[j] + " angle is " + a, 3);
                angles[j] = [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 (window.Waze.map.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: " + window.Waze.map.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 window.OpenLayers.Feature.Vector(
                    new window.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 window.OpenLayers.Feature.Vector(
                        new window.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;
    }

    ja_bootstrap();
}

//Dynamically create, add and run the script in the real page context
var DLscript = document.createElement("script");
DLscript.textContent = '' +
    run_ja.toString() + ' \n' +
    'run_ja();';
DLscript.setAttribute("type", "application/javascript");
document.body.appendChild(DLscript);



EDIT:
http://pyrczak.pl/j-A_160864.user.js
ImageImage
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 137 times

Re: [script] WME Junction Angle Info

Postby tkr85 » Tue Mar 11, 2014 8:08 pm

Try AlanOfTheBerg 1.5.7.3 version. If still problems try one of this (CRX for Chrome):
http://pyrczak.pl/j-A_160864.user.js (Tampermonkey/Greasemoneky) -- strongly prefered !!!
http://pyrczak.pl/j-A.crx (Save on disk, then drag&drop to Chrome/Chromium Extensions Tab)
If there are still problems, please specify witch browser you using, and do you use greasemonkey/tempermonkey.
ImageImage
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 137 times

Re: [script] WME Junction Angle Info

Postby tkr85 » Thu Feb 13, 2014 12:37 pm

tonestertm wrote:Maybe I shouldn't say anything, but my CWS 1.5.6 is still working along with Validator, CH, URO+, JNF standalone, Toolbox and Route Checker. (All latest)

Propably one of those extensions add some workaround for code changes in WME, and do something like
Code: Select all
unsafeWindow.wazeMap = unsafeWindow.Waze.map
etc.

Original, unmodified WME Junction Angle info, without any other extension can't work.
ImageImage
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 137 times

Re: [script] WME Junction Angle Info

Postby tkr85 » Mon Feb 10, 2014 9:11 pm

Fixed version by me: http://pyrczak.pl/j-A_160864.user.js
Tested and should work on Firefox and Chrome/Chromium (On my Chromium i don't even need TemperMonkey, just drag&drop to extensions window)
License the same as this on github: CC-BY-NC-SA.
Original Author: Michael Wikberg

How to fix your version without installing mine ?
Code: Select all
change from => to
wazeMap => Waze.map
wazeModel => Waze.model
loginManager => Waze.loginManager
selectionManager => Waze.selectionManager


Edit:
.crx for Chrome/Chromium http://pyrczak.pl/j-A.crx (Save file on disk, open Extension Tab (chrome://extensions) and drag&drop this file)
Last edited by tkr85 on Sat Mar 01, 2014 9:15 pm, edited 1 time in total.
ImageImage
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 137 times

Re: [script] WME Junction Angle Info

Postby tkr85 » Sun Feb 09, 2014 11:45 am

berestovskyy wrote:The script is copyrighted. I guess we have to ask a permission first, no?

https://github.com/milkboy/WME-ja
Licensed under CC-BY-NC-SA , so script "remix" must be licensed under the same license;. Of course "remixing" or "fixing" is possible, and in my opinion not violate any copyrights.
ImageImage
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 137 times

Re: [script] WME Junction Angle Info

Postby Timbones » Tue Jun 30, 2015 11:34 am

PesachZ wrote:Can you please list the criteria as you know it for the algorithm to generate this 2 segment uturn prompt, I will try to incorporate it into the algorithm and flowchart in the wiki.

Do we know yet whether this prompt takes into account the segment name, the directionality, and whether it's a right-hand or left-hand drive country? I can think of some scenarios where it would be undesirable to have a U-turn instruction, and we should take this up with Waze if this is the case.
Timbones(6) • UK Coordinator • Forum Moderator • Global Wiki Moderator • Routing Expert
Extensions: WME Colour HighlightsWME Route TesterWME Geometries
Timbones
Coordinators
Coordinators
 
Posts: 6809
Joined: Wed Feb 09, 2011 10:33 am
Location: York, UK
Has thanked: 990 times
Been thanked: 2734 times

Re: [Script] WME Junction Angle Info

Postby TheLastTaterTot » Sat Nov 28, 2015 10:26 pm

I'm not using the beta version of JAI, so I don't know if this has already been fixed... There seems to be a bug with estimating roundabout instructions (normal vs nonnormal). WME Roundabout Angles provides the correct predictions, but JAI's prediction is incorrect, even though the angle estimation looks to be correct (see attached screenshot).

https://www.waze.com/editor/?env=row&lo ... ,143818860


Also, if I may offer a suggestion here—the "show roundabout" overlay feature for normal vs nonnormal roundabouts should be removed or limited to only normal roundabouts. Since a nonnormal roundabout has the potential to give either normal or nonnormal instructions depending on approach direction, highlighting the entire roundabout as nonnormal has a high potential to confuse editors on roundabout rules.

That being said, I really appreciate this tool! It goes without saying that JAI provides an instrumental function and should be in any good map editor's toolbox. Thanks so much for volunteering time to work on it.
Attachments
Screen Shot 2015-11-28 at 5.11.47 PM.png
Angle is 111º, which should produce nonnormal instructions.
Screen Shot 2015-11-28 at 5.11.47 PM.png (213.83 KiB) Viewed 1138 times
R5 | RI SM | CA, MA & NY AM | Mentor
TheLastTaterTot
Wiki Master
Wiki Master
 
Posts: 480
Joined: Sat Feb 21, 2015 6:46 am
Location: RI, USA
Has thanked: 300 times
Been thanked: 315 times

Re: [Script] WME Junction Angle Info

Postby taco909 » Tue May 24, 2016 3:24 am

Seems to be working okay here on Firefox
-- Rich
ImageImageImage
taco909
Map Editor - Level 4
Map Editor - Level 4
 
Posts: 2230
Joined: Sun Jun 01, 2014 4:05 am
Location: Los Angeles Area
Has thanked: 716 times
Been thanked: 643 times

Re: [Script] WME Junction Angle Info

Postby taco909 » Fri Mar 04, 2016 5:53 am

95 + 75 is 170
But I see what you mean.

The angle is displayed differently when you select two segments vs one segment.
The turn angle is obviously over 90 degrees, yet is displayed as 75 rather than 104.
-- Rich
ImageImageImage
taco909
Map Editor - Level 4
Map Editor - Level 4
 
Posts: 2230
Joined: Sun Jun 01, 2014 4:05 am
Location: Los Angeles Area
Has thanked: 716 times
Been thanked: 643 times

Re: [Script] WME Junction Angle Info

Postby taco909 » Thu Nov 12, 2015 2:14 am

I'm not getting the u-turn notes on mine other than Bowties.

Strange as I can turn off all of the JAI references and I still have a tab, and it seems to be checked on the WME pulldown after reloading... Uncheck it turns off all JAI, then turns back on after a reload even though it's disabled in the Greasemonkey pulldown.

Was JAI incorporated into TB?

Edit: Found it.
1.10 had been installed as an Extension.

Edit II: Confirmed only the Development version is running and I'm only getting the normal 8 dots when selecting a 13m crossover on an "H"
-- Rich
ImageImageImage
taco909
Map Editor - Level 4
Map Editor - Level 4
 
Posts: 2230
Joined: Sun Jun 01, 2014 4:05 am
Location: Los Angeles Area
Has thanked: 716 times
Been thanked: 643 times

PreviousNext

Return to Addons, Extensions, and Scripts

Who is online

Users browsing this forum: b0b2, dfortney, dspille, Glodenox, itzwolf, turnertr