WME E50

Get POI information from external sources

当前为 2019-08-25 提交的版本,查看 最新版本

// ==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://gf.qytechs.cn/scripts/24851-wazewrap/code/WazeWrap.js
// @require      https://gf.qytechs.cn/scripts/389117-wme-api-helper/code/WME%20API%20Helper.js?version=727077
// @namespace    https://gf.qytechs.cn/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();
  }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址