kmap-ui
Version:
A components of zmap base on vue2.X
144 lines (136 loc) • 5.04 kB
JavaScript
/* Copyright (c) 2019 Jean-Marc VIGLINO,
released under the CeCILL-B license (French BSD license)
(http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt).
*/
import ol_ext_inherits from '../util/ext'
import {transform as ol_proj_transform} from 'ol/proj'
import ol_control_SearchJSON from "./SearchJSON";
import ol_ext_Ajax from '../util/Ajax'
import ol_ext_element from '../util/element';
/**
* Search places using the MediaWiki API.
* @see https://www.mediawiki.org/wiki/API:Main_page
*
* @constructor
* @extends {ol_control_SearchJSON}
* @fires select
* @param {Object=} Control options.
* @param {string} options.className control class name
* @param {Element | string | undefined} options.target Specify a target if you want the control to be rendered outside of the map's viewport.
* @param {string | undefined} options.label Text label to use for the search button, default "search"
* @param {string | undefined} options.placeholder placeholder, default "Search..."
* @param {number | undefined} options.typing a delay on each typing to start searching (ms), default 1000.
* @param {integer | undefined} options.minLength minimum length to start searching, default 3
* @param {integer | undefined} options.maxItems maximum number of items to display in the autocomplete list, default 10
* @param {function | undefined} options.handleResponse Handle server response to pass the features array to the list
*
* @param {string|undefined} options.lang API language, default none
*/
var ol_control_SearchWikipedia = function(options){
options = options || {};
options.lang = options.lang||'en';
options.className = options.className || 'ol-search-wikipedia';
options.url = 'https://'+options.lang+'.wikipedia.org/w/api.php';
options.placeholder = options.placeholder || 'search string, File:filename';
options.copy = '<a href="https://'+options.lang+'.wikipedia.org/" target="new">Wikipedia® - CC-By-SA</a>';
ol_control_SearchJSON.call(this, options);
this.set('lang', options.lang);
};
ol_ext_inherits(ol_control_SearchWikipedia, ol_control_SearchJSON);
/** Returns the text to be displayed in the menu
* @param {ol.Feature} f the feature
* @return {string} the text to be displayed in the index
* @api
*/
ol_control_SearchWikipedia.prototype.getTitle = function (f){
return ol_ext_element.create('DIV', {
html: f.title,
title: f.desc
});
//return f.desc;
};
/** Set the current language
* @param {string} lang the current language as ISO string (en, fr, de, es, it, ja, ...)
*/
ol_control_SearchWikipedia.prototype.setLang = function (lang){
this.set('lang', lang)
this.set('url', 'https://'+lang+'.wikipedia.org/w/api.php');
};
/**
* @param {string} s the search string
* @return {Object} request data (as key:value)
* @api
*/
ol_control_SearchWikipedia.prototype.requestData = function (s) {
var data = {
action: 'opensearch',
search: s,
lang: this.get('lang'),
format: 'json',
origin: '*',
limit: this.get('maxItems')
}
return data;
};
/**
* Handle server response to pass the features array to the list
* @param {any} response server response
* @return {Array<any>} an array of feature
*/
ol_control_SearchWikipedia.prototype.handleResponse = function (response) {
var features = [];
for (var i=0; i<response[1].length; i++) {
features.push({
title: response[1][i],
desc: response[2][i],
uri: response[3][i]
})
}
return features;
};
/** A ligne has been clicked in the menu query for more info and disatch event
* @param {any} f the feature, as passed in the autocomplete
* @api
*/
ol_control_SearchWikipedia.prototype.select = function (f){
var title = decodeURIComponent(f.uri.split('/').pop()).replace(/'/,'%27');
// Search for coords
ol_ext_Ajax.get({
url: f.uri.split('wiki/')[0]+'w/api.php',
data: {
action: 'query',
prop: 'pageimages|coordinates|extracts',
exintro: 1,
explaintext: 1,
piprop: 'original',
origin: '*',
format: 'json',
redirects: 1,
titles: title
},
options: {
encode: false
},
success: function (e) {
var page = e.query.pages[Object.keys(e.query.pages).pop()];
console.log(page);
var feature = {
title: f.title,
desc: page.extract || f.desc,
url: f.uri,
img: page.original ? page.original.source : undefined,
pageid: page.pageid
}
var c;
if (page.coordinates) {
feature.lon = page.coordinates[0].lon;
feature.lat = page.coordinates[0].lat;
c = [feature.lon, feature.lat];
c = ol_proj_transform (c, 'EPSG:4326', this.getMap().getView().getProjection());
}
this.dispatchEvent({ type:"select", search:feature, coordinate: c });
}.bind(this)
})
};
/** */
export default ol_control_SearchWikipedia