WME Places Name Inspector

Lista todos los nombres de lugares visibles en el mapa de Waze

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         WME Places Name Inspector
// @version      1.0
// @description  Lista todos los nombres de lugares visibles en el mapa de Waze
// @author       mincho77
// @namespace    https://greasyfork.org/en/users/mincho77
// @match        https://www.waze.com/*editor*
// @match        https://beta.waze.com/*editor*
// @license      MIT
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
'use strict';

//**************************************************************************
// Nombre: waitForWazeReady
// Fecha modificación: 2025-07-12
// Autor: mincho77
// Entradas: callback (function): función a ejecutar cuando WME esté listo
// Salidas: Ninguna
// Descripción: Espera hasta que el entorno de WME esté cargado
//**************************************************************************
function waitForWazeReady(callback)
{
    const interval = setInterval(() => {
        if (typeof W !== "undefined" && W.loginManager && W.map && W.model)
        {
            clearInterval(interval);
            callback();
        }
    }, 500);
}

//**************************************************************************
// Nombre: getVisiblePlaces
// Fecha modificación: 2025-07-12
// Autor: mincho77
// Entradas: Ninguna
// Salidas: Array de objetos con id y nombre del lugar
// Descripción: Filtra los lugares visibles en el viewport actual del mapa
//**************************************************************************
function getVisiblePlaces()
{
    const extent = W.map.getExtent();
    const allPlaces = Object.values(W.model.venues.objects);

    const visiblePlaces = allPlaces.filter(place => {
        const geometry = place.geometry;
        const name = place.attributes.name;
        if (!name || !geometry)
            return false;

        return geometry.getBounds().intersectsBounds(extent);
    });

    return visiblePlaces.map(
      place => ({ id : place.getID(), name : place.attributes.name }));
}

//**************************************************************************
// Nombre: logVisiblePlaces
// Fecha modificación: 2025-07-12
// Autor: mincho77
// Entradas: Ninguna
// Salidas: Ninguna
// Descripción: Muestra por consola los lugares visibles con nombre
//**************************************************************************
function logVisiblePlaces()
{
    const places = getVisiblePlaces();
    console.table(places, [ "id", "name" ]);
    alert(`Se encontraron ${
      places.length} lugares visibles con nombre. Revisa la consola (F12).`);
}

//**************************************************************************
// Nombre: addUI
// Fecha modificación: 2025-07-12
// Autor: mincho77
// Entradas: Ninguna
// Salidas: Ninguna
// Descripción: Agrega un botón a la pestaña de usuario del editor para
// ejecutar el inspector
//**************************************************************************
function addUI()
{
    const tab = document.querySelector("#user-script-tab-content");
    if (!tab)
    {
        console.warn(
          "[WME Places Name Inspector] No se encontró el contenedor de pestaña.");
        return;
    }

    const btn = document.createElement("button");
    btn.textContent = "📍 Listar Places Visibles";
    btn.style.margin = "10px";
    btn.style.padding = "8px 12px";
    btn.style.background = "#2ecc71";
    btn.style.color = "white";
    btn.style.border = "none";
    btn.style.borderRadius = "4px";
    btn.style.cursor = "pointer";

    btn.onclick = logVisiblePlaces;
    tab.appendChild(btn);
}

//**************************************************************************
// INICIALIZADOR PRINCIPAL
//**************************************************************************
waitForWazeReady(() => {
    console.log("[WME Places Name Inspector] Script cargado correctamente");
    addUI();
});
})();