Abrir no Google Earth Pro

Adiciona um único botão ao menu de contexto para enviar coordenadas ao Google Earth Pro.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Abrir no Google Earth Pro
// @namespace    http://tampermonkey.net/
// @version      Final-Simplificado
// @description  Adiciona um único botão ao menu de contexto para enviar coordenadas ao Google Earth Pro.
// @author       PJ H
// @match        *://mapear.esteio.com.br/*
// @match        http://10.72.200.50/sede/paginas/index.php*
// @match        http://192.168.2.147/sede/paginas/index.php?pagina=edificacao
// @match        http://mapear.esteio.com.br/fortal-v3/paginas/
// @grant        GM_xmlhttpRequest
// @connect      localhost
// ==/UserScript==

(function () {
    'use strict';

    const MENU_ID = '#map-context-menu';

    // Envia as coordenadas para o servidor local que abre o Google Earth Pro.
    function sendToEarthPro(lat, lng) {
        console.log(`%c[Earth Pro] Enviando coordenadas: Lat: ${lat}, Lng: ${lng}`, 'color: #00695c; font-weight: bold;');
        GM_xmlhttpRequest({
            method: "POST",
            url: "http://localhost:3000/open-in-ge",
            headers: { "Content-Type": "application/json" },
            data: JSON.stringify({ lat: lat, lng: lng }),
            onload: (response) => console.log("[Earth Pro] Resposta do servidor:", response.responseText),
            onerror: (error) => {
                console.error("[Earth Pro] Erro ao conectar com o servidor local:", error);
                alert("Não foi possível conectar ao servidor local. Verifique se ele está em execução.");
            }
        });
    }

    // Função que adiciona apenas o nosso botão
    function addEarthProButton(panel) {
        // Verifica se o botão já existe para não adicionar de novo
        if (panel.querySelector('#tm-earth-pro-btn')) return;

        // Lê o texto do painel para extrair as coordenadas
        const text = panel.innerText;
        const latMatch = text.match(/Lat:\s*([-.\d]+)/i);
        const lngMatch = text.match(/Lng:\s*([-.\d]+)/i);

        if (!latMatch || !lngMatch) return;

        const lat = parseFloat(latMatch[1]);
        const lng = parseFloat(lngMatch[1]);

        // Cria o botão para o Earth Pro
        const earthProBtn = document.createElement('button');
        earthProBtn.id = 'tm-earth-pro-btn'; // ID único para nosso botão
        earthProBtn.textContent = '🛰️ Abrir no Earth Pro';

        // Estilo do botão
        Object.assign(earthProBtn.style, {
            cursor: 'pointer',
            backgroundColor: '#00695c',
            color: 'white',
            border: 'none',
            padding: '10px',
            marginTop: '8px',
            borderRadius: '4px',
            width: '100%',
            textAlign: 'center',
            fontSize: '14px',
            fontFamily: 'inherit'
        });

        earthProBtn.addEventListener('click', () => {
            sendToEarthPro(lat, lng);
        });

        // Adiciona uma linha divisória e o botão ao menu
        panel.appendChild(document.createElement('hr'));
        panel.appendChild(earthProBtn);
    }

    // Observa quando o painel aparece ou atualiza
    const mo = new MutationObserver(() => {
        const panel = document.querySelector(MENU_ID);
        if (panel && panel.style.display !== 'none') {
            addEarthProButton(panel);
        }
    });

    mo.observe(document.documentElement, { childList: true, subtree: true });

})();