WME True Segment Length

Displays geodesic segment length in feet & meters

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         WME True Segment Length
// @namespace    https://greasyfork.org/users/30701-justins83-waze
// @version      2026.04.20.02
// @description  Displays geodesic segment length in feet & meters
// @author       JustinS83
// @include      https://www.waze.com/editor*
// @include      https://www.waze.com/*/editor*
// @include      https://beta.waze.com/*
// @exclude      https://www.waze.com/user/editor*
// @grant        none
// @require      https://cdn.jsdelivr.net/npm/@turf/turf@7/turf.min.js
// @license      GPLv3
// ==/UserScript==

/* global W */
/* global OL */
/* ecmaVersion 2017 */
/* global $ */
/* global _ */
/* eslint curly: ["warn", "multi-or-nest"] */

(function() {

    let sdk;
    const ObjectTypes = Object.freeze({
        SEGMENT: 'segment',
        PLACE: 'venue'});

    async function bootstrap() {
        await window.SDK_INITIALIZED;
        sdk = getWmeSdk({ scriptId: 'wme-tsl', scriptName: 'WME True Segment Length' });
        await sdk.Events.once({ eventName: 'wme-ready' });

        init();
    }

    bootstrap();

    function init(){
        sdk.Events.on({ eventName: 'wme-selection-changed', eventHandler: waitAndUpdate });
        sdk.Events.on({ eventName: 'wme-after-edit', eventHandler: waitAndUpdate });
        sdk.Events.on({ eventName: 'wme-after-undo', eventHandler: waitAndUpdate });
        sdk.Events.on({ eventName: 'wme-after-redo-clear', eventHandler: waitAndUpdate });
        sdk.Events.on({ eventName: 'wme-no-edits', eventHandler: waitAndUpdate });
        console.log("WME True Segment Length" + GM_info.script.version);
    }

    async function waitAndUpdate(){
        await new Promise(r => setTimeout(r, 150));
        updateDisplay();
    }

    function updateDisplay(){
        let selection = sdk.Editing.getSelection();
        if(selection && selection?.ids.length > 0 && selection.objectType == ObjectTypes.SEGMENT){
            var count = selection.ids.length;
            var bold = false;

            const metersLength = selection.ids.reduce((total, id) => {
                const seg = sdk.DataModel.Segments.getById({segmentId: id});
                if(!seg) return total;
                return total + turf.length(seg.geometry, {units:'meters'});
            }, 0);

            if(metersLength >0){
                var isUSA = sdk.Settings.getRegionCode() === 'usa';
                var ftLength = Math.round(metersLength * 3.28084 *100)/100;
                var milesLength = Math.round(ftLength/5280 *1000)/1000;

                if(selection.ids[0] < 0){ //segment has not yet been saved
                    var list = $('#segment-edit-general > div > ul')[0];
                    var newItem = document.createElement("LI");
                    var textnode = document.createTextNode("Length: " + metersLength +" m");
                    newItem.appendChild(textnode);
                    list.insertBefore(newItem, list.childNodes[0]);

                    if(isUSA){
                        newItem = document.createElement("LI");
                        textnode = document.createTextNode(`Length: ${ftLength} ft (${milesLength} miles)`);
                        newItem.appendChild(textnode);
                        list.insertBefore(newItem, list.childNodes[0]);
                    }
                }
                else{
                    try
                    {
                        $('#segment-edit-general > div > ul > li:nth-child(1) > span')[1].innerHTML = (Math.round(metersLength*100)/100) + " m";
                        if($('#segment-edit-general > div > ul > li:nth-child(1) > span').length === 2 && isUSA)
                            $('#segment-edit-general > div > ul > li:nth-child(1)').append(`<br/><span class="name">Length: </span><span class="value">${ftLength} ft</span><span class="value"> (${milesLength} miles)</span>`);
                        if(bold){
                            $('#segment-edit-general > div > ul > li:nth-child(1) > span').css('font-weight', "bold");
                            if(isUSA)
                                $('#segment-edit-general > div > ul > li:nth-child(2) > span').css('font-weight', "bold");
                        }
                    }
                    catch(ex)
                    {

                    }
                }
            }
        }
    }

})();