WME GIS Buttons

Displays the locality of the current location and provides links to open GIS if available

目前为 2018-02-24 提交的版本,查看 最新版本

// ==UserScript==
// @name          WME GIS Buttons
// @author        @Philistine11
// @namespace     https://greasyfork.org/en/users/53803
// @description   Displays the locality of the current location and provides links to open GIS if available
// @include       https://www.waze.com/editor*
// @include       https://www.waze.com/*/editor*
// @version       1.4.0
// ==/UserScript==

function gis_init(model, modeId) {
    if (modeId === 1)
        return;

    var location = $('div.location-info-region');
    if  (location.length === 0) {
        setTimeout(gis_init, 500);
        return;
    }
    location.after('<div class="input-group input-group-sm" style="padding-left:2rem;"><span class="input-group-addon" style="display:table-cell; font-size:2rem; line-height:0;"><span id="status_gis" class="fa fa-spinner fa-pulse" style="line-height:0;"></span></span><div class="input-group-btn" style="width:0;"><a id="locality_gis" class="btn btn-default disabled hidden" style="border:1px solid" target="_blank" href="#">Locality</a><a id="county_gis" class="btn btn-default disabled hidden" style="border:1px solid" target="_blank" href="#">County</a><a id="state_gis" class="btn btn-default disabled hidden" style="border:1px solid" target="_blank" href="#">State</a></span></div>');

    W.app.modeController.model.bind('change:mode', gis_init);

    var error = false;
    var update = () => {
        $('#status_gis').removeClass().addClass('fa fa-spinner fa-pulse').css('color','').attr('title','');
        var center = W.map.getCenter().transform(new OL.Projection('EPSG:900913'), new OL.Projection('EPSG:4326'));
        $.getJSON(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${center.lat},${center.lon}`, data => {
            if (data.status === 'OK') {
                error = false;
                var locs = data.results[0].address_components;
                var locality = '', county = '', state = '';
                $('#locality_gis, #county_gis, #state_gis').addClass('hidden');
                for (var loc = 0; loc < locs.length; loc++) {
                    if (locs[loc].types.indexOf('administrative_area_level_1') !== -1) {
                        state = locs[loc].long_name;
                        $('#state_gis').removeClass('hidden').text(state);
                    } else if (locs[loc].types.indexOf('administrative_area_level_2') !== -1) {
                        county = locs[loc].long_name;
                        $('#county_gis').removeClass('hidden').text(county);
                    } else if (locs[loc].types.indexOf('locality') !== -1) {
                        locality = locs[loc].long_name;
                        $('#locality_gis').removeClass('hidden').text(locality);
                    }
                }

                $('#locality_gis, #county_gis, #state_gis').prop('href', '#').addClass('disabled');

                new Promise((resolve, reject) => {
                    if (states.hasOwnProperty(state)) {
                        resolve(new Promise((resolve, reject) => {
                            if (typeof (states[state]) === 'string')
                                $.getJSON(`https://script.google.com/macros/s/AKfycbx2bytvT5Un0TWcaU7BpVkauqeE8zqt8Mek7Zq-OF-bznGYDyZw/exec?link=${states[state]}`, rows => {
                                    states[state] = rows;
                                    resolve();
                                });
                            else
                                resolve();
                        }).then(() => {
                            for (var row in states[state])
                                if (states[state][row][2] !== '')
                                    if (states[state][row][1] === 'State') {
                                        $('#state_gis').prop('href', states[state][row][2].replace('<lat>',center.lat).replace('<lon>',center.lon).replace('<zoom>',W.map.getZoom()+12)).removeClass('disabled');
                                    } else if (states[state][row][1] === 'County') {
                                        if (county.indexOf(states[state][row][0]) != -1)
                                            $('#county_gis').prop('href', states[state][row][2].replace('<lat>',center.lat).replace('<lon>',center.lon).replace('<zoom>',W.map.getZoom()+12)).removeClass('disabled');
                                    } else if (states[state][row][0] === locality)
                                        $('#locality_gis').prop('href', states[state][row][2].replace('<lat>',center.lat).replace('<lon>',center.lon).replace('<zoom>',W.map.getZoom()+12)).removeClass('disabled');
                        }));
                    }
                    resolve();
                }).then(() => $('#status_gis').removeClass().addClass('fa fa-globe')).catch(error => console.warn(error));
            }
            if (data.status === 'OVER_QUERY_LIMIT')
                if (error) {
                    $('#status_gis').removeClass().addClass('fa fa-exclamation-circle').css('color','red').attr('title', "Google has a limit of 2500 geolocation lookups per 24 hours. You may have exceeded this limit, so further lookups may fail until enough time has passed. Please feel free to try again.");
                } else {
                    error = true;
                    setTimeout(update, 2000);
                }
        });
    };

    var states = {};
    $.getJSON('https://script.google.com/macros/s/AKfycbx2bytvT5Un0TWcaU7BpVkauqeE8zqt8Mek7Zq-OF-bznGYDyZw/exec?link=10dR8z16eKPHeI-ywLcHh2UNS3enQ7gt36Hhzm9nOJbA', rows => {
        for (var row in rows)
            states[rows[row][0]] = rows[row][1];
        update();
    });

    var trigger;
    W.map.events.register('moveend', null, () => {
        clearTimeout(trigger);
        trigger = setTimeout(update, 1000);
    });
}

gis_init();