leaflet-control-geocoder
Version:
Extendable geocoder with builtin support for Nominatim, Bing, Google, Mapbox, Photon, What3Words, MapQuest, Mapzen
75 lines (67 loc) • 2.06 kB
JavaScript
var L = require('leaflet'),
Util = require('../util');
module.exports = {
class: L.Class.extend({
options: {
serviceUrl: '//search.mapzen.com/v1',
geocodingQueryParams: {},
reverseQueryParams: {}
},
initialize: function(apiKey, options) {
L.Util.setOptions(this, options);
this._apiKey = apiKey;
this._lastSuggest = 0;
},
geocode: function(query, cb, context) {
var _this = this;
Util.getJSON(this.options.serviceUrl + "/search", L.extend({
'api_key': this._apiKey,
'text': query
}, this.options.geocodingQueryParams), function(data) {
cb.call(context, _this._parseResults(data, "bbox"));
});
},
suggest: function(query, cb, context) {
var _this = this;
Util.getJSON(this.options.serviceUrl + "/autocomplete", L.extend({
'api_key': this._apiKey,
'text': query
}, this.options.geocodingQueryParams), function(data) {
if (data.geocoding.timestamp > this._lastSuggest) {
this._lastSuggest = data.geocoding.timestamp;
cb.call(context, _this._parseResults(data, "bbox"));
}
});
},
reverse: function(location, scale, cb, context) {
var _this = this;
Util.getJSON(this.options.serviceUrl + "/reverse", L.extend({
'api_key': this._apiKey,
'point.lat': location.lat,
'point.lon': location.lng
}, this.options.reverseQueryParams), function(data) {
cb.call(context, _this._parseResults(data, "bounds"));
});
},
_parseResults: function(data, bboxname) {
var results = [];
L.geoJson(data, {
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng);
},
onEachFeature: function(feature, layer) {
var result = {};
result['name'] = layer.feature.properties.label;
result[bboxname] = layer.getBounds();
result['center'] = result[bboxname].getCenter();
result['properties'] = layer.feature.properties;
results.push(result);
}
});
return results;
}
}),
factory: function(apiKey, options) {
return new L.Control.Geocoder.Mapzen(apiKey, options);
}
};