Czech WMS layers

Displays layers from Czech WMS services (ČÚZK) in WME

اعتبارا من 25-09-2019. شاهد أحدث إصدار.

// ==UserScript==
// @name			Czech WMS layers
// @version			2019.09.25
// @authorCZ		petrjanik, d2-mac, MajkiiTelini
// @description		Displays layers from Czech WMS services (ČÚZK) in WME
// @include			/^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @run-at			document-end
// @namespace		https://greasyfork.dpdns.org/cs/users/135686
// ==/UserScript==

var W;
var OL;
var I18n;
init();

function init(e) {
	W = unsafeWindow.W;
	OL = unsafeWindow.OL;
	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;
	}
	// adresy WMS služeb
	var service_wms_orto = {"type" : "WMS", "url" : "https://geoportal.cuzk.cz/WMS_ORTOFOTO_PUB/WMService.aspx?", "attribution" : "ČUZK Ortofoto", "comment" : "ČUZK ortofoto"};
	var service_wms_katastr = {"type" : "WMS", "url" : "https://services.cuzk.cz/wms/wms.asp?", "attribution" : "ČUZK Katastrální mapy", "comment" : "ČUZK katastr"};
	var service_wms_inspire = {"type" : "WMS", "url" : "https://services.cuzk.cz/wms/inspire-ad-wms.asp?", "attribution" : "ČUZK INSPIRE", "comment" : "ČUZK čísla popisná a orientační + názvy ulic"};
	var service_wms_zabaged = {"type" : "WMS", "url" : "https://ags.cuzk.cz/arcgis/services/ZABAGED/MapServer/WMSServer?", "attribution" : "ČUZK ZABAGED®", "comment" : "ČUZK Doprava, Lesy, Vodní plochy"};
	//skupina vrstev v menu
	var groupTogglerWMS = addGroupToggler(false, "layer-switcher-group_wms", "WMS ČÚZK");
	//vrstvy v menu
	var layerTogglers = {};
	layerTogglers.wms_verejne = addLayerToggler(groupTogglerWMS, "Veřejné budovy", [addNewLayer("wms_verejne", service_wms_zabaged, "29,44,142,143")]);
	layerTogglers.wms_lesvoda = addLayerToggler(groupTogglerWMS, "Lesy a vodstva", [addNewLayer("wms_lesvoda", service_wms_zabaged, "0,1,2,9,53,54,55,56,57,58,113,171,172,173,174,175,176,177,178,179", 201)]);
	layerTogglers.wms_cesty = addLayerToggler(groupTogglerWMS, "Místní cesty", [addNewLayer("wms_cesty", service_wms_zabaged, "83,85,86,88,97,98")]);
	layerTogglers.wms_orto = addLayerToggler(groupTogglerWMS, "Ortofoto ČUZK", [addNewLayer("wms_orto", service_wms_orto, "GR_ORTFOTORGB", 200)]);
	layerTogglers.wms_katastr = addLayerToggler(groupTogglerWMS, "Katastrální mapa", [addNewLayer("wms_katastr", service_wms_katastr, "hranice_parcel,dalsi_p_mapy,RST_KN")]);
	layerTogglers.wms_budovy = addLayerToggler(groupTogglerWMS, "Adresní místa 1a", [addNewLayer("wms_budovy", service_wms_inspire, "AD.Addresses.Text.AddressNumber,AD.Addresses.ByPrefixNumber.TypOfBuilding.2,AD.Addresses.ByPrefixNumber.TypOfBuilding.1", 0)]);
	layerTogglers.wms_budovy_b = addLayerToggler(groupTogglerWMS, "Adresní místa 1b", [addNewLayer("wms_budovy_b", service_wms_inspire, "AD.Addresses.Text.AddressAreaName,AD.Addresses.Text.ThoroughfareName")]);

	W.map.events.register("addlayer", null, setZOrdering(layerTogglers));
	W.map.events.register("removelayer", null, setZOrdering(layerTogglers));

	if (localStorage.WMSLayers) {
		var JSONStorageOptions = JSON.parse(localStorage.WMSLayers);
		for (var key in layerTogglers) {
			if (JSONStorageOptions[key]) {
				document.getElementById(layerTogglers[key].htmlItem).click();
			}
		}
	}
	var saveWMSLayersOptions = function() {
		if (localStorage) {
			var JSONStorageOptions = {};
			for (var key in layerTogglers) {
				JSONStorageOptions[key] = document.getElementById(layerTogglers[key].htmlItem).checked;
			}
			localStorage.WMSLayers = JSON.stringify(JSONStorageOptions);
		}
	};
	window.addEventListener("beforeunload", saveWMSLayersOptions, false);
}

function addNewLayer(id, service, serviceLayers, zIndex) {
	var newLayer = {};
	newLayer.uniqueName = "_" + id;
	newLayer.zIndex = (typeof zIndex === 'undefined') ? 0 : zIndex;
	newLayer.layer = new OL.Layer.WMS(
		id, service.url,
		{
			layers: serviceLayers ,
			transparent: "true",
			format: "image/png"
		},
		{
			tileSize: new OL.Size(512,512),
			isBaseLayer: false,
			visibility: false,
			transitionEffect: "resize",
			attribution: service.attribution,
			uniqueName: newLayer.uniqueName,
			projection: new OL.Projection("EPSG:3857") //alternativa defaultní EPSG:900913, ale není dostupný ve všech službách
		}
	);
	return newLayer;
};

function addGroupToggler(isDefault, layerSwitcherGroupItemName, layerGroupVisibleName) {
	var group;
	if (isDefault === true) {
		group = document.getElementById(layerSwitcherGroupItemName).parentElement.parentElement.parentElement.parentElement;
	}
	else {
		var layerGroupsList = document.getElementsByClassName("list-unstyled togglers")[0];
		group = document.createElement("li");
		group.className = "group";
		var togglerContainer = document.createElement("div");
		togglerContainer.className = "layer-switcher-toggler-tree-category";
		var iCaretDown = document.createElement("i");
		iCaretDown.className = "toggle-category w-icon-caret-down";
		iCaretDown.dataset.groupId = layerSwitcherGroupItemName.replace("layer-switcher-", "").toUpperCase();
		iCaretDown.addEventListener("click", layerTogglerGroupMinimizerEventHandler(iCaretDown));
		var togglerSwitch = document.createElement("span");
		togglerSwitch.className = "wz-toggle-switch";
		var labelSwitch = document.createElement("label");
		labelSwitch.className = "wz-switch";
		var checkbox = document.createElement("input");
		checkbox.className = "toggleSwitch";
		checkbox.id = layerSwitcherGroupItemName;
		checkbox.type = "checkbox";
		checkbox.checked = "true";
		var slider = document.createElement("span");
		slider.className = "wz-slider";
		var label = document.createElement("label");
		label.htmlFor = checkbox.id;
		label.className = "label-text";
		var togglerChildrenList = document.createElement("ul");
		togglerChildrenList.className = "collapsible-" + layerSwitcherGroupItemName.replace("layer-switcher-", "").toUpperCase();
		label.appendChild(document.createTextNode(layerGroupVisibleName));
		labelSwitch.appendChild(checkbox);
		labelSwitch.appendChild(slider);
		togglerSwitch.appendChild(labelSwitch);
		togglerContainer.appendChild(iCaretDown);
		togglerContainer.appendChild(togglerSwitch);
		togglerContainer.appendChild(label);
		group.appendChild(togglerContainer);
		group.appendChild(togglerChildrenList);
		layerGroupsList.appendChild(group);
	}
	return group;
};

function addLayerToggler(groupToggler, layerName, layerArray) {
	var layerToggler = {};
	var layerShortcut = layerName.replace(/ /g, "_").replace(".", "");
	layerToggler.htmlItem = "layer-switcher-item_" + layerShortcut;
	layerToggler.layerArray = layerArray;
	var layer_container = groupToggler.getElementsByTagName("UL")[0];
	var layerGroupCheckbox = groupToggler.getElementsByClassName("layer-switcher-toggler-tree-category")[0].getElementsByClassName("wz-toggle-switch")[0].getElementsByClassName("wz-switch")[0].getElementsByClassName("toggleSwitch")[0];
	var toggler = document.createElement("li");
	var togglerContainer = document.createElement("div");
	togglerContainer.className = "wz-checkbox";
	var checkbox = document.createElement("input");
	checkbox.type = "checkbox";
	checkbox.id = layerToggler.htmlItem;
	checkbox.className = "toggle";
	checkbox.disabled = !layerGroupCheckbox.checked;
	togglerContainer.appendChild(checkbox);
	var label = document.createElement("label");
	label.htmlFor = checkbox.id;
	var labelText2 = document.createElement("span");
	labelText2.className = "label-text";
	labelText2.appendChild(document.createTextNode(" " + layerName));
	label.appendChild(labelText2);
	togglerContainer.appendChild(label);
	toggler.appendChild(togglerContainer);
	layer_container.appendChild(toggler);
	for (var i = 0; i < layerArray.length; i++){
		checkbox.addEventListener("click", layerTogglerEventHandler(layerArray[i].layer));
		layerGroupCheckbox.addEventListener("click", layerTogglerGroupEventHandler(checkbox, layerArray[i].layer));
	}
	registerKeyShortcut("WMS: " + layerName, layerKeyShortcutEventHandler(layerGroupCheckbox, checkbox), layerShortcut);
	return layerToggler;
};

function layerTogglerGroupMinimizerEventHandler(iCaretDown) {
	return function() {
		var ulCollapsible = iCaretDown.parentElement.parentElement.getElementsByTagName("UL")[0];
		if (!iCaretDown.classList.contains("upside-down")) {
			iCaretDown.classList.add("upside-down");
			ulCollapsible.classList.add("collapse-layer-switcher-group");
		}
		else {
			iCaretDown.classList.remove("upside-down");
			ulCollapsible.classList.remove("collapse-layer-switcher-group");
		}
	};
}

function registerKeyShortcut(actionName, callback, keyName) {
	I18n.translations[I18n.locale].keyboard_shortcuts.groups.default.members[keyName] = actionName;
	W.accelerators.addAction(keyName, {group: 'default'});
	W.accelerators.events.register(keyName, null, callback);
	W.accelerators._registerShortcuts({[""]: keyName});
}

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);
		}
	};
}

function layerKeyShortcutEventHandler(groupCheckbox, checkbox) {
	return function() {
		if (!groupCheckbox.disabled) {
			checkbox.click();
		}
	};
}

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;
	};
}

function layersEventHandler(childList) {
	return function () {
		if (this.className == "fa fa-window-maximize pull-right"){
			this.className = "fa fa-window-minimize pull-right";
			for (var j = 0; j < childList.length; j++) {
				childList[j].style.display = "";
			}
		}
		else{
			this.className = "fa fa-window-maximize pull-right";
			for (j = 0; j < childList.length; j++) {
				childList[j].style.display = "none";
			}
		}
	};
}

function setZOrdering(layerTogglers) {
	return function() {
		for (var key in layerTogglers) {
			for (var j = 0; j < layerTogglers[key].layerArray.length; j++) {
				if (layerTogglers[key].layerArray[j].zIndex > 0) {
					var l = W.map.getLayersBy("uniqueName", layerTogglers[key].layerArray[j].uniqueName);
					if (l.length > 0) {
						l[0].setZIndex(layerTogglers[key].layerArray[j].zIndex);
					}
				}
			}
		}
	};
}
长期地址
遇到问题?请前往 GitHub 提 Issues,或加Q群1031348184

赞助商

Fishcpy

广告

Rainyun

注册一下就行

Rainyun

一年攒够 12 元