Get POI information from external sources
Versione datata
// ==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();
}
})();