WME E50

Get POI information from external sources

Versione datata 25/08/2019. Vedi la nuova versione l'ultima versione.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

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

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         WME E50
// @version      0.0.2
// @description  Get POI information from external sources
// @author       Anton Shevchuk
// @license      MIT License
// @include      https://www.waze.com/editor*
// @include      https://www.waze.com/*/editor*
// @include      https://beta.waze.com/editor*
// @include      https://beta.waze.com/*/editor*
// @exclude      https://www.waze.com/user/editor*
// @exclude      https://beta.waze.com/user/editor*
// @grant        none
// @require      https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
// @require      https://greasyfork.org/scripts/389117-wme-api-helper/code/WME%20API%20Helper.js?version=727077
// @namespace    https://greasyfork.org/users/227648
// ==/UserScript==

/* jshint esversion: 6 */
/* global require, $, window, W, I18n, OL, APIHelper, WazeWrap */
(function () {
  'use strict';

  let helper, panel;
  let vectorLayer, vectorPoint, vectorLine;

  const NAME = 'E50';

  // translation structure
  const TRANSLATION = {
    'en': {
      title: 'Information'
    },
    'uk': {
      title: 'Інформація'
    },
    'ru': {
      title: 'Информация'
    }
  };

  APIHelper.bootstrap();
  APIHelper.addTranslation(NAME, TRANSLATION);

  class Provider {
    constructor(lat, lon) {
      this.lat = lat;
      this.lon = lon;
    }
    link(lat, lon, street, number, name = null) {
      let a = document.createElement('a');
          a.href = '#';
          a.dataset.lat = lat;
          a.dataset.lon = lon;
          a.dataset.street = street;
          a.dataset.number = number;
          a.dataset.name = name;
          a.innerHTML = [street, number, name].filter(x => !!x).join(', ');
          a.className = NAME + '-link';
      return a;
    }
    result(prefix, item, postfix = '<br/>') {
      $('div.form-group.e50 > div.controls').append(prefix).append(item).append(postfix);
    }
  }

  class GisProvider extends Provider {
    request() {
      let url = 'https://catalog.api.2gis.ru/2.0/geo/search';
      let data = {
        point: this.lon + ',' + this.lat,
        format: 'json',
        fields: 'items.links',
        key: 'rubnkm7490',
        locale: 'uk_UA'
      };
      let self = this;

      $.ajax({
        dataType: 'json',
        cache: false,
        url: url,
        data: data,
        error: function () {
        },
        success: function (response) {
          if (!response.result) {
            return;
          }
          // 0 - building
          // 1 - district
          // 2 - city
          console.log(response.result);

          let res = response.result.items[0];
          let output = [];
          if (res.name) {
            output.push(res.name);
          } else {
            output.push(res.address_name);
          }
          if (res.purpose_name) {
            output.push(res.purpose_name);
          }
          self.result('2GIS: ', output.join(', '));
        }
      });
    }
  }

  class OsmProvider extends Provider {
    request() {
      let url = 'https://nominatim.openstreetmap.org/reverse';
      let data = {
        lon: this.lon,
        lat: this.lat,
        zoom: 18,
        format: 'json',
        addressdetails: 1,
        countrycodes: 'ua',
        'accept-language': 'uk_UA'
      };
      let self = this;

      $.ajax({
        dataType: 'json',
        cache: false,
        url: url,
        data: data,
        error: function () {
        },
        success: function (response) {
          if (!response.address) {
            return;
          }
          console.log(response);

          let output = [];
          let street = null;
          let number = null;
          if (response.address.road) {
            street = response.address.road;
            output.push(response.address.road);
          }
          if (response.address.house_number) {
            number = response.address.house_number;
            output.push(response.address.house_number);
          }

          let link = self.link(response.lat, response.lon, street, number, output.join(', '));
          self.result('OSM: ', link);
        }
      });
    }
  }

  class GMProvider extends Provider {
    request() {
      let url = 'https://www.waze.com/maps/api/place/nearbysearch/json';
      let data = {
        location: this.lat + ',' + this.lon,
        key: 'AIzaSy' + 'CebbES' + 'rWERY1MRZ56gEAfpt7tK2R6hV_I', // extract it from WME
        radius: 80,
        fields: 'geometry,formatted_address',
        language: 'ua'
      };
      let self = this;

      $.ajax({
        dataType: 'json',
        cache: false,
        url: url,
        data: data,
        error: function() {
        },
        success: function(response) {
          if (!response.results || !response.results.length) {
            return;
          }
          console.log(response.results);
          for (let i = 0; i < response.results.length; i++) {
            let res = response.results[i];
            if (res.types.indexOf('point_of_interest') !== -1) {
              let link = self.link(
                  res.geometry.location.lat,
                  res.geometry.location.lng,
                  null,
                  null,
                  res.name + ' ' + res.vicinity
              );
              self.result('G: ', link);
            }
          }
        }
      });
    }
  }

  class YMProvider extends Provider {
    request() {
      let url = 'https://geocode-maps.yandex.ru/1.x/';
      let data = {
        geocode: this.lon + ',' + this.lat,
        apikey: '2fe62c0e-580f-4541-b325-7c896d8d9481',
        kind: 'house',
        results: 1,
        format: 'json',
        lang: 'uk_UA'
      };
      let self = this;

      $.ajax({
        dataType: 'json',
        cache: false,
        url: url,
        data: data,
        error: function () {
        },
        success: function (response) {
          if (!response.response) {
            return;
          }
          if (!response.response.GeoObjectCollection.featureMember.length) {
            return;
          }
          console.log(response.response);

          self.result('Ya: ', response.response.GeoObjectCollection.featureMember[0].GeoObject.name);
        }
      });
    }
  }

  $(document)
    .on('ready.apihelper', ready)
    .on('landmark.apihelper', '#edit-panel', landmarkPanel)
    .on('click', '.' + NAME + '-link', applyData)
    .on('mouseenter', '.' + NAME + '-link', showVector)
    .on('mouseleave', '.' + NAME + '-link', hideVector)
  ;


  function ready() {
    console.info('@ready');

    helper = new APIHelperUI(NAME);

    panel = helper.createPanel(I18n.t(NAME).title);

    vectorLayer = new OL.Layer.Vector("E50VectorLayer", {displayInLayerSwitcher: false, uniqueName: "__E50VectorLayer"});
    W.map.addLayer(vectorLayer);
  }

  function landmarkPanel(event, element) {
    console.info('@landmark');

    let selected = APIHelper.getSelectedVenues()[0].geometry.getCentroid().clone();
    selected.transform('EPSG:3857', 'EPSG:4326');
    let position = new OpenLayers.LonLat(selected.x, selected.y);

    let Gis = new GisProvider(position.lat, position.lon);
    Gis.request();

    let Osm = new OsmProvider(position.lat, position.lon);
    Osm.request();

    //let Yandex = new YMProvider(position.lat, position.lon);
    //Yandex.request();

    let Google = new GMProvider(position.lat, position.lon);
    Google.request();

    let group = panel.toHTML();
    element.prepend(group);
  }

  function applyData() {
    console.log(this.dataset);
    return false;
  }
  function showVector() {
    let from = APIHelper.getSelectedVenues()[0].geometry.getCentroid();
    let to = new OL.Geometry.Point(this.dataset.lon, this.dataset.lat).transform('EPSG:4326', 'EPSG:900913');

    vectorLine = new OL.Feature.Vector(new OL.Geometry.LineString([from, to]), {}, {
      strokeWidth: 4,
      strokeColor: '#00ece3',
      strokeLinecap: 'round'
    });
    vectorPoint = new OL.Feature.Vector(to, {}, {
      pointRadius: 8,
      fillOpacity: 0,
      strokeColor: '#00ece3',
      strokeWidth: '2',
      strokeLinecap: 'round'
    });
    vectorLayer.addFeatures([vectorLine, vectorPoint]);

    console.log(WazeWrap.Geometry.calculateDistance([to, from]));
  }

  function hideVector() {
    vectorLayer.removeAllFeatures();
  }
})();