WME COL Basemap

Adds aerials from the COL GIS as a basemap for WME

目前為 2023-03-20 提交的版本,檢視 最新版本

// ==UserScript==
// @name         WME COL Basemap
// @namespace    https://fxzfun.com/
// @version      2.2
// @description  Adds aerials from the COL GIS as a basemap for WME
// @author       FXZFun
// @match        https://*.waze.com/*/editor*
// @match        https://*.waze.com/editor*
// @exclude      https://*.waze.com/user/editor*
// @connect      query.cityoflewisville.com
// @icon         https://www.google.com/s2/favicons?sz=64&domain=waze.com
// @require      https://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
// @grant        GM_xmlhttpRequest
// @license      GNU GPLv3
// ==/UserScript==

/* global W, OL, WazeWrap */

(function() {
    'use strict';

    var errorOccurred;
    var colBasemap;
    var layerEnabled = false;
    var currentDate;

    /*
        Query COL web service and retrieve ticket and latest dates
    */
    function getTicket() {
        GM_xmlhttpRequest({
            method: 'GET',
            url: "https://query.cityoflewisville.com/v2/?webservice=NearmapTicketAndDates",
            onload: function(r) {
                var json = JSON.parse(r.response);
                localStorage.setItem("wmecolbasemap-ticket", json[0][0].ticket);
                localStorage.setItem("wmecolbasemap-aerialDates", json[0][0].aerialdates);
                localStorage.setItem("wmecolbasemap-mostRecentDate", JSON.parse(json[0][0].aerialdates)[0].date);
                if (colBasemap == null) addLayer()
                else colBasemap?.redraw();
            }
        });
    }

    /*
        Add the layer to the map if it does not exist
    */
    function addLayer() {
        var ticket = localStorage.getItem("wmecolbasemap-ticket");
        var date = localStorage.getItem("wmecolbasemap-mostRecentDate");

        // retrieve new ticket
        if (ticket == null || date == null) return getTicket();

        if (colBasemap == null) {
            colBasemap = new OL.Layer.XYZ(
                'COL GIS Basemap',
                "https://us0.nearmap.com/maps/?z=${z}&x=${x}&y=${y}&nml=V&version=2&nmd=" + date.replaceAll(".", "") + "&ticket=" + ticket,
                {
                    isBaseLayer: false,
                    uniqueName: 'colgis',
                    tileSize: new OL.Size(256,256),
                    transitionEffect: 'resize',
                    displayInLayerSwitcher: true,
                    opacity: 1,
                    visibility: false,
                    tileOptions: {
                        eventListeners: {
                            'loaderror': function(evt) {
                                if (!errorOccurred) {
                                    console.log("WME COL Basemap: Error loading");
                                    errorOccurred = true;
                                    getTicket();
                                }
                            }
                        }
                    }
                });
            W.map.addLayer(colBasemap);
            W.map.setLayerIndex(colBasemap, 3);
        } else {
            colBasemap.url = "https://us0.nearmap.com/maps/?z=${z}&x=${x}&y=${y}&nml=V&version=2&nmd=" + date.replaceAll(".", "") + "&ticket=" + ticket;
            colBasemap.redraw();
        }
    }

    /*
        Add the date picker ui element to the top left of the map
    */
    function addDatePicker() {
        var select = document.createElement("select");
        select.id = "wmecolbasemap-datePicker";
        select.style = "position: absolute;top: 40px;left: 60px;";
        select.onchange = function () {
            changeCOLDate(select.value);
        }

        var dates = JSON.parse(localStorage.getItem("wmecolbasemap-aerialDates"));
        dates.forEach(d => {
            select.innerHTML += "<option>" + d.date + "</option>";
        });
        document.querySelector(".olMap").appendChild(select);
        if (currentDate != null) select.value = currentDate;
    }

    /*
        Callback for the date picker, changes the imagery date
    */
    function changeCOLDate(date) {
        if(colBasemap) {
            colBasemap.url = "https://us0.nearmap.com/maps/?z=${z}&x=${x}&y=${y}&nml=V&version=2&nmd=" + date.replaceAll(".", "") + "&ticket=" + localStorage.getItem("wmecolbasemap-ticket");
            colBasemap.redraw();

            currentDate = date;

            // temporarily disable selector while loading new imagery
            document.getElementById("wmecolbasemap-datePicker").disabled = "disabled";
            setTimeout(() => {
                document.getElementById("wmecolbasemap-datePicker").disabled = null;
            }, 3000);
        }
    }

    /*
        Callback for shortcut and layer checkbox, toggles the visibility of the layer
    */
    function toggleBasemap() {
        layerEnabled = !layerEnabled;
        colBasemap?.setVisibility(layerEnabled);
        document.querySelector("#layer-switcher-item_col_gis_basemap").checked = layerEnabled;
        // toggles date picker
        if (layerEnabled) addDatePicker();
        else document.getElementById("wmecolbasemap-datePicker").remove();
    }

    /*
        Main entry point of the script
        Adds layer checkbox, shortcut, and layer
    */
    function initialize() {
        console.log("WME COL Basemap: Start");

        addLayer();

        WazeWrap.Interface.AddLayerCheckbox(
            "display",
            "COL GIS Basemap",
            false,
            toggleBasemap,
            colBasemap ?? W.map.getLayerByName("WME COL Basemap"));

        new WazeWrap.Interface.Shortcut('COLBasemapDisplay', 'Toggle COL Basemap',
                                        'layers', 'layersToggleCOLBasemapDisplay', "Shift+Q", toggleBasemap, null).add();
    }

    // new wme scripts api
    W?.userscripts?.state?.isReady ? initialize() : document.addEventListener("wme-ready", initialize, { once: true });
})();

QingJ © 2025

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