diff --git a/src/SearchControl.ts b/src/SearchControl.ts index d7bda929..9faaf15e 100644 --- a/src/SearchControl.ts +++ b/src/SearchControl.ts @@ -3,6 +3,7 @@ import { ControlPosition, FeatureGroup, MarkerOptions, Map } from 'leaflet'; import SearchElement from './SearchElement'; import ResultList from './resultList'; import debounce from './lib/debounce'; +import { validateCoords } from './coords'; import { createElement, @@ -373,7 +374,13 @@ const Control: SearchControl = { const { provider } = this.options; if (query.length) { - let results = await provider!.search({ query }); + let results = []; + const coords = validateCoords(query); + if (coords) { + results = coords; + } else { + results = await provider!.search({ query }); + } results = results.slice(0, this.options.maxSuggestions); this.resultList.render(results, this.options.resultFormat); } else { @@ -385,7 +392,13 @@ const Control: SearchControl = { this.resultList.clear(); const { provider } = this.options; - const results = await provider!.search(query); + let results = []; + const coords = validateCoords(query); + if (coords) { + results = coords; + } else { + results = await provider!.search(query); + } if (results && results.length > 0) { this.showResult(results[0], query); diff --git a/src/coords.ts b/src/coords.ts new file mode 100644 index 00000000..e413608a --- /dev/null +++ b/src/coords.ts @@ -0,0 +1,23 @@ +// @ts-nocheck + +export function validateCoords(query) { + const q = query?.trim(); + const regex = /^(-?[0-9]*\.?\s*[0-9]*)\s*,?\s*(-?[0-9]*\.?[0-9]*)$/g; + const match = regex.exec(q); + if (match) { + const lat = Number(match[1]); + const lng = Number(match[2]); + if (-90 < lat < 90 && -180 < lng < 180) { + return [ + { + x: lng, + y: lat, + label: q, + bounds: null, + raw: {}, + }, + ]; + } + } + return false; +}