WME Place NavPoints

Add place entry point indicators to the map

目前為 2019-07-14 提交的版本,檢視 最新版本

// ==UserScript==
// @name         WME Place NavPoints
// @namespace    WazeDev
// @version      2019.07.14.001
// @description  Add place entry point indicators to the map
// @author       MapOMatic
// @include      /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @require      https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
// @grant        none
// ==/UserScript==

/* global W */
/* global OL */
/* global $ */

let _settings = {
    visible: true
};

function drawLines() {
	const t0 = performance.now();
    var layer = W.map.landmarkLayer;
    layer.removeFeatures(layer.getFeaturesByAttribute('isNavLine', true));
	if (_settings.visible && W.map.getZoom() >= 6) {
        var features = [];
		var bounds = W.map.landmarkLayer.getDataExtent();
        W.model.venues.getObjectArray()
			.filter(v => bounds.intersectsBounds(v.geometry.getBounds()))
			.forEach(v => {
            var pts = [];
            pts.push(v.geometry.getCentroid());
            if (v.attributes.entryExitPoints.length) {
                pts.push(v.attributes.entryExitPoints[0].getPoint());
            }
            var s = findClosestSegment(pts[pts.length-1], false, false);
            if (s) {
                pts.push(s.closestPoint);
                var ls = new OL.Geometry.LineString(pts);
                features.push(new OL.Feature.Vector(ls, {isNavLine: true }, {strokeColor: '#0FF', strokeWidth: 2, strokeDashstyle: '6 4'}));
            }
            features.push(new OL.Feature.Vector(pts[pts.length - 1], {isNavLine: true}, {pointRadius: 4, strokeWidth: 2, fillColor: '#A00', strokeColor: '#0FF', fillOpacity: 1}));
    	});
    	layer.addFeatures(features);
    }
    console.log(performance.now() - t0);
}

function findClosestSegment(mygeometry, ignorePLR, ignoreUnnamedPR) {
    let segments = W.model.segments.getObjectArray();
    let minDistance = Infinity;
    let closestSegment;

    for (let idx = 0; idx < segments.length; idx++) {
        let s = segments[idx];

        let { roadType } = s.attributes;

        if (s.isDeleted()) {
            debugger;
            continue;
        }

        if ([10, 16, 18, 19].includes(roadType)) //10 ped boardwalk, 16 stairway, 18 railroad, 19 runway, 3 freeway
            continue;

        if (ignorePLR && roadType === 20) //PLR
            continue;

        if (ignoreUnnamedPR)
            if (roadType === 17 && WazeWrap.Model.getStreetName(s.attributes.primaryStreetID) === null) //PR
                continue;


        let distanceToSegment = mygeometry.distanceTo(s.geometry, { details: true });

        if (distanceToSegment.distance < minDistance) {
            minDistance = distanceToSegment.distance;
            closestSegment = s;
            closestSegment.closestPoint = new OL.Geometry.Point(distanceToSegment.x1, distanceToSegment.y1);
        }
    }
    return closestSegment;
};

function errorHandler(callback) {
    try {
        callback();
    } catch (ex) {
        console.error(ex);
    }
}

function onLayerCheckedChanged(checked) {
    _settings.visible = checked;
    localStorage.setItem('wme_place_navpoints', JSON.stringify(_settings));
    drawLines();
}

function init() {
    var loadedSettings = JSON.parse(localStorage.getItem('wme_place_navpoints'));
    $.extend(_settings, loadedSettings);
    W.model.events.register('mergeend', W.map, () => errorHandler(drawLines));
    W.model.venues.on('objectschanged', () => errorHandler(drawLines));
    W.model.venues.on('objectsadded', () => errorHandler(drawLines));
    W.model.venues.on('objectsremoved', () => errorHandler(drawLines));
    W.model.segments.on('objectschanged', () => errorHandler(drawLines));
    W.model.segments.on('objectsadded', () => errorHandler(drawLines));
    W.model.segments.on('objectsremoved', () => errorHandler(drawLines));
    drawLines();
    WazeWrap.Interface.AddLayerCheckbox('Display', 'Place NavPoints', _settings.visible, onLayerCheckedChanged, null)
}

function bootstrap() {
    if (W && W.map && WazeWrap.Ready) {
        init();
    } else {
        setTimeout(bootstrap, 200);
    }
}

bootstrap();

QingJ © 2025

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