UNPKG

25.6 kBMarkdownView Raw
1# Leaflet.GeoSearch
2
3<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
4
5[![All Contributors](https://img.shields.io/badge/all_contributors-42-orange.svg?style=flat-square)](#contributors-)
6
7<!-- ALL-CONTRIBUTORS-BADGE:END -->
8
9**Demo and Docs: [smeijer.github.io/leaflet-geosearch](https://smeijer.github.io/leaflet-geosearch)**
10
11![animation of geosearch](./docs/assets/img/geosearch.gif)
12
13## Installation
14
15**more docs @** https://smeijer.github.io/leaflet-geosearch/#installation
16
17with npm:
18
19```bash
20npm install --save leaflet-geosearch
21```
22
23or yarn:
24
25```bash
26yarn add leaflet-geosearch
27```
28
29## Browser support / Polyfills
30
31**more docs @** https://smeijer.github.io/leaflet-geosearch/#browser-support--polyfills
32
33This library is written with the latest technologies in mind. Thereby it is required to include some polyfills when you wish to support older browsers. These polyfills are recommended for IE and Safari support:
34
35- [babel-polyfill], for `array.includes` support.
36- [unfetch], for `fetch` requests.
37
38# About
39
40This library adds support for geocoding _(address lookup, a.k.a. geoseaching)_
41to your (web) application. It comes with controls to be embedded in your [Leaflet] map.
42
43Check out the [docs] for various possibilities.
44
45The library uses so-called "providers" to take care of building the correct
46service URL and parsing the retrieved data into a uniform format. Thanks to this
47architecture, it is pretty easy to add your own providers, so you can use
48your own geocoding service(s).
49
50The control comes with a number of default providers:
51
52- [Algolia]
53- [Bing]
54- [Esri]
55- [Google]
56- [LocationIQ]
57- [OpenCage]
58- [OpenStreetMap]
59- [Mapbox](https://docs.mapbox.com/help/tutorials/local-search-geocoding-api/)
60- [GeoApiFR](https://geo.api.gouv.fr/adresse)
61
62Although this project is still named `leaflet-geosearch`, this library is also
63usable without LeafletJS, and does not have any dependencies whatsoever.
64
65# Usage
66
67**more docs @** https://smeijer.github.io/leaflet-geosearch/usage
68
69Let's first start with an little example on how to use this control without
70leaflet. For example as an address lookup on a webshop order form. Perhaps to
71search for the closest alternative package delivery point? Or to link it to your
72own custom map component.
73
74```js
75// import
76import { OpenStreetMapProvider } from 'leaflet-geosearch';
77
78// setup
79const provider = new OpenStreetMapProvider();
80
81// search
82const results = await provider.search({ query: input.value });
83```
84
85Of course, something like this should be bound to something like a form or
86input:
87
88```js
89import { OpenStreetMapProvider } from 'leaflet-geosearch';
90
91const form = document.querySelector('form');
92const input = form.querySelector('input[type="text"]');
93
94form.addEventListener('submit', async (event) => {
95 event.preventDefault();
96
97 const results = await provider.search({ query: input.value });
98 console.log(results); // Β» [{}, {}, {}, ...]
99});
100```
101
102Instead of es6 `async` / `await` you can also use promises like:
103
104```js
105provider.search({ query: '...' }).then(function (result) {
106 // do something with result;
107});
108```
109
110## Results
111
112The `search` event of all providers return an array of `result objects`. The
113base structure is uniform between the providers. It provides a object like:
114
115```js
116const result = {
117 x: Number, // lon,
118 y: Number, // lat,
119 label: String, // formatted address
120 bounds: [
121 [Number, Number], // s, w - lat, lon
122 [Number, Number], // n, e - lat, lon
123 ],
124 raw: {}, // raw provider result
125};
126```
127
128The contents of the `raw` property differ per provider. This is the unprocessed
129result from the 3th party service. This property is included for developer
130convenience. `leaflet-geosearch` does not use it. If you need to know the
131contents of this property, you should check the 3th party developer docs. (or
132use your debugger)
133
134# Providers
135
136When `OpenStreetMap` does not match your needs; you can also choose to use the
137`Algolia`, `Bing`, `Esri`, `Google` `LocationIQ`, or `OpenCage` providers. Most of those providers do however require API
138keys. See the documentation pages on the relevant organisations on how to obtain
139these keys.
140
141In case you decide to write your own provider, please consider submitting a PR
142to share your work with us.
143
144Providers are unaware of any options you can give them. They are simple proxies
145to their endpoints. There is only one `special property`, and that is the `params`
146option. The difference being; that `params` will be included in the endpoint url.
147Often being used for `API KEYS`, where as the other attributes can be used for
148provider configuration.
149
150# Using with LeafletJS
151
152This project comes with a leaflet control to hook the search providers into
153leaflet. The example below uses the `OpenStreetMap Provider`, but you can exchange
154this with on of the other included providers as well as your own custom made
155providers. Remember to setup the provider with a `key` when required (Google and
156Bing for example).
157
158![search control](./docs/assets/img/searchbar.png)
159
160```js
161import L from 'leaflet';
162import { GeoSearchControl, OpenStreetMapProvider } from 'leaflet-geosearch';
163
164const provider = new OpenStreetMapProvider();
165
166const searchControl = new GeoSearchControl({
167 provider: provider,
168});
169
170const map = new L.Map('map');
171map.addControl(searchControl);
172```
173
174# Using with react-leaflet
175
176Usage with `react-leaflet` is similar to the usage with plain Leaflet. This example
177uses the new MapBoxProvider and adds an api key to the `params` list when accessing
178the remote API. Note the `useMap` hook which is the only notable diffrence to the
179leaflet example.
180
181```jsx
182import { GeoSearchControl, MapBoxProvider } from 'leaflet-geosearch';
183import { useMap } from 'react-leaflet';
184const SearchField = ({ apiKey }) => {
185 const provider = new MapBoxProvider({
186 params: {
187 access_token: apiKey,
188 },
189 });
190
191 // @ts-ignore
192 const searchControl = new GeoSearchControl({
193 provider: provider,
194 });
195
196 const map = useMap();
197 useEffect(() => {
198 map.addControl(searchControl);
199 return () => map.removeControl(searchControl);
200 }, []);
201
202 return null;
203};
204```
205
206The `useEffect` hook used in `SearchField` even allows for conditional rendering of the
207search field.
208
209```jsx
210import { MapContainer } from 'react-leaflet';
211const MyMap = () => {
212 // ...
213 return (
214 <MapContainer>
215 {showSearch && <SearchField apiKey={apiKey} />}
216
217 {/* ... */}
218 </MapContainer>
219 );
220};
221```
222
223## GeoSearchControl
224
225There are some configurable options like setting the position of the search input
226and whether or not a marker should be displayed at the position of the search result.
227
228![search button](./docs/assets/img/searchbutton.png)
229There are two visual styles of this control. One is the more 'leaflet-way' by
230putting the search control under a button (see image above). And one where the
231search control is permanently shown as a search bar (see image under
232[using with LeafletJS](#using-with-leafletjs)).
233
234**Render style**
235
236This render style can be set by the optional `style` option.
237
238```js
239new GeoSearchControl({
240 provider: myProvider, // required
241 style: 'bar', // optional: bar|button - default button
242}).addTo(map);
243```
244
245**AutoComplete**
246
247Auto complete can be configured by the parameters `autoComplete` and
248`autoCompleteDelay`. A little delay is required to not DDOS the server on every
249keystroke.
250
251```js
252new GeoSearchControl({
253 provider: myProvider, // required
254 autoComplete: true, // optional: true|false - default true
255 autoCompleteDelay: 250, // optional: number - default 250
256}).addTo(map);
257```
258
259**Show result**
260
261There are a number of options to adjust the way results are visualized.
262
263```js
264new GeoSearchControl({
265 provider: myProvider, // required
266 showMarker: true, // optional: true|false - default true
267 showPopup: false, // optional: true|false - default false
268 marker: {
269 // optional: L.Marker - default L.Icon.Default
270 icon: new L.Icon.Default(),
271 draggable: false,
272 },
273 popupFormat: ({ query, result }) => result.label, // optional: function - default returns result label,
274 resultFormat: ({ result }) => result.label, // optional: function - default returns result label
275 maxMarkers: 1, // optional: number - default 1
276 retainZoomLevel: false, // optional: true|false - default false
277 animateZoom: true, // optional: true|false - default true
278 autoClose: false, // optional: true|false - default false
279 searchLabel: 'Enter address', // optional: string - default 'Enter address'
280 keepResult: false, // optional: true|false - default false
281 updateMap: true, // optional: true|false - default true
282});
283```
284
285`showMarker` and `showPopup` determine whether or not to show a marker and/or
286open a popup with the location text.
287
288`marker` can be set to any instance of a (custom) `L.Icon`.
289
290`popupFormat` is callback function for displaying text on popup.
291
292`resultFormat` is callback function for modifying the search result texts (e. g. in order to hide address components or change its ordering).
293
294`maxMarker` determines how many last results are kept in memory. Default 1, but
295perhaps you want to show the last `x` results when searching for new queries as
296well.
297
298`retainZoomLevel` is a setting that fixes the zoomlevel. Default behaviour is to
299zoom and pan to the search result. With `retainZoomLevel` on `true`, the map is
300only panned.
301
302`animateZoom` controls whether or not the pan/zoom moment is being animated.
303
304`autoClose` closes the result list if a result is selected by click/enter.
305
306`keepResult` is used to keep the selected result in the search field. This prevents markers to disappear while using the `autoClose` feature.
307
308`updateMap` controls whether or not the map re-centers on the selection.
309
310**Events**
311
312`geosearch/showlocation` is fired when location is chosen from the result list.
313
314```js
315map.on('geosearch/showlocation', yourEventHandler);
316```
317
318`geosearch/marker/dragend` is fired when marker has been dragged.
319
320```js
321map.on('geosearch/marker/dragend', yourEventHandler);
322```
323
324# Development
325
326Checkout the providers to see how easy it is to write your own. For research it
327can be interesting to see the difference between Bing and the others; because
328Bing does not support `CORS`, and requires `jsonp` to be used instead.
329
330In case you decide to write your own provider, please consider submitting a PR
331to share your work with us.
332
333[leaflet]: http://leafletjs.com
334[docs]: https://smeijer.github.io/leaflet-geosearch
335[babel-polyfill]: https://npmjs.com/babel-polyfill
336[unfetch]: https://npmjs.com/unfetch
337[algolia]: https://smeijer.github.io/leaflet-geosearch/providers/algolia
338[bing]: https://smeijer.github.io/leaflet-geosearch/providers/bing
339[esri]: https://smeijer.github.io/leaflet-geosearch/providers/esri
340[google]: https://smeijer.github.io/leaflet-geosearch/providers/google
341[locationiq]: https://smeijer.github.io/leaflet-geosearch/providers/locationiq
342[opencage]: https://smeijer.github.io/leaflet-geosearch/providers/opencage
343[openstreetmap]: https://smeijer.github.io/leaflet-geosearch/providers/openstreetmap
344
345## Contributors ✨
346
347Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
348
349<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
350<!-- prettier-ignore-start -->
351<!-- markdownlint-disable -->
352<table>
353 <tr>
354 <td align="center"><a href="https://github.com/smeijer"><img src="https://avatars1.githubusercontent.com/u/1196524?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stephan Meijer</b></sub></a><br /><a href="#ideas-smeijer" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="https://github.com/smeijer/leaflet-geosearch/commits?author=smeijer" title="Code">πŸ’»</a> <a href="#infra-smeijer" title="Infrastructure (Hosting, Build-Tools, etc)">πŸš‡</a> <a href="#maintenance-smeijer" title="Maintenance">🚧</a> <a href="https://github.com/smeijer/leaflet-geosearch/commits?author=smeijer" title="Tests">⚠️</a></td>
355 <td align="center"><a href="https://github.com/yuriizinets"><img src="https://avatars2.githubusercontent.com/u/17050536?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yurii Zinets</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=yuriizinets" title="Code">πŸ’»</a> <a href="https://github.com/smeijer/leaflet-geosearch/commits?author=yuriizinets" title="Tests">⚠️</a> <a href="#ideas-yuriizinets" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
356 <td align="center"><a href="https://github.com/hubnerd"><img src="https://avatars1.githubusercontent.com/u/2099902?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Hubner</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=hubnerd" title="Code">πŸ’»</a></td>
357 <td align="center"><a href="https://ninarski.com/"><img src="https://avatars3.githubusercontent.com/u/1941633?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nikolay Ninarski</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=ninio" title="Code">πŸ’»</a></td>
358 <td align="center"><a href="http://fredrik.computer/"><img src="https://avatars1.githubusercontent.com/u/1101677?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Fredrik Ekelund</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=fredrikekelund" title="Code">πŸ’»</a></td>
359 <td align="center"><a href="https://blog.duraffort.fr/"><img src="https://avatars3.githubusercontent.com/u/2114999?v=4?s=100" width="100px;" alt=""/><br /><sub><b>RΓ©mi Duraffort</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=ivoire" title="Code">πŸ’»</a></td>
360 <td align="center"><a href="https://github.com/bung87"><img src="https://avatars2.githubusercontent.com/u/2238294?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bung</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=bung87" title="Code">πŸ’»</a></td>
361 </tr>
362 <tr>
363 <td align="center"><a href="https://github.com/cajus"><img src="https://avatars3.githubusercontent.com/u/722353?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cajus Pollmeier</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=cajus" title="Code">πŸ’»</a></td>
364 <td align="center"><a href="https://dandascalescu.com/"><img src="https://avatars3.githubusercontent.com/u/33569?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dan Dascalescu</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=dandv" title="Code">πŸ’»</a></td>
365 <td align="center"><a href="https://github.com/devdattaT"><img src="https://avatars2.githubusercontent.com/u/4159622?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Devdatta Tengshe</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=devdattaT" title="Code">πŸ’»</a></td>
366 <td align="center"><a href="https://github.com/emiltem"><img src="https://avatars0.githubusercontent.com/u/2720652?v=4?s=100" width="100px;" alt=""/><br /><sub><b>emiltem</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=emiltem" title="Code">πŸ’»</a></td>
367 <td align="center"><a href="http://programmatic.pro/"><img src="https://avatars3.githubusercontent.com/u/170891?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johannes Raggam</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=thet" title="Code">πŸ’»</a></td>
368 <td align="center"><a href="https://nathancahill.com/"><img src="https://avatars0.githubusercontent.com/u/1383872?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nathan Cahill</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=nathancahill" title="Code">πŸ’»</a></td>
369 <td align="center"><a href="https://timwis.com/"><img src="https://avatars3.githubusercontent.com/u/761444?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tim Wisniewski</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=timwis" title="Code">πŸ’»</a></td>
370 </tr>
371 <tr>
372 <td align="center"><a href="http://kaoru.slackwise.net/"><img src="https://avatars1.githubusercontent.com/u/89070?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alex Balhatchet</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=kaoru" title="Code">πŸ’»</a> <a href="https://github.com/smeijer/leaflet-geosearch/commits?author=kaoru" title="Tests">⚠️</a> <a href="#ideas-kaoru" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
373 <td align="center"><a href="http://andreas.heigl.org/"><img src="https://avatars1.githubusercontent.com/u/91998?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andreas Heigl</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=heiglandreas" title="Code">πŸ’»</a></td>
374 <td align="center"><a href="https://github.com/konfiot"><img src="https://avatars3.githubusercontent.com/u/961690?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Arthur Toussaint</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=konfiot" title="Code">πŸ’»</a></td>
375 <td align="center"><a href="https://github.com/thataustin"><img src="https://avatars2.githubusercontent.com/u/609078?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Austin Brown</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=thataustin" title="Code">πŸ’»</a></td>
376 <td align="center"><a href="http://brianherbert.com/"><img src="https://avatars2.githubusercontent.com/u/106068?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brian Herbert</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=brianherbert" title="Code">πŸ’»</a></td>
377 <td align="center"><a href="http://www.opencoder.co.uk/"><img src="https://avatars3.githubusercontent.com/u/196567?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris McDonald</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=chrismcband" title="Code">πŸ’»</a></td>
378 <td align="center"><a href="http://www.kobia.net/"><img src="https://avatars3.githubusercontent.com/u/184092?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David Kobia</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=dkobia" title="Code">πŸ’»</a></td>
379 </tr>
380 <tr>
381 <td align="center"><a href="https://github.com/dimabory"><img src="https://avatars3.githubusercontent.com/u/11414342?v=4?s=100" width="100px;" alt=""/><br /><sub><b> Dmytro Borysovskyi</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=dimabory" title="Code">πŸ’»</a></td>
382 <td align="center"><a href="https://github.com/francislavoie"><img src="https://avatars3.githubusercontent.com/u/2111701?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Francis Lavoie</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=francislavoie" title="Code">πŸ’»</a></td>
383 <td align="center"><a href="https://github.com/summerisgone"><img src="https://avatars0.githubusercontent.com/u/106999?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ivan Gromov</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=summerisgone" title="Code">πŸ’»</a></td>
384 <td align="center"><a href="https://twitter.com/deadbeef404"><img src="https://avatars2.githubusercontent.com/u/2100675?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jason Pettett</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=deadbeef404" title="Code">πŸ’»</a></td>
385 <td align="center"><a href="https://github.com/3limin4t0r"><img src="https://avatars2.githubusercontent.com/u/1522964?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Johan</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=3limin4t0r" title="Code">πŸ’»</a></td>
386 <td align="center"><a href="https://github.com/kreegr"><img src="https://avatars0.githubusercontent.com/u/3165058?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matt Krueger</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=kreegr" title="Code">πŸ’»</a></td>
387 <td align="center"><a href="https://github.com/Mithgol"><img src="https://avatars3.githubusercontent.com/u/1088720?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mithgol</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=Mithgol" title="Code">πŸ’»</a></td>
388 </tr>
389 <tr>
390 <td align="center"><a href="https://github.com/mosh11"><img src="https://avatars3.githubusercontent.com/u/13746139?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mosh11</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=mosh11" title="Code">πŸ’»</a></td>
391 <td align="center"><a href="https://sajjad.in/"><img src="https://avatars0.githubusercontent.com/u/371666?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sajjad Anwar</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=geohacker" title="Code">πŸ’»</a></td>
392 <td align="center"><a href="http://snkashis.com/"><img src="https://avatars2.githubusercontent.com/u/361323?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Steve</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=snkashis" title="Code">πŸ’»</a></td>
393 <td align="center"><a href="https://stuartpb.com/"><img src="https://avatars3.githubusercontent.com/u/572196?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Stuart P. Bentley</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=stuartpb" title="Code">πŸ’»</a></td>
394 <td align="center"><a href="https://github.com/joshrainwater"><img src="https://avatars1.githubusercontent.com/u/1697347?v=4?s=100" width="100px;" alt=""/><br /><sub><b>joshrainwater</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=joshrainwater" title="Code">πŸ’»</a></td>
395 <td align="center"><a href="https://maxlath.eu/"><img src="https://avatars2.githubusercontent.com/u/1596934?v=4?s=100" width="100px;" alt=""/><br /><sub><b>maxlath</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=maxlath" title="Code">πŸ’»</a></td>
396 <td align="center"><a href="https://github.com/pwldp"><img src="https://avatars1.githubusercontent.com/u/4376083?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dariusz Pawlak</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=pwldp" title="Code">πŸ’»</a></td>
397 </tr>
398 <tr>
399 <td align="center"><a href="https://github.com/IvelinYR"><img src="https://avatars3.githubusercontent.com/u/18220037?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ivelin Ralev</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=IvelinYR" title="Code">πŸ’»</a> <a href="https://github.com/smeijer/leaflet-geosearch/commits?author=IvelinYR" title="Tests">⚠️</a> <a href="#ideas-IvelinYR" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
400 <td align="center"><a href="https://github.com/SrihariThalla"><img src="https://avatars1.githubusercontent.com/u/7479937?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Srihari Thalla</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=SrihariThalla" title="Code">πŸ’»</a> <a href="https://github.com/smeijer/leaflet-geosearch/commits?author=SrihariThalla" title="Tests">⚠️</a> <a href="#ideas-SrihariThalla" title="Ideas, Planning, & Feedback">πŸ€”</a></td>
401 <td align="center"><a href="https://github.com/tirli"><img src="https://avatars2.githubusercontent.com/u/7783308?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kate Lizogubova</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=tirli" title="Code">πŸ’»</a></td>
402 <td align="center"><a href="https://github.com/CoryLR"><img src="https://avatars3.githubusercontent.com/u/19614782?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Cory Leigh Rahman</b></sub></a><br /><a href="#ideas-CoryLR" title="Ideas, Planning, & Feedback">πŸ€”</a> <a href="https://github.com/smeijer/leaflet-geosearch/commits?author=CoryLR" title="Code">πŸ’»</a></td>
403 <td align="center"><a href="https://github.com/mrsimpson"><img src="https://avatars3.githubusercontent.com/u/17176678?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Oliver JΓ€gle</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=mrsimpson" title="Code">πŸ’»</a></td>
404 <td align="center"><a href="https://github.com/Dusty211"><img src="https://avatars.githubusercontent.com/u/45924716?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kyle Houghton</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=Dusty211" title="Code">πŸ’»</a></td>
405 <td align="center"><a href="https://github.com/nikitauskas"><img src="https://avatars.githubusercontent.com/u/6033577?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nikitauskas</b></sub></a><br /><a href="https://github.com/smeijer/leaflet-geosearch/commits?author=nikitauskas" title="Code">πŸ’»</a></td>
406 </tr>
407</table>
408
409<!-- markdownlint-restore -->
410<!-- prettier-ignore-end -->
411
412<!-- ALL-CONTRIBUTORS-LIST:END -->
413
414This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!