您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Displays WMS layers from Estonia Land Board WMS services (Maa-amet) in WME.
// ==UserScript== // @name WME Eesti Maa-amet WMS kihid // @version 1.0.5 // @author Mikk36, Hapsal_PA. Co authors: (petrjanik, d2-mac, MajkiiTelini) // @description Displays WMS layers from Estonia Land Board WMS services (Maa-amet) in WME. // @include https://*.waze.com/*/editor* // @include https://*.waze.com/editor* // @include https://*.waze.com/map-editor* // @include https://*.waze.com/beta_editor* // @include https://editor-beta.waze.com* // @run-at document-end // @namespace https://gf.qytechs.cn/users/331322 // @source https://github.com/Mikk36/wme-eesti-maaamet-map-layer // ==/UserScript== /** * Changelog: * * 1.0.5 - fix higher zoom levels * 1.0.4 - fixed the visual style * 1.0.3 - fixed the new WME layer switching update * 1.0.2 - fixed layers * 1.0.1 - v2019.08.21 - first version, modifications of "Czech WMS layers". */ /** * */ let W, OpenLayers, I18n; init(); function init(e) { W = unsafeWindow.W; OpenLayers = unsafeWindow.OpenLayers; I18n = unsafeWindow.I18n; if (e && e.user === null) { return; } if (typeof W === "undefined" || typeof W.loginManager === "undefined") { setTimeout(init, 100); return; } if (!W.loginManager.user) { W.loginManager.events.register("login", null, init); W.loginManager.events.register("loginStatus", null, init); } if (document.getElementById("layer-switcher") === null && document.getElementById("layer-switcher-group_display") === null) { setTimeout(init, 200); return; } // Maa-amet (Land Board) service connection const serviceWmsMaaamet = { "type": "WMS", "url": "https://tiles.maaamet.ee/tm/?", "attribution": "Maa-amet", "comment": "Maa-amet WMS" }; // Menu title const groupTogglerWMS = addGroupToggler(false, "layer-switcher-group_wms", "Maa-ameti kihid"); // Layers const layersInfo = [ { key: "kaart", name: "Eesti kaart", zIndex: 200 }, { key: "foto", name: "Ortofoto", zIndex: 200 }, { key: "hybriid", name: "Hübriidkaart", zIndex: 201 } ]; const layerTogglers = {}; for (let i = 0; i < layersInfo.length; i++) { let layerInfo = layersInfo[i]; let mapLayer = addNewLayer(layerInfo.key, serviceWmsMaaamet, layerInfo.key, layerInfo.zIndex); layerTogglers[`wms_${layerInfo.key}`] = addLayerToggler(groupTogglerWMS, layerInfo.name, [mapLayer]); } W.map.events.register("addlayer", null, setZOrdering(layerTogglers)); W.map.events.register("removelayer", null, setZOrdering(layerTogglers)); if (localStorage.WMSLayers) { let JSONStorageOptions = JSON.parse(localStorage.WMSLayers); for (let key in layerTogglers) { if (JSONStorageOptions[key]) { document.getElementById(layerTogglers[key].htmlItem).click(); } } } const saveWMSLayersOptions = () => { if (localStorage) { let JSONStorageOptions = {}; for (let key in layerTogglers) { JSONStorageOptions[key] = document.getElementById(layerTogglers[key].htmlItem).checked; } localStorage.WMSLayers = JSON.stringify(JSONStorageOptions); } }; window.addEventListener("beforeunload", saveWMSLayersOptions, false); } // Layer creation function addNewLayer(id, service, serviceLayers, zIndex) { const newLayer = {}; newLayer.uniqueName = `_${id}`; newLayer.zIndex = (typeof zIndex === "undefined") ? 0 : zIndex; newLayer.layer = new OpenLayers.Layer.WMS( id, service.url, { layers: serviceLayers, transparent: "true", format: "image/png" }, { tileSize: new OpenLayers.Size(256, 256), isBaseLayer: false, visibility: false, transitionEffect: "resize", attribution: service.attribution, uniqueName: newLayer.uniqueName, serverResolutions: [38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627, 0.5971642833948135], resolutions: [38.218514137268066, 19.109257068634033, 9.554628534317017, 4.777314267158508, 2.388657133579254, 1.194328566789627, 0.5971642833948135, 0.29858214169740677, 0.14929107084870338, 0.07464553542435169, 0.037322767712175846], } ); return newLayer; } // Layers menu function addGroupToggler(isDefault, layerSwitcherGroupItemName, layerGroupVisibleName) { let group; if (isDefault === true) { group = document.getElementById(layerSwitcherGroupItemName).parentElement.parentElement; } else { const layerGroupsList = document.getElementsByClassName("list-unstyled togglers")[0]; group = document.createElement("li"); group.className = "group"; const togglerContainer = document.createElement("div"); togglerContainer.className = "toggler layer-switcher-toggler-tree-category"; const divI = document.createElement("i"); divI.className = "toggle-category w-icon w-icon-caret-down"; divI.id = "arrow"; divI.addEventListener("click", listToggle); const spanLabel = document.createElement("wz-toggle-switch"); spanLabel.className = "layer-switcher-group_toggler hydrated toggle"; spanLabel.checked = "true"; spanLabel.id = "maaameti-kihtide-toggle"; const label = document.createElement("label"); label.htmlFor = spanLabel.id; label.className = "label-text"; const togglerChildrenList = document.createElement("ul"); togglerChildrenList.className = "children"; togglerContainer.appendChild(divI); label.appendChild(document.createTextNode(layerGroupVisibleName)); togglerContainer.appendChild(label); togglerContainer.appendChild(spanLabel); group.appendChild(togglerContainer); group.appendChild(togglerChildrenList); layerGroupsList.appendChild(group); } return group; } // Layer submenu function addLayerToggler(groupToggler, layerName, layerArray) { const layerToggler = {}; const layerShortcut = layerName.replace(/ /g, "_").replace(".", ""); layerToggler.htmlItem = `layer-switcher-item_${layerShortcut}`; layerToggler.layerArray = layerArray; const layer_container = groupToggler.getElementsByClassName("children")[0]; layer_container.id = "list"; const layerGroupCheckbox = groupToggler.getElementsByClassName("toggler")[0].getElementsByClassName("toggle")[0]; const toggler = document.createElement("li"); const togglerContainer = document.createElement("div"); togglerContainer.className = "wz-checkbox styledContainer"; togglerContainer.id = layerShortcut; const styled = layerToggler.htmlItem; const checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.id = styled; checkbox.className = "toggle"; const customStyle = document.createElement("style"); document.head.appendChild(customStyle); // Delete old style customStyle.sheet.insertRule(`#layer-switcher-item_${layerShortcut} {position: absolute; opacity: 0; cursor: pointer;height: 0; width: 0}`); // Modify style const checkboxDivBorder = document.createElement("span"); checkboxDivBorder.id = `${layerShortcut}_styledContainer`; checkboxDivBorder.className = "styledCheckbox"; // Add new styles customStyle.sheet.insertRule(` .styledContainer { display: block; position: relative; padding-left: 28px; margin-bottom: 8px; cursor: pointer; user-select: none; }`); customStyle.sheet.insertRule(` .styledCheckbox { position: absolute; left: 0px; height: 18px; width: 18px; border: 2px solid rgb(133, 155, 166); border-radius: 3px; background-color: white }`); customStyle.sheet.insertRule(` .styledContainer input:checked ~ .styledCheckbox { background-color: rgb(0, 164, 235); border: 2px solid rgb(0, 164, 235) }`); customStyle.sheet.insertRule(` .styledContainer input[disabled]:checked ~ .styledCheckbox { background-color: #ccc; border: 2px solid #ccc }`); customStyle.sheet.insertRule(` .styledContainer input[disabled] ~ .styledCheckbox { border: 2px solid #ccc }`); customStyle.sheet.insertRule(` .styledCheckbox:after { content: " "; position: absolute; display: none; }`); customStyle.sheet.insertRule(` .styledContainer input:checked ~ .styledCheckbox:after { display: block }`); customStyle.sheet.insertRule(` .styledContainer .styledCheckbox:after { left: 5px; top: 1px; width: 5px; height: 9px; border: solid white; border-width: 0 1px 1px 0; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg) }`); // customStyle.sheet.insertRule("#toggle input:disabled {opacity: 0.3}"); const label = document.createElement("label"); label.innerHTML = ` ${layerName}`; label.htmlFor = checkbox.id; label.appendChild(checkbox); label.appendChild(checkboxDivBorder); togglerContainer.appendChild(label); toggler.appendChild(togglerContainer); layer_container.appendChild(toggler); for (let i = 0; i < layerArray.length; i++) { checkbox.addEventListener("click", layerTogglerEventHandler(layerArray[i].layer)); layerGroupCheckbox.addEventListener("click", layerTogglerGroupEventHandler(checkbox, layerArray[i].layer)); } return layerToggler; } // Adds a layer function layerTogglerEventHandler(layer) { return function () { if (this.checked) { W.map.addLayer(layer); layer.setVisibility(this.checked); } else { layer.setVisibility(this.checked); W.map.removeLayer(layer); } }; } // Opens/closes all layers at once function layerTogglerGroupEventHandler(checkbox, layer) { return function () { if (this.checked) { if (checkbox.checked) { W.map.addLayer(layer); layer.setVisibility(this.checked & checkbox.checked); } } else { if (checkbox.checked) { layer.setVisibility(this.checked & checkbox.checked); W.map.removeLayer(layer); } } checkbox.disabled = !this.checked; }; } // Open/close submenu function listToggle() { document.getElementById("arrow").classList.toggle("upside-down"); const listDisplay = document.getElementById("list"); if (listDisplay.style.display === "none") { listDisplay.style.display = "block"; } else { listDisplay.style.display = "none"; } } // Configure proper Z-order for a layer function setZOrdering(layerTogglers) { return function () { for (let key in layerTogglers) { if (!layerTogglers.hasOwnProperty(key)) { continue; } for (let j = 0; j < layerTogglers[key].layerArray.length; j++) { if (layerTogglers[key].layerArray[j].zIndex > 0) { let l = W.map.getLayersBy("uniqueName", layerTogglers[key].layerArray[j].uniqueName); if (l.length > 0) { l[0].setZIndex(layerTogglers[key].layerArray[j].zIndex); } } } } }; }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址