[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, Glodenox, JustinS83

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 » 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.
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 138 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.
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 138 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.
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 138 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.
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 138 times

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
tkr85
Area Manager
Area Manager
 
Posts: 161
Joined: Sat Jan 01, 2011 1:05 am
Has thanked: 42 times
Been thanked: 138 times

Re: [script] WME Junction Angle Info

Postby tonestertm » Thu Feb 13, 2014 3:45 am

Looking forward to one of the updates I think I see in the code. :)

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)
Chrome Version 32.0.1700.107 m

Or, were you guys talking about Beta?
[ img ]
ARC for SW Region, USA
Global Champ, US Local Champ
The best editors Read the Wiki and read it often. Learn the proper way to handle URs. Don't draw another Place until you read this!
tonestertm
US Waze Champs
US Waze Champs
 
Posts: 1297
Joined: Wed Nov 14, 2012 12:02 pm
Location: City of...um, Angels, CA, USA
Has thanked: 529 times
Been thanked: 901 times

Re: [script] WME Junction Angle Info

Postby tonestertm » Thu Feb 20, 2014 5:15 am

For those of us who REALLY wish we knew jScript, when saving the code into xxx. user. js, should it be saved as plain text, and which Unicode?

I blame any errors on tapatalk... :)
[ img ]
ARC for SW Region, USA
Global Champ, US Local Champ
The best editors Read the Wiki and read it often. Learn the proper way to handle URs. Don't draw another Place until you read this!
tonestertm
US Waze Champs
US Waze Champs
 
Posts: 1297
Joined: Wed Nov 14, 2012 12:02 pm
Location: City of...um, Angels, CA, USA
Has thanked: 529 times
Been thanked: 901 times

Re: [Script] WME Junction Angle Info

Postby TSD66 » Sun Aug 25, 2019 8:35 pm

I just noticed that for a median U-turn prevention there is no more double angle information when IN and OUT are local streets only, still they show up if IN and OUT are primary or higher.
Is this a bug in the current script version or were the rules changed for median U-turn prevention?
Area Manager FF/MOL/LOS/SPN/CB
State Manager Brandenburg & Berlin
Country Manager Germany
TSD66
Waze Local Champs
Waze Local Champs
 
Posts: 3538
Joined: Sat Oct 24, 2015 9:04 am
Has thanked: 843 times
Been thanked: 1944 times

Re: [Script] WME Junction Angle Info

Postby turbomkt » Thu Mar 03, 2016 11:55 pm

Can someone corroborate something for me? On an H intersection, if I select the cross segment it shows the inside angles for all of the segments connected. When I select the three segments that make up a u-turn it looks like JAI calculates the angles for the three segments wrong. Is anyone seeing the same?

By my math the interior angles should be 190, JAI says 170.
https://www.waze.com/editor/?env=usa&lo ... ueFilter=1

Or I could be looking at this all wrong...
turbomkt
US Waze Champs
US Waze Champs
 
Posts: 1249
Joined: Thu Jan 22, 2015 1:05 am
Location: San Diego, Ca
Has thanked: 478 times
Been thanked: 347 times

Re: [Script] WME Junction Angle Info

Postby turbomkt » Fri Mar 04, 2016 6:05 am

taco909 wrote: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.


That's the key. The 105 degrees when individually selected shows as 75 when part of multiple selected segments and the 85 degrees individually is shown as 95. In the end it's still accurate to determine +/- 5 degrees for u-turns, but it threw me for a loop.
turbomkt
US Waze Champs
US Waze Champs
 
Posts: 1249
Joined: Thu Jan 22, 2015 1:05 am
Location: San Diego, Ca
Has thanked: 478 times
Been thanked: 347 times

PreviousNext

Return to Addons, Extensions, and Scripts

Who is online

Users browsing this forum: No registered users