- // ==UserScript==
- // @name WME Google Place Layer
- // @name:vi WME Google Place Layer
- // @namespace https://waze.com/minhtanz1
- // @version 1.9
- // @description Adds a Google Maps Place layer overlay to the Waze Map Editor. Syncs with WME’s map center and zoom level. - Shift+P: Toggle layer visibility. - Shift+L: Toggle interactivity (enable/disable pointer events).
- // @description:vi Thêm lớp phủ địa điểm của Google Maps vào Waze Map Editor. Đồng bộ với trung tâm bản đồ và mức thu phóng của WME. - Shift+P: Chuyển đổi chế độ hiển thị lớp. - Shift+L: Chuyển đổi tính tương tác (bật/tắt sự kiện con trỏ).
- // @author Minh Tan
- // @match https://*.waze.com/*/editor*
- // @match https://*.waze.com/editor*
- // @exclude https://*.waze.com/user/editor*
- // @grant none
- // @require https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
- // @license MIT
- // ==/UserScript==
-
- /* global W, OpenLayers, google, WazeWrap */
-
- (function() {
- 'use strict';
- let gmap;
- let placeDiv;
- let layerEnabled = (localStorage.getItem("WMEGooglePlaceLayer-enabled") ?? false) === 'true';
- let interactivityEnabled = false; // Default: interactivity disabled
-
- // Toggle the display of the Google Place Layer
- function toggleLayer() {
- layerEnabled = !layerEnabled;
- const checkbox = document.querySelector("#layer-switcher-item_google_place_layer");
- if (checkbox) {
- checkbox.checked = layerEnabled;
- }
- placeDiv.style.display = layerEnabled ? "block" : "none";
- localStorage.setItem("WMEGooglePlaceLayer-enabled", layerEnabled);
- }
-
- // Toggle pointer events (i.e. interactivity) on the overlay
- function toggleInteractivity() {
- interactivityEnabled = !interactivityEnabled;
- placeDiv.style.pointerEvents = interactivityEnabled ? 'auto' : 'none';
- console.log("Google Map interactivity " + (interactivityEnabled ? "enabled" : "disabled"));
- }
-
- // Initialize the Google Maps overlay
- function initPlaceLayer() {
- // const trafficLayer = new google.maps.TrafficLayer();
-
- placeDiv = document.createElement('div');
- placeDiv.id = "trafficDiv";
- placeDiv.style.position = 'absolute';
- placeDiv.style.top = '0';
- placeDiv.style.left = '0';
- placeDiv.style.right = '0';
- placeDiv.style.bottom = '0';
- placeDiv.style.opacity = '0.75'; // transparent layer
- // Start with interactivity disabled so WME controls work
- placeDiv.style.pointerEvents = 'none';
- W.map.olMap.getViewport().appendChild(placeDiv);
-
- const lonlat = new OpenLayers.LonLat(W.map.getCenter().lon, W.map.getCenter().lat);
- lonlat.transform(new OpenLayers.Projection('EPSG:900913'), new OpenLayers.Projection('EPSG:4326'));
-
- gmap = new google.maps.Map(placeDiv, {
- zoom: W.map.getZoom(),
- center: { lat: lonlat.lat, lng: lonlat.lon },
- disableDefaultUI: true,
- zoomControl: false,
- mapTypeId: 'roadmap',
- styles: [
- // DON'T CHANGE ANYTHING FROM THIS
- { featureType: 'landscape', stylers: [{ visibility: 'off' }] },
- // TO THIS
-
- // Link get style json: https://mapstyle.withgoogle.com/
- {
- "featureType": "administrative.province",
- "elementType": "geometry.stroke",
- "stylers": [
- {
- "color": "#9238ff"
- },
- {
- "visibility": "on"
- },
- {
- "weight": 1.5
- }
- ]
- },
- {
- "featureType": "administrative.province",
- "elementType": "labels.text",
- "stylers": [
- {
- "visibility": "on"
- }
- ]
- },
- {
- "featureType": "administrative.province",
- "elementType": "labels.text.fill",
- "stylers": [
- {
- "color": "#000000"
- }
- ]
- },
- {
- "featureType": "administrative.province",
- "elementType": "labels.text.stroke",
- "stylers": [
- {
- "visibility": "on"
- }
- ]
- },
- {
- "featureType": "poi.attraction",
- "elementType": "labels.icon",
- "stylers": [
- {
- "visibility": "simplified"
- }
- ]
- },
- {
- "featureType": "poi.attraction",
- "elementType": "labels.text.fill",
- "stylers": [
- {
- "color": "#209d2f"
- }
- ]
- },
- {
- "featureType": "poi.business",
- "elementType": "labels.icon",
- "stylers": [
- {
- "visibility": "simplified"
- }
- ]
- },
- {
- "featureType": "poi.business",
- "elementType": "labels.text",
- "stylers": [
- {
- "visibility": "off"
- }
- ]
- },
- {
- "featureType": "poi.government",
- "elementType": "labels.icon",
- "stylers": [
- {
- "color": "#b90e0e"
- }
- ]
- },
- {
- "featureType": "poi.government",
- "elementType": "labels.text.fill",
- "stylers": [
- {
- "color": "#b90e0e"
- }
- ]
- },
- {
- "featureType": "poi.medical",
- "elementType": "geometry.fill",
- "stylers": [
- {
- "color": "#f8a0a0"
- }
- ]
- },
- {
- "featureType": "poi.medical",
- "elementType": "labels",
- "stylers": [
- {
- "visibility": "on"
- }
- ]
- },
- {
- "featureType": "poi.school",
- "elementType": "labels.icon",
- "stylers": [
- {
- "color": "#218cb0"
- }
- ]
- },
- {
- "featureType": "road.arterial",
- "elementType": "geometry",
- "stylers": [
- {
- "color": "#e9ec18"
- },
- {
- "visibility": "on"
- },
- {
- "weight": 2
- }
- ]
- },
- {
- "featureType": "road.highway",
- "elementType": "geometry",
- "stylers": [
- {
- "color": "#0a68ff"
- },
- {
- "visibility": "on"
- },
- {
- "weight": 2.5
- }
- ]
- },
- {
- "featureType": "road.highway",
- "elementType": "geometry.stroke",
- "stylers": [
- {
- "visibility": "on"
- },
- {
- "weight": 2.5
- }
- ]
- },
- {
- "featureType": "road.local",
- "elementType": "geometry",
- "stylers": [
- {
- "color": "#ff0000"
- },
- {
- "visibility": "on"
- },
- {
- "weight": 2
- }
- ]
- },
- {
- "featureType": "transit.station.airport",
- "stylers": [
- {
- "visibility": "on"
- }
- ]
- },
- {
- "featureType": "transit.station.bus",
- "stylers": [
- {
- "visibility": "off"
- }
- ]
- },
- {
- "featureType": "transit.station.rail",
- "stylers": [
- {
- "visibility": "on"
- }
- ]
- },
- {
- "featureType": "water",
- "elementType": "labels.geometry",
- "stylers": [
- {
- "visibility": "off"
- }
- ]
- },
- {
- "featureType": "water",
- "elementType": "labels.text",
- "stylers": [
- {
- "color": "#ffffff"
- }
- ]
- }
-
-
- ]
- });
-
- //show traffic layer
- // trafficLayer.setMap(gmap);
- if (placeDiv.firstElementChild) {
- placeDiv.firstElementChild.style.backgroundColor = 'rgb(0 0 0 / 0%)'; //remove white background
- }
- if (!layerEnabled) {
- placeDiv.style.display = "none";
- }
-
- // Sync Google Maps center with WME map movements
- WazeWrap.Events.register('moveend', null, function() {
- const lonlat = new OpenLayers.LonLat(W.map.getCenter().lon, W.map.getCenter().lat);
- lonlat.transform(new OpenLayers.Projection('EPSG:900913'), new OpenLayers.Projection('EPSG:4326'));
- gmap.panTo({ lat: lonlat.lat, lng: lonlat.lon });
- });
-
- // Sync Google Maps zoom with WME zoom events
- WazeWrap.Events.register('zoomend', null, function() {
- gmap.setZoom(W.map.getZoom());
- });
-
- window.gmap = gmap; // for testing
-
- WazeWrap.Interface.AddLayerCheckbox(
- "display",
- "Google Place Layer",
- layerEnabled,
- toggleLayer,
- W.map.getLayerByName("Google Place Layer")
- );
-
- new WazeWrap.Interface.Shortcut(
- 'WMEGooglePlaceLayer',
- 'Toggle Place Layer',
- 'layers',
- 'layersToggleWMEGooglePlaceLayer',
- "Shift+P",
- toggleLayer,
- null
- ).add();
-
- new WazeWrap.Interface.Shortcut(
- 'WMEGoogleInteractivityToggle',
- 'Toggle Google Map Interactivity',
- 'layers',
- 'layersToggleGoogleInteractivity',
- 'Shift+L',
- toggleInteractivity,
- null
- ).add();
- }
-
- if (W && W.userscripts && W.userscripts.state && W.userscripts.state.isReady) {
- initPlaceLayer();
- } else {
- document.addEventListener('wme-ready', initPlaceLayer, { once: true });
- }
- })();