UNPKG

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
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); } };