leaflet-control-geocoder
Version:
Extendable geocoder with builtin support for Nominatim, Bing, Google, Mapbox, Photon, What3Words, MapQuest, Mapzen
65 lines (57 loc) • 1.65 kB
JavaScript
var L = require('leaflet'),
Util = require('../util');
module.exports = {
class: L.Class.extend({
options: {
serviceUrl: 'http://api.what3words.com/'
},
initialize: function(accessToken) {
this._accessToken = accessToken;
},
geocode: function(query, cb, context) {
//get three words and make a dot based string
Util.getJSON(this.options.serviceUrl +'w3w', {
key: this._accessToken,
string: query.split(/\s+/).join('.'),
}, function(data) {
var results = [], loc, latLng, latLngBounds;
if (data.position && data.position.length) {
loc = data.words;
latLng = L.latLng(data.position[0],data.position[1]);
latLngBounds = L.latLngBounds(latLng, latLng);
results[0] = {
name: loc.join('.'),
bbox: latLngBounds,
center: latLng
};
}
cb.call(context, results);
});
},
suggest: function(query, cb, context) {
return this.geocode(query, cb, context);
},
reverse: function(location, scale, cb, context) {
Util.getJSON(this.options.serviceUrl +'position', {
key: this._accessToken,
position: [location.lat,location.lng].join(',')
}, function(data) {
var results = [],loc,latLng,latLngBounds;
if (data.position && data.position.length) {
loc = data.words;
latLng = L.latLng(data.position[0],data.position[1]);
latLngBounds = L.latLngBounds(latLng, latLng);
results[0] = {
name: loc.join('.'),
bbox: latLngBounds,
center: latLng
};
}
cb.call(context, results);
});
}
}),
factory: function(accessToken) {
return new L.Control.Geocoder.What3Words(accessToken);
}
};