@nextgis/geocoder 1.18.15 → 1.18.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/geocoder.cjs.js +90 -2
- package/lib/geocoder.cjs.js.map +1 -1
- package/lib/geocoder.cjs.prod.js +1 -1
- package/lib/geocoder.cjs.prod.js.map +1 -1
- package/lib/geocoder.esm-browser.js +90 -2
- package/lib/geocoder.esm-browser.js.map +1 -1
- package/lib/geocoder.esm-browser.prod.js +1 -1
- package/lib/geocoder.esm-browser.prod.js.map +1 -1
- package/lib/geocoder.esm-bundler.js +90 -2
- package/lib/geocoder.esm-bundler.js.map +1 -1
- package/lib/geocoder.esm-bundler.prod.js +1 -1
- package/lib/geocoder.esm-bundler.prod.js.map +1 -1
- package/lib/geocoder.global.js +210 -4
- package/lib/geocoder.global.js.map +1 -1
- package/lib/geocoder.global.prod.js +1 -1
- package/lib/geocoder.global.prod.js.map +1 -1
- package/lib/index.d.ts +24 -4
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Bundle of @nextgis/geocoder; version: 1.18.
|
|
1
|
+
/** Bundle of @nextgis/geocoder; version: 1.18.18; author: NextGIS */
|
|
2
2
|
import CancelablePromise from '@nextgis/cancelable-promise';
|
|
3
3
|
import { objectAssign, fixUrlStr } from '@nextgis/utils';
|
|
4
4
|
import NgwConnector from '@nextgis/ngw-connector';
|
|
@@ -35,17 +35,25 @@ class Geocoder extends BaseGeocoder {
|
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
async *search(query) {
|
|
38
|
+
this.abort();
|
|
39
|
+
let allProvidersFailed = true;
|
|
40
|
+
const errors = [];
|
|
38
41
|
for (const provider of this.providers) {
|
|
39
42
|
try {
|
|
40
43
|
const results = provider.search(query);
|
|
41
44
|
for await (const r of results) {
|
|
45
|
+
allProvidersFailed = false;
|
|
42
46
|
yield { ...r, provider, _id: ID++ };
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
catch (er) {
|
|
46
|
-
|
|
50
|
+
errors.push(er);
|
|
47
51
|
}
|
|
48
52
|
}
|
|
53
|
+
if (allProvidersFailed) {
|
|
54
|
+
// If all providers failed, throw an error
|
|
55
|
+
throw new Error(`All providers failed: ${errors.map((e) => e.message).join('; ')}`);
|
|
56
|
+
}
|
|
49
57
|
}
|
|
50
58
|
result(item) {
|
|
51
59
|
if (item.provider) {
|
|
@@ -53,6 +61,43 @@ class Geocoder extends BaseGeocoder {
|
|
|
53
61
|
}
|
|
54
62
|
return CancelablePromise.resolve(undefined);
|
|
55
63
|
}
|
|
64
|
+
async *reverse(coordinates) {
|
|
65
|
+
for (const provider of this.providers) {
|
|
66
|
+
if (!provider.reverse) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const results = provider.reverse(coordinates);
|
|
71
|
+
for await (const r of results) {
|
|
72
|
+
yield { ...r, provider, _id: ID++ };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (er) {
|
|
76
|
+
// Handle or log errors as needed
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Returns the first reverse geocoding result for given coordinates from any provider.
|
|
82
|
+
*
|
|
83
|
+
* @param coordinates - The longitude and latitude values.
|
|
84
|
+
* @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.
|
|
85
|
+
*/
|
|
86
|
+
async reverseGeocodeFirstResult(coordinates) {
|
|
87
|
+
for (const provider of this.providers) {
|
|
88
|
+
if (typeof provider.reverse === 'function') {
|
|
89
|
+
try {
|
|
90
|
+
for await (const result of provider.reverse(coordinates)) {
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('Error in reverse geocoding:', error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
56
101
|
}
|
|
57
102
|
|
|
58
103
|
/**
|
|
@@ -150,6 +195,9 @@ class NgwProvider extends BaseProvider {
|
|
|
150
195
|
});
|
|
151
196
|
return req;
|
|
152
197
|
}
|
|
198
|
+
async *reverse(coordinates) {
|
|
199
|
+
throw new Error('Not implemented');
|
|
200
|
+
}
|
|
153
201
|
_makeSignal() {
|
|
154
202
|
const abortController = new AbortController();
|
|
155
203
|
this._abortControllers.push(abortController);
|
|
@@ -252,6 +300,46 @@ class NominatimProvider extends BaseProvider {
|
|
|
252
300
|
geom: model.geom,
|
|
253
301
|
});
|
|
254
302
|
}
|
|
303
|
+
async *reverse(coordinates) {
|
|
304
|
+
const [lng, lat] = coordinates;
|
|
305
|
+
const url = fixUrlStr(`${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`);
|
|
306
|
+
const request = new CancelablePromise((resolve, reject, onCancel) => {
|
|
307
|
+
const xhr = new XMLHttpRequest();
|
|
308
|
+
xhr.open('GET', url, true);
|
|
309
|
+
xhr.onload = () => {
|
|
310
|
+
try {
|
|
311
|
+
const geojson = JSON.parse(xhr.responseText);
|
|
312
|
+
const feature = geojson.features[0];
|
|
313
|
+
const result = {
|
|
314
|
+
geom: feature,
|
|
315
|
+
extent: feature.bbox,
|
|
316
|
+
text: feature.properties && feature.properties.display_name,
|
|
317
|
+
query: `${lat}, ${lng}`,
|
|
318
|
+
};
|
|
319
|
+
resolve(result);
|
|
320
|
+
}
|
|
321
|
+
catch (er) {
|
|
322
|
+
reject(er);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
xhr.onerror = (er) => {
|
|
326
|
+
reject(er);
|
|
327
|
+
};
|
|
328
|
+
onCancel(() => {
|
|
329
|
+
xhr.abort();
|
|
330
|
+
});
|
|
331
|
+
xhr.send();
|
|
332
|
+
}).catch((er) => {
|
|
333
|
+
if (er.name === 'CancelError') ;
|
|
334
|
+
throw er;
|
|
335
|
+
});
|
|
336
|
+
this._requests.push(request);
|
|
337
|
+
const item = await request;
|
|
338
|
+
if (item) {
|
|
339
|
+
item.result = () => this.result(item);
|
|
340
|
+
yield item;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
255
343
|
}
|
|
256
344
|
|
|
257
345
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocoder.esm-bundler.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param {string} query - The search string to geocode.\n * @yields {AsyncGenerator<SearchItem>} - An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param {SearchItem} item - The search item to get detailed result for.\n * @returns {CancelablePromise<any>} - A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n //\n }\n }\n }\n\n result(item: SearchItem): CancelablePromise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return CancelablePromise.resolve(undefined);\n }\n}\n","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'CancelError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: ResourceItem;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find(\n (f) => f.label_field,\n )?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _requests: CancelablePromise[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n }\n\n abort(): void {\n this._requests.forEach((x) => x.cancel());\n this._requests = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new CancelablePromise<SearchItem[]>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\n }\n }\n }\n\n result(model: SearchItem): CancelablePromise<ResultItem> {\n return CancelablePromise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n}\n","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { Geocoder } from './Geocoder';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geocoder.esm-bundler.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\n\nimport type { LngLatArray } from '@nextgis/utils';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param query - The search string to geocode.\n * @yields An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param item - The search item to get detailed result for.\n * @returns A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n /**\n * Method for reverse geocoding.\n * Takes coordinates and returns the corresponding address or location information.\n *\n * @abstract\n * @param coordinates - The longitude and latitude values.\n * @returns An async generator that yields reverse geocoding results.\n */\n abstract reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n this.abort();\n let allProvidersFailed = true;\n const errors: Error[] = [];\n\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n allProvidersFailed = false;\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n errors.push(er as Error);\n }\n }\n\n if (allProvidersFailed) {\n // If all providers failed, throw an error\n throw new Error(\n `All providers failed: ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n result(item: SearchItem): CancelablePromise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return CancelablePromise.resolve(undefined);\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n if (!provider.reverse) {\n continue;\n }\n\n try {\n const results = provider.reverse(coordinates);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n // Handle or log errors as needed\n }\n }\n }\n\n /**\n * Returns the first reverse geocoding result for given coordinates from any provider.\n *\n * @param coordinates - The longitude and latitude values.\n * @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.\n */\n async reverseGeocodeFirstResult(\n coordinates: LngLatArray,\n ): Promise<SearchItem | undefined> {\n for (const provider of this.providers) {\n if (typeof provider.reverse === 'function') {\n try {\n for await (const result of provider.reverse(coordinates)) {\n return result;\n }\n } catch (error) {\n console.error('Error in reverse geocoding:', error);\n }\n }\n }\n return undefined;\n }\n}\n","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'CancelError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n throw new Error('Not implemented');\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: ResourceItem;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find((f) => f.label_field)\n ?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { LngLatArray, fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { ResultItem } from '../types/ResultItem';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _requests: CancelablePromise[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n }\n\n abort(): void {\n this._requests.forEach((x) => x.cancel());\n this._requests = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new CancelablePromise<SearchItem[]>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\n }\n }\n }\n\n result(model: SearchItem): CancelablePromise<ResultItem> {\n return CancelablePromise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n\n\n async *reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem, void, unknown> {\n const [lng, lat] = coordinates;\n const url = fixUrlStr(\n `${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`,\n );\n const request = new CancelablePromise<SearchItem>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const feature = geojson.features[0];\n const result: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n resolve(result);\n } catch (er) {\n reject(er);\n }\n };\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const item = await request;\n if (item) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n}\n","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { Geocoder } from './Geocoder';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":[],"mappings":";;;;;;AAMA;;;;;AAKG;MACmB,YAAY,CAAA;AAGhC,IAAA,WAAA,CAAY,OAAW,EAAA;AACrB,QAAA,IAAI,OAAO,EAAE;AACX,YAAA,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7B,SAAA;KACF;AAoCF;;AC/CD,IAAI,EAAE,GAAG,CAAC,CAAC;AAEL,MAAO,QAAS,SAAQ,YAA6B,CAAA;AAGzD,IAAA,WAAA,CAAY,OAAwB,EAAA;QAClC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHjB,IAAS,CAAA,SAAA,GAAmB,EAAE,CAAC;AAI7B,QAAA,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;AACpC,SAAA;KACF;IAED,KAAK,GAAA;QACH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;YAC3B,IAAI,CAAC,CAAC,KAAK,EAAE;gBACX,CAAC,CAAC,KAAK,EAAE,CAAC;AACX,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,OAAO,MAAM,CAAC,KAAa,EAAA;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,kBAAkB,GAAG,IAAI,CAAC;QAC9B,MAAM,MAAM,GAAY,EAAE,CAAC;AAE3B,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;YACrC,IAAI;gBACF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEvC,gBAAA,WAAW,MAAM,CAAC,IAAI,OAAO,EAAE;oBAC7B,kBAAkB,GAAG,KAAK,CAAC;oBAC3B,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;AACrC,iBAAA;AACF,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAW,CAAC,CAAC;AAC1B,aAAA;AACF,SAAA;AAED,QAAA,IAAI,kBAAkB,EAAE;;YAEtB,MAAM,IAAI,KAAK,CACb,CAAyB,sBAAA,EAAA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAAA,CACnE,CAAC;AACH,SAAA;KACF;AAED,IAAA,MAAM,CAAC,IAAgB,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACnC,SAAA;AACD,QAAA,OAAO,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;KAC7C;AAED,IAAA,OAAO,OAAO,CACZ,WAAwB,EAAA;AAExB,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;gBACrB,SAAS;AACV,aAAA;YAED,IAAI;gBACF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAE9C,gBAAA,WAAW,MAAM,CAAC,IAAI,OAAO,EAAE;oBAC7B,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;AACrC,iBAAA;AACF,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;;AAEZ,aAAA;AACF,SAAA;KACF;AAED;;;;;AAKG;IACH,MAAM,yBAAyB,CAC7B,WAAwB,EAAA;AAExB,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AACrC,YAAA,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,UAAU,EAAE;gBAC1C,IAAI;oBACF,WAAW,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AACxD,wBAAA,OAAO,MAAM,CAAC;AACf,qBAAA;AACF,iBAAA;AAAC,gBAAA,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;AACrD,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;KAClB;AACF;;ACpGD;;;;AAIG;AACG,MAAgB,YAEpB,SAAQ,YAAe,CAAA;AAYxB;;AC0CK,MAAO,WAAY,SAAQ,YAAgC,CAAA;AAQ/D,IAAA,WAAA,CAAY,OAA2B,EAAA;;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QANjB,IAAe,CAAA,eAAA,GAAqB,EAAE,CAAC;QAG/B,IAAiB,CAAA,iBAAA,GAAsB,EAAE,CAAC;AAIhD,QAAA,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAC,CAAA,EAAA,GAAA,OAAO,CAAC,gBAAgB,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,CAAA,EAAE;AAC5D,YAAA,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;AACH,SAAA;AAED,QAAA,IAAI,CAAC,SAAS;AACZ,YAAA,OAAO,CAAC,SAAS;AACjB,gBAAA,IAAI,YAAY,CAAC;oBACf,OAAO,EAAE,IAAI,CAAC,SAAS;oBACvB,GAAG,OAAO,CAAC,gBAAgB;AAC5B,iBAAA,CAAC,CAAC;AACL,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;KAChD;IAED,KAAK,GAAA;QACH,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;YACnC,CAAC,CAAC,KAAK,EAAE,CAAC;AACZ,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;KACnC;AAED,IAAA,OAAO,MAAM,CAAC,KAAa,EAAA;;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAClC,QAAA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE;YACzC,IAAI,MAAM,CAAC,OAAO,EAAE;gBAClB,MAAM;AACP,aAAA;AACD,YAAA,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;YAEhC,MAAM,KAAK,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,KAAK,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,WAAW,CAAC,KAAK,CAAC;;YAEhD,MAAM,UAAU,GAAG,CAAA,EAAA,GAAC,MAAc,CAAC,EAAE,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,MAAM,CAAC,UAAU,CAAC;YAE3D,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE;AAClE,oBAAA,KAAK,EAAE,IAAI;AACZ,iBAAA,CAAC,CAAC;AAEH,gBAAA,MAAM,OAAO,GAAyB;oBACpC,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,UAAU;oBACV,MAAM;oBACN,KAAK;iBACN,CAAC;gBAEF,IAAI,YAAY,KAAK,MAAM,EAAE;AAC3B,oBAAA,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;AACtB,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,iBAAA;AAED,gBAAA,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAE5C,gBAAA,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;AAE9B,gBAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;oBAC7B,OAAO;oBACP,KAAK;oBACL,MAAM;AACN,oBAAA,YAAY,EAAE,QAAQ;AACvB,iBAAA,CAAC,EAAE;AACF,oBAAA,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,oBAAA,MAAM,IAAI,CAAC;AACZ,iBAAA;AACF,aAAA;AAAC,YAAA,OAAO,EAAE,EAAE;AACX,gBAAA,IACE,EAAE;AACF,oBAAA,MAAM,IAAK,EAAY;AACtB,oBAAA,EAAY,CAAC,IAAI,KAAK,aAAa,EACpC;AACA,oBAAA,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,iBAAA;AACF,aAAA;AACF,SAAA;KACF;AAED,IAAA,MAAM,CAAC,IAAmB,EAAA;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS;AACvB,aAAA,GAAG,CACF,mCAAmC,EACnC,EAAE,MAAM,EAAE,EACV;YACE,EAAE,EAAE,IAAI,CAAC,UAAU;YACnB,GAAG,EAAE,IAAI,CAAC,SAAS;SACpB,CACF;AACA,aAAA,IAAI,CAAC,CAAC,CAAC,KAAI;AACV,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YACnB,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;aACjD,CAAC;AACJ,SAAC,CAAC,CAAC;AACL,QAAA,OAAO,GAAG,CAAC;KACZ;AAED,IAAA,OAAO,OAAO,CACZ,WAAwB,EAAA;AAExB,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;KACpC;IAEO,WAAW,GAAA;AACjB,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAC9C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7C,OAAO,eAAe,CAAC,MAAM,CAAC;KAC/B;IAEO,MAAM,CAAC,EACb,OAAO,EACP,KAAK,EACL,MAAM,EACN,YAAY,GAMb,EAAA;;QACC,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,IAAI,UAAU,GAAuB,SAAS,CAAC;QAE/C,IAAI,YAAY,CAAC,aAAa,EAAE;YAC9B,UAAU,GAAG,MAAA,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,MACrE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,CAAC;AACb,SAAA;AAED,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CACpC,CAAC,CAAC,eAAK,OAAA,CAAA,EAAA,GAAC,CAAS,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC,UAAU,KAAK,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAA,EAAA,CAClE,CAAC;AACF,QAAA,IAAI,IAAI,EAAE;AACR,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACxB,gBAAA,IAAI,IAAI,GAAG,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;gBAC5D,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,oBAAA,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;AACzB,wBAAA,IAAI,EAAE,KAAK;wBACX,YAAY;AACb,qBAAA,CAAC,CAAC;AACJ,iBAAA;AAAM,qBAAA,IAAI,UAAU,EAAE;AACrB,oBAAA,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AACjC,iBAAA;gBAED,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,KAAK,EAAE,KAAK;oBACZ,IAAI;oBACJ,SAAS,EAAE,KAAK,CAAC,EAAE;AACnB,oBAAA,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE;AACpC,oBAAA,IAAI,EAAE,KAAK;oBACX,YAAY;AACb,iBAAA,CAAC,CAAC;AACL,aAAC,CAAC,CAAC;AACJ,SAAA;AACD,QAAA,OAAO,KAAK,CAAC;KACd;;AArKM,WAAK,CAAA,KAAA,GAAG,GAAH;;ACzDR,MAAO,iBAAkB,SAAQ,YAAY,CAAA;AAKjD,IAAA,WAAA,CAAY,OAA6B,EAAA;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QALjB,IAAS,CAAA,SAAA,GAAG,qCAAqC,CAAC;QAE1C,IAAS,CAAA,SAAA,GAAwB,EAAE,CAAC;KAI3C;IAED,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACrB;AAED,IAAA,OAAO,MAAM,CAAC,GAAW,EAAA;;QAEvB,MAAM,GAAG,GAAG,SAAS;;AAEnB,QAAA,CAAA,EAAG,IAAI,CAAC,SAAS,8CAA8C,GAAG,CAAA,CAAE,CACrE,CAAC;AACF,QAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,KAAI;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,YAAA,GAAG,CAAC,MAAM,GAAG,MAAK;gBAChB,IAAI;oBACF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAsB,CAAC;oBAClE,MAAM,QAAQ,GAAiB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;wBACxD,OAAO;AACL,4BAAA,IAAI,EAAE,CAAC;4BACP,MAAM,EAAE,CAAC,CAAC,IAAI;4BACd,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY;AAC/C,4BAAA,KAAK,EAAE,GAAG;yBACX,CAAC;AACJ,qBAAC,CAAC,CAAC;oBACH,OAAO,CAAC,QAAQ,CAAC,CAAC;AACnB,iBAAA;AAAC,gBAAA,OAAO,EAAE,EAAE;oBACX,MAAM,CAAC,EAAE,CAAC,CAAC;AACZ,iBAAA;AACH,aAAC,CAAC;AAEF,YAAA,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,KAAI;gBACnB,MAAM,CAAC,EAAE,CAAC,CAAC;AACb,aAAC,CAAC;YAEF,QAAQ,CAAC,MAAK;gBACZ,GAAG,CAAC,KAAK,EAAE,CAAC;AACd,aAAC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,EAAE,CAAC;AACb,SAAC,CACF,CAAC,KAAK,CAAC,CAAC,EAAE,KAAI;AACb,YAAA,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,EAAE,CAE9B;AACD,YAAA,MAAM,EAAE,CAAC;AACX,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,QAAA,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC;AAC5B,QAAA,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACrB,gBAAA,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAChC,gBAAA,MAAM,CAAC,CAAC;AACT,aAAA;AACF,SAAA;KACF;AAED,IAAA,MAAM,CAAC,KAAiB,EAAA;QACtB,OAAO,iBAAiB,CAAC,OAAO,CAAC;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,YAAA,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;YAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;AACjB,SAAA,CAAC,CAAC;KACJ;AAGC,IAAA,OAAO,OAAO,CAAC,WAAwB,EAAA;AACrC,QAAA,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC;AAC/B,QAAA,MAAM,GAAG,GAAG,SAAS,CACnB,GAAG,IAAI,CAAC,SAAS,CAAA,4BAAA,EAA+B,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CACjE,CAAC;AACF,QAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,KAAI;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,YAAA,GAAG,CAAC,MAAM,GAAG,MAAK;gBAChB,IAAI;oBACF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAsB,CAAC;oBAClE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACpC,oBAAA,MAAM,MAAM,GAAe;AACzB,wBAAA,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,OAAO,CAAC,IAAI;wBACpB,IAAI,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY;AAC3D,wBAAA,KAAK,EAAE,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,GAAG,CAAE,CAAA;qBACxB,CAAC;oBACF,OAAO,CAAC,MAAM,CAAC,CAAC;AACjB,iBAAA;AAAC,gBAAA,OAAO,EAAE,EAAE;oBACX,MAAM,CAAC,EAAE,CAAC,CAAC;AACZ,iBAAA;AACH,aAAC,CAAC;AACF,YAAA,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,KAAI;gBACnB,MAAM,CAAC,EAAE,CAAC,CAAC;AACb,aAAC,CAAC;YAEF,QAAQ,CAAC,MAAK;gBACZ,GAAG,CAAC,KAAK,EAAE,CAAC;AACd,aAAC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,EAAE,CAAC;AACb,SAAC,CACF,CAAC,KAAK,CAAC,CAAC,EAAE,KAAI;AACb,YAAA,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,EAAE,CAE9B;AACD,YAAA,MAAM,EAAE,CAAC;AACX,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7B,QAAA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;AAC3B,QAAA,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,YAAA,MAAM,IAAI,CAAC;AACZ,SAAA;KACF;AACJ;;ACnID;;;;;AAKG;AAaG,SAAU,MAAM,CAAC,OAAwB,EAAA;AAC7C,IAAA,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/B;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"@nextgis/cancelable-promise";import{objectAssign as r,fixUrlStr as t}from"@nextgis/utils";import s from"@nextgis/ngw-connector";import{fetchNgwLayerItems as o}from"@nextgis/ngw-kit";class n{constructor(e){e&&r(this,e)}}let i=0;class c extends n{constructor(e){super(e),this.providers=[],e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach((e=>{e.abort&&e.abort()}))}async*search(e){
|
|
1
|
+
import e from"@nextgis/cancelable-promise";import{objectAssign as r,fixUrlStr as t}from"@nextgis/utils";import s from"@nextgis/ngw-connector";import{fetchNgwLayerItems as o}from"@nextgis/ngw-kit";class n{constructor(e){e&&r(this,e)}}let i=0;class c extends n{constructor(e){super(e),this.providers=[],e&&e.providers&&(this.providers=e.providers)}abort(){this.providers.forEach((e=>{e.abort&&e.abort()}))}async*search(e){this.abort();let r=!0;const t=[];for(const o of this.providers)try{const t=o.search(e);for await(const e of t)r=!1,yield{...e,provider:o,_id:i++}}catch(s){t.push(s)}if(r)throw new Error(`All providers failed: ${t.map((e=>e.message)).join("; ")}`)}result(r){return r.provider?r.provider.result(r):e.resolve(void 0)}async*reverse(e){for(const t of this.providers)if(t.reverse)try{const r=t.reverse(e);for await(const e of r)yield{...e,provider:t,_id:i++}}catch(r){}}async reverseGeocodeFirstResult(e){for(const t of this.providers)if("function"==typeof t.reverse)try{for await(const r of t.reverse(e))return r}catch(r){console.error("Error in reverse geocoding:",r)}}}class a extends n{}class l extends a{constructor(e){var r;if(super(e),this.searchResources=[],this._abortControllers=[],!e.searchUrl&&!(null===(r=e.connectorOptions)||void 0===r?void 0:r.baseUrl))throw new Error("The `searchUrl` of `connectorOptions.baseUrl` are required");this.connector=e.connector||new s({baseUrl:this.searchUrl,...e.connectorOptions}),this.searchResources=e.searchResources}abort(){this._abortControllers.forEach((e=>{e.abort()})),this._abortControllers.length=0}async*search(e){var r,t;const s=this._makeSignal();for(const i of this.searchResources){if(s.aborted)break;const{searchMethod:c}=i,a=null!==(r=i.limit)&&void 0!==r?r:l.limit,h=null!==(t=i.id)&&void 0!==t?t:i.resourceId;try{const r=await this.connector.getResourceOrFail(h,{cache:!0}),t={connector:this.connector,resourceId:h,signal:s,limit:a};"like"===c?t.like=e:t.ilike=e;const n=o(t),l=await n;for(const s of this._items({entries:l,query:e,config:i,resourceItem:r}))s.result=()=>this.result(s),yield s}catch(n){n&&"name"in n&&"CancelError"!==n.name&&console.warn(n)}}}result(e){const r=this._makeSignal();return this.connector.get("feature_layer.feature.item_extent",{signal:r},{id:e.resourceId,fid:e.featureId}).then((r=>{const t=r.extent;return{text:e.text,extent:[t.minLon,t.minLat,t.maxLon,t.maxLat]}}))}async*reverse(e){throw new Error("Not implemented")}_makeSignal(){const e=new AbortController;return this._abortControllers.push(e),e.signal}_items({entries:e,query:r,config:t,resourceItem:s}){var o;const n=[];let i;s.feature_layer&&(i=null===(o=s.feature_layer.fields.find((e=>e.label_field)))||void 0===o?void 0:o.keyname);const c=this.searchResources.find((e=>{var r;return null!==(r=e.id)&&void 0!==r?r:e.resourceId===s.resource.id}));return c&&e.forEach((e=>{let o=i?e.fields[i]:e.id;t.renderSearch?o=t.renderSearch({item:e,resourceItem:s}):i&&(o=e.fields[i]),n.push({query:r,text:o,featureId:e.id,resourceId:s.resource.id,item:e,resourceItem:s})})),n}}l.limit=300;class h extends a{constructor(e){super(e),this.searchUrl="https://nominatim.openstreetmap.org",this._requests=[]}abort(){this._requests.forEach((e=>e.cancel())),this._requests=[]}async*search(r){const s=t(`${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${r}`),o=new e(((e,t,o)=>{const n=new XMLHttpRequest;n.open("GET",s,!0),n.onload=()=>{try{const t=JSON.parse(n.responseText).features.map((e=>({geom:e,extent:e.bbox,text:e.properties&&e.properties.display_name,query:r})));e(t)}catch(s){t(s)}},n.onerror=e=>{t(e)},o((()=>{n.abort()})),n.send()})).catch((e=>{throw e}));this._requests.push(o);const n=await o;if(n)for(const e of n)e.result=()=>this.result(e),yield e}result(r){return e.resolve({text:r.text,extent:r.extent||[],geom:r.geom})}async*reverse(r){const[s,o]=r,n=t(`${this.searchUrl}/reverse?format=geojson&lat=${o}&lon=${s}`),i=new e(((e,r,t)=>{const i=new XMLHttpRequest;i.open("GET",n,!0),i.onload=()=>{try{const r=JSON.parse(i.responseText).features[0];e({geom:r,extent:r.bbox,text:r.properties&&r.properties.display_name,query:`${o}, ${s}`})}catch(t){r(t)}},i.onerror=e=>{r(e)},t((()=>{i.abort()})),i.send()})).catch((e=>{throw e}));this._requests.push(i);const c=await i;c&&(c.result=()=>this.result(c),yield c)}}function u(e){return new c(e)}export{a as BaseProvider,c as Geocoder,l as NgwProvider,h as NominatimProvider,u as create};
|
|
2
2
|
//# sourceMappingURL=geocoder.esm-bundler.prod.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geocoder.esm-bundler.prod.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param {string} query - The search string to geocode.\n * @yields {AsyncGenerator<SearchItem>} - An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param {SearchItem} item - The search item to get detailed result for.\n * @returns {CancelablePromise<any>} - A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n //\n }\n }\n }\n\n result(item: SearchItem): CancelablePromise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return CancelablePromise.resolve(undefined);\n }\n}\n","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'CancelError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: ResourceItem;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find(\n (f) => f.label_field,\n )?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport { SearchItem } from '../types/SearchItem';\nimport { ResultItem } from '../types/ResultItem';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _requests: CancelablePromise[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n }\n\n abort(): void {\n this._requests.forEach((x) => x.cancel());\n this._requests = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new CancelablePromise<SearchItem[]>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\n }\n }\n }\n\n result(model: SearchItem): CancelablePromise<ResultItem> {\n return CancelablePromise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n}\n","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { Geocoder } from './Geocoder';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["BaseGeocoder","constructor","options","objectAssign","this","ID","Geocoder","super","providers","abort","forEach","x","search","query","provider","results","r","_id","er","result","item","CancelablePromise","resolve","undefined","BaseProvider","NgwProvider","searchResources","_abortControllers","searchUrl","_a","connectorOptions","baseUrl","Error","connector","NgwConnector","a","length","signal","_makeSignal","config","aborted","searchMethod","limit","resourceId","_b","id","resource","getResourceOrFail","cache","like","ilike","request","fetchNgwLayerItems","entries","_items","resourceItem","name","console","warn","get","fid","featureId","then","e","extent","text","minLon","minLat","maxLon","maxLat","abortController","AbortController","push","items","labelField","feature_layer","fields","find","f","label_field","keyname","meta","entry","renderSearch","NominatimProvider","_requests","cancel","val","url","fixUrlStr","reject","onCancel","xhr","XMLHttpRequest","open","onload","features","JSON","parse","responseText","map","geom","bbox","properties","display_name","onerror","send","catch","i","model","create"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geocoder.esm-bundler.prod.js","sources":["../src/BaseGeocoder.ts","../src/Geocoder.ts","../src/providers/BaseProvider.ts","../src/providers/NgwProvider.ts","../src/providers/NominatimProvider.ts","../src/index.ts"],"sourcesContent":["import { objectAssign } from '@nextgis/utils';\n\nimport type { LngLatArray } from '@nextgis/utils';\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type { SearchItem } from './types/SearchItem';\n\n/**\n * Represents the base class for a geocoder.\n * This abstract class provides the basic methods that every geocoder should implement.\n *\n * @template O - The type of options that can be passed to the geocoder.\n */\nexport abstract class BaseGeocoder<\n O extends Record<string, any> = Record<string, any>,\n> {\n constructor(options?: O) {\n if (options) {\n objectAssign(this, options);\n }\n }\n\n /**\n * Search method to retrieve geocoding results.\n *\n * @abstract\n * @param query - The search string to geocode.\n * @yields An async generator that yields search results.\n */\n abstract search(query: string): AsyncGenerator<SearchItem>;\n\n /**\n * Method to retrieve detailed result for a specific search item.\n *\n * @abstract\n * @param item - The search item to get detailed result for.\n * @returns A promise that resolves to the detailed result.\n */\n abstract result(item: SearchItem): CancelablePromise<any>;\n\n /**\n * Method for reverse geocoding.\n * Takes coordinates and returns the corresponding address or location information.\n *\n * @abstract\n * @param coordinates - The longitude and latitude values.\n * @returns An async generator that yields reverse geocoding results.\n */\n abstract reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem>;\n\n /**\n * Optional method to abort any ongoing geocoding requests.\n *\n * @abstract\n */\n abstract abort?(): void;\n}\n","import CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './providers/BaseProvider';\nimport { GeocoderOptions } from './GeocoderOptions';\nimport { BaseGeocoder } from './BaseGeocoder';\nimport { SearchItem } from './types/SearchItem';\n\nimport type { LngLatArray } from '@nextgis/utils';\n\nlet ID = 0;\n\nexport class Geocoder extends BaseGeocoder<GeocoderOptions> {\n providers: BaseProvider[] = [];\n\n constructor(options: GeocoderOptions) {\n super(options);\n if (options && options.providers) {\n this.providers = options.providers;\n }\n }\n\n abort(): void {\n this.providers.forEach((x) => {\n if (x.abort) {\n x.abort();\n }\n });\n }\n\n async *search(query: string): AsyncGenerator<SearchItem, void, unknown> {\n this.abort();\n let allProvidersFailed = true;\n const errors: Error[] = [];\n\n for (const provider of this.providers) {\n try {\n const results = provider.search(query);\n\n for await (const r of results) {\n allProvidersFailed = false;\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n errors.push(er as Error);\n }\n }\n\n if (allProvidersFailed) {\n // If all providers failed, throw an error\n throw new Error(\n `All providers failed: ${errors.map((e) => e.message).join('; ')}`,\n );\n }\n }\n\n result(item: SearchItem): CancelablePromise<any> {\n if (item.provider) {\n return item.provider.result(item);\n }\n return CancelablePromise.resolve(undefined);\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n for (const provider of this.providers) {\n if (!provider.reverse) {\n continue;\n }\n\n try {\n const results = provider.reverse(coordinates);\n\n for await (const r of results) {\n yield { ...r, provider, _id: ID++ };\n }\n } catch (er) {\n // Handle or log errors as needed\n }\n }\n }\n\n /**\n * Returns the first reverse geocoding result for given coordinates from any provider.\n *\n * @param coordinates - The longitude and latitude values.\n * @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.\n */\n async reverseGeocodeFirstResult(\n coordinates: LngLatArray,\n ): Promise<SearchItem | undefined> {\n for (const provider of this.providers) {\n if (typeof provider.reverse === 'function') {\n try {\n for await (const result of provider.reverse(coordinates)) {\n return result;\n }\n } catch (error) {\n console.error('Error in reverse geocoding:', error);\n }\n }\n }\n return undefined;\n }\n}\n","import { BaseProviderOptions } from './BaseProviderOptions';\nimport { BaseGeocoder } from '../BaseGeocoder';\n\n/**\n * Abstract base class representing a search provider.\n * It builds upon the BaseGeocoder functionalities with provider-specific properties.\n * @template O - Options type which extends BaseProviderOptions.\n */\nexport abstract class BaseProvider<\n O extends BaseProviderOptions = BaseProviderOptions,\n> extends BaseGeocoder<O> {\n /**\n * URL endpoint for the search service.\n * This is where queries will be sent to obtain search results.\n */\n searchUrl?: string;\n\n /**\n * Label to represent the provider.\n * Useful for user interfaces to display the source of search results.\n */\n label?: string;\n}\n","import NgwConnector from '@nextgis/ngw-connector';\nimport { fetchNgwLayerItems } from '@nextgis/ngw-kit';\n\nimport { BaseProvider } from './BaseProvider';\n\nimport type CancelablePromise from '@nextgis/cancelable-promise';\nimport type {\n FeatureItem,\n NgwConnectorOptions,\n ResourceItem,\n} from '@nextgis/ngw-connector';\nimport type { FetchNgwItemsOptions } from '@nextgis/ngw-kit';\nimport type { LngLatArray } from '@nextgis/utils';\n\nimport type { ResultItem } from '../types/ResultItem';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { BaseProviderOptions } from './BaseProviderOptions';\n\n/**\n * Extends the basic search item with NGW-specific properties.\n */\ninterface NgwSearchItem extends SearchItem {\n /** ID of the NGW resource */\n resourceId: number;\n /** ID of the feature in the NGW resource */\n featureId: number;\n /** The specific feature item from NGW */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Defines the structure for a rendered search item.\n */\ninterface RenderSearchItem {\n /** The specific feature item */\n item: FeatureItem;\n /** The NGW resource item */\n resourceItem: ResourceItem;\n}\n\n/**\n * Options for searching within a NGW resource.\n */\ninterface SearchResource extends FetchNgwItemsOptions {\n /** The search method used ('ilike' is case-insensitive) */\n searchMethod?: 'ilike' | 'like';\n /** Custom rendering function for search results */\n renderSearch?: (item: RenderSearchItem) => string | HTMLElement;\n}\n\n/**\n * Options required to initialize an NGW provider.\n */\ninterface NgwProviderOptions extends BaseProviderOptions {\n /** Connector instance for NGW. If not provided, will be created internally */\n connector?: NgwConnector;\n /** List of NGW resources to search within */\n searchResources: SearchResource[];\n /** Options for the internal NgwConnector (if one needs to be created) */\n connectorOptions?: NgwConnectorOptions;\n}\n\nexport class NgwProvider extends BaseProvider<NgwProviderOptions> {\n static limit = 300;\n\n searchResources: SearchResource[] = [];\n\n private connector: NgwConnector;\n private _abortControllers: AbortController[] = [];\n\n constructor(options: NgwProviderOptions) {\n super(options);\n if (!options.searchUrl && !options.connectorOptions?.baseUrl) {\n throw new Error(\n 'The `searchUrl` of `connectorOptions.baseUrl` are required',\n );\n }\n\n this.connector =\n options.connector ||\n new NgwConnector({\n baseUrl: this.searchUrl,\n ...options.connectorOptions,\n });\n this.searchResources = options.searchResources;\n }\n\n abort(): void {\n this._abortControllers.forEach((a) => {\n a.abort();\n });\n this._abortControllers.length = 0;\n }\n\n async *search(query: string): AsyncGenerator<NgwSearchItem, void, unknown> {\n const signal = this._makeSignal();\n for (const config of this.searchResources) {\n if (signal.aborted) {\n break;\n }\n const { searchMethod } = config;\n\n const limit = config.limit ?? NgwProvider.limit;\n //\n const resourceId = (config as any).id ?? config.resourceId;\n\n try {\n const resource = await this.connector.getResourceOrFail(resourceId, {\n cache: true,\n });\n\n const options: FetchNgwItemsOptions = {\n connector: this.connector,\n resourceId,\n signal,\n limit,\n };\n\n if (searchMethod === 'like') {\n options.like = query;\n } else {\n options.ilike = query;\n }\n\n const request = fetchNgwLayerItems(options);\n\n const entries = await request;\n\n for (const item of this._items({\n entries,\n query,\n config,\n resourceItem: resource,\n })) {\n item.result = () => this.result(item);\n yield item;\n }\n } catch (er) {\n if (\n er &&\n 'name' in (er as Error) &&\n (er as Error).name !== 'CancelError'\n ) {\n console.warn(er);\n }\n }\n }\n }\n\n result(item: NgwSearchItem): CancelablePromise<ResultItem> {\n const signal = this._makeSignal();\n const req = this.connector\n .get(\n 'feature_layer.feature.item_extent',\n { signal },\n {\n id: item.resourceId,\n fid: item.featureId,\n },\n )\n .then((x) => {\n const e = x.extent;\n return {\n text: item.text,\n extent: [e.minLon, e.minLat, e.maxLon, e.maxLat],\n };\n });\n return req;\n }\n\n async *reverse(\n coordinates: LngLatArray,\n ): AsyncGenerator<SearchItem, void, unknown> {\n throw new Error('Not implemented');\n }\n\n private _makeSignal() {\n const abortController = new AbortController();\n this._abortControllers.push(abortController);\n return abortController.signal;\n }\n\n private _items({\n entries,\n query,\n config,\n resourceItem,\n }: {\n config: SearchResource;\n entries: FeatureItem[];\n query: string;\n resourceItem: ResourceItem;\n }): NgwSearchItem[] {\n const items: NgwSearchItem[] = [];\n\n let labelField: string | undefined = undefined;\n\n if (resourceItem.feature_layer) {\n labelField = resourceItem.feature_layer.fields.find((f) => f.label_field)\n ?.keyname;\n }\n\n const meta = this.searchResources.find(\n (x) => (x as any).id ?? x.resourceId === resourceItem.resource.id,\n );\n if (meta) {\n entries.forEach((entry) => {\n let text = labelField ? entry.fields[labelField] : entry.id;\n if (config.renderSearch) {\n text = config.renderSearch({\n item: entry,\n resourceItem,\n });\n } else if (labelField) {\n text = entry.fields[labelField];\n }\n\n items.push({\n query: query,\n text,\n featureId: entry.id,\n resourceId: resourceItem.resource.id,\n item: entry,\n resourceItem,\n });\n });\n }\n return items;\n }\n}\n","import { LngLatArray, fixUrlStr } from '@nextgis/utils';\nimport CancelablePromise from '@nextgis/cancelable-promise';\nimport { BaseProvider } from './BaseProvider';\nimport { BaseProviderOptions } from './BaseProviderOptions';\nimport { FeatureCollection } from 'geojson';\nimport type { SearchItem } from '../types/SearchItem';\nimport type { ResultItem } from '../types/ResultItem';\n\nexport class NominatimProvider extends BaseProvider {\n searchUrl = 'https://nominatim.openstreetmap.org';\n\n private _requests: CancelablePromise[] = [];\n\n constructor(options?: BaseProviderOptions) {\n super(options);\n }\n\n abort(): void {\n this._requests.forEach((x) => x.cancel());\n this._requests = [];\n }\n\n async *search(val: string): AsyncGenerator<SearchItem, void, unknown> {\n // RFC2616 accept - language string\n const url = fixUrlStr(\n // `${this.baseUrl}/search?format=geojson&polygon_geojson=1${window.locale === 'ru' ? '&accept-language=ru-RU,en-US' : ''}&q=${val}`\n `${this.searchUrl}/search?format=geojson&polygon_geojson=1&q=${val}`,\n );\n const request = new CancelablePromise<SearchItem[]>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const features: SearchItem[] = geojson.features.map((x) => {\n return {\n geom: x,\n extent: x.bbox,\n text: x.properties && x.properties.display_name,\n query: val,\n };\n });\n resolve(features);\n } catch (er) {\n reject(er);\n }\n };\n\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const items = await request;\n if (items) {\n for (const i of items) {\n i.result = () => this.result(i);\n yield i;\n }\n }\n }\n\n result(model: SearchItem): CancelablePromise<ResultItem> {\n return CancelablePromise.resolve({\n text: model.text,\n extent: model.extent || [],\n geom: model.geom,\n });\n }\n\n\n async *reverse(coordinates: LngLatArray): AsyncGenerator<SearchItem, void, unknown> {\n const [lng, lat] = coordinates;\n const url = fixUrlStr(\n `${this.searchUrl}/reverse?format=geojson&lat=${lat}&lon=${lng}`,\n );\n const request = new CancelablePromise<SearchItem>(\n (resolve, reject, onCancel) => {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.onload = () => {\n try {\n const geojson = JSON.parse(xhr.responseText) as FeatureCollection;\n const feature = geojson.features[0];\n const result: SearchItem = {\n geom: feature,\n extent: feature.bbox,\n text: feature.properties && feature.properties.display_name,\n query: `${lat}, ${lng}`,\n };\n resolve(result);\n } catch (er) {\n reject(er);\n }\n };\n xhr.onerror = (er) => {\n reject(er);\n };\n\n onCancel(() => {\n xhr.abort();\n });\n\n xhr.send();\n },\n ).catch((er) => {\n if (er.name === 'CancelError') {\n //\n }\n throw er;\n });\n this._requests.push(request);\n const item = await request;\n if (item) {\n item.result = () => this.result(item);\n yield item;\n }\n }\n}\n","/**\n * Modern geocoder on async generators. May use different data providers.\n *\n * @packageDocumentation\n * @module geocoder\n */\nimport { Geocoder } from './Geocoder';\nimport type { GeocoderOptions } from './GeocoderOptions';\n\nexport { Geocoder, GeocoderOptions };\nexport { BaseProvider } from './providers/BaseProvider';\nexport { NgwProvider } from './providers/NgwProvider';\nexport { NominatimProvider } from './providers/NominatimProvider';\n\nexport * from './providers/BaseProviderOptions';\nexport * from './types/ResultItem';\nexport * from './types/SearchItem';\n\nexport function create(options: GeocoderOptions): Geocoder {\n return new Geocoder(options);\n}\n"],"names":["BaseGeocoder","constructor","options","objectAssign","this","ID","Geocoder","super","providers","abort","forEach","x","search","query","allProvidersFailed","errors","provider","results","r","_id","er","push","Error","map","e","message","join","result","item","CancelablePromise","resolve","undefined","reverse","coordinates","reverseGeocodeFirstResult","error","console","BaseProvider","NgwProvider","searchResources","_abortControllers","searchUrl","_a","connectorOptions","baseUrl","connector","NgwConnector","a","length","signal","_makeSignal","config","aborted","searchMethod","limit","resourceId","_b","id","resource","getResourceOrFail","cache","like","ilike","request","fetchNgwLayerItems","entries","_items","resourceItem","name","warn","get","fid","featureId","then","extent","text","minLon","minLat","maxLon","maxLat","abortController","AbortController","items","labelField","feature_layer","fields","find","f","label_field","keyname","meta","entry","renderSearch","NominatimProvider","_requests","cancel","val","url","fixUrlStr","reject","onCancel","xhr","XMLHttpRequest","open","onload","features","JSON","parse","responseText","geom","bbox","properties","display_name","onerror","send","catch","i","model","lng","lat","feature","create"],"mappings":"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"}
|
package/lib/geocoder.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Bundle of @nextgis/geocoder; version: 1.18.
|
|
1
|
+
/** Bundle of @nextgis/geocoder; version: 1.18.18; author: NextGIS */
|
|
2
2
|
var Geocoder = (function (exports) {
|
|
3
3
|
'use strict';
|
|
4
4
|
|
|
@@ -710,11 +710,14 @@ var Geocoder = (function (exports) {
|
|
|
710
710
|
};
|
|
711
711
|
Geocoder.prototype.search = function (query) {
|
|
712
712
|
return __asyncGenerator(this, arguments, function search_1() {
|
|
713
|
-
var _i, _a, provider, results, _b, results_1, results_1_1, r, e_1_1;
|
|
713
|
+
var allProvidersFailed, errors, _i, _a, provider, results, _b, results_1, results_1_1, r, e_1_1, er_1;
|
|
714
714
|
var _c, e_1, _d, _e;
|
|
715
715
|
return __generator(this, function (_f) {
|
|
716
716
|
switch (_f.label) {
|
|
717
717
|
case 0:
|
|
718
|
+
this.abort();
|
|
719
|
+
allProvidersFailed = true;
|
|
720
|
+
errors = [];
|
|
718
721
|
_i = 0, _a = this.providers;
|
|
719
722
|
_f.label = 1;
|
|
720
723
|
case 1:
|
|
@@ -735,6 +738,7 @@ var Geocoder = (function (exports) {
|
|
|
735
738
|
_e = results_1_1.value;
|
|
736
739
|
_b = false;
|
|
737
740
|
r = _e;
|
|
741
|
+
allProvidersFailed = false;
|
|
738
742
|
return [4 /*yield*/, __await(__assign(__assign({}, r), { provider: provider, _id: ID$1++ }))];
|
|
739
743
|
case 6: return [4 /*yield*/, _f.sent()];
|
|
740
744
|
case 7:
|
|
@@ -762,12 +766,18 @@ var Geocoder = (function (exports) {
|
|
|
762
766
|
case 15: return [7 /*endfinally*/];
|
|
763
767
|
case 16: return [3 /*break*/, 18];
|
|
764
768
|
case 17:
|
|
765
|
-
_f.sent();
|
|
769
|
+
er_1 = _f.sent();
|
|
770
|
+
errors.push(er_1);
|
|
766
771
|
return [3 /*break*/, 18];
|
|
767
772
|
case 18:
|
|
768
773
|
_i++;
|
|
769
774
|
return [3 /*break*/, 1];
|
|
770
|
-
case 19:
|
|
775
|
+
case 19:
|
|
776
|
+
if (allProvidersFailed) {
|
|
777
|
+
// If all providers failed, throw an error
|
|
778
|
+
throw new Error("All providers failed: ".concat(errors.map(function (e) { return e.message; }).join('; ')));
|
|
779
|
+
}
|
|
780
|
+
return [2 /*return*/];
|
|
771
781
|
}
|
|
772
782
|
});
|
|
773
783
|
});
|
|
@@ -778,6 +788,140 @@ var Geocoder = (function (exports) {
|
|
|
778
788
|
}
|
|
779
789
|
return CancelablePromise.resolve(undefined);
|
|
780
790
|
};
|
|
791
|
+
Geocoder.prototype.reverse = function (coordinates) {
|
|
792
|
+
return __asyncGenerator(this, arguments, function reverse_1() {
|
|
793
|
+
var _i, _a, provider, results, _b, results_2, results_2_1, r, e_2_1;
|
|
794
|
+
var _c, e_2, _d, _e;
|
|
795
|
+
return __generator(this, function (_f) {
|
|
796
|
+
switch (_f.label) {
|
|
797
|
+
case 0:
|
|
798
|
+
_i = 0, _a = this.providers;
|
|
799
|
+
_f.label = 1;
|
|
800
|
+
case 1:
|
|
801
|
+
if (!(_i < _a.length)) return [3 /*break*/, 19];
|
|
802
|
+
provider = _a[_i];
|
|
803
|
+
if (!provider.reverse) {
|
|
804
|
+
return [3 /*break*/, 18];
|
|
805
|
+
}
|
|
806
|
+
_f.label = 2;
|
|
807
|
+
case 2:
|
|
808
|
+
_f.trys.push([2, 17, , 18]);
|
|
809
|
+
results = provider.reverse(coordinates);
|
|
810
|
+
_f.label = 3;
|
|
811
|
+
case 3:
|
|
812
|
+
_f.trys.push([3, 10, 11, 16]);
|
|
813
|
+
_b = true, results_2 = (e_2 = void 0, __asyncValues(results));
|
|
814
|
+
_f.label = 4;
|
|
815
|
+
case 4: return [4 /*yield*/, __await(results_2.next())];
|
|
816
|
+
case 5:
|
|
817
|
+
if (!(results_2_1 = _f.sent(), _c = results_2_1.done, !_c)) return [3 /*break*/, 9];
|
|
818
|
+
_e = results_2_1.value;
|
|
819
|
+
_b = false;
|
|
820
|
+
r = _e;
|
|
821
|
+
return [4 /*yield*/, __await(__assign(__assign({}, r), { provider: provider, _id: ID$1++ }))];
|
|
822
|
+
case 6: return [4 /*yield*/, _f.sent()];
|
|
823
|
+
case 7:
|
|
824
|
+
_f.sent();
|
|
825
|
+
_f.label = 8;
|
|
826
|
+
case 8:
|
|
827
|
+
_b = true;
|
|
828
|
+
return [3 /*break*/, 4];
|
|
829
|
+
case 9: return [3 /*break*/, 16];
|
|
830
|
+
case 10:
|
|
831
|
+
e_2_1 = _f.sent();
|
|
832
|
+
e_2 = { error: e_2_1 };
|
|
833
|
+
return [3 /*break*/, 16];
|
|
834
|
+
case 11:
|
|
835
|
+
_f.trys.push([11, , 14, 15]);
|
|
836
|
+
if (!(!_b && !_c && (_d = results_2.return))) return [3 /*break*/, 13];
|
|
837
|
+
return [4 /*yield*/, __await(_d.call(results_2))];
|
|
838
|
+
case 12:
|
|
839
|
+
_f.sent();
|
|
840
|
+
_f.label = 13;
|
|
841
|
+
case 13: return [3 /*break*/, 15];
|
|
842
|
+
case 14:
|
|
843
|
+
if (e_2) throw e_2.error;
|
|
844
|
+
return [7 /*endfinally*/];
|
|
845
|
+
case 15: return [7 /*endfinally*/];
|
|
846
|
+
case 16: return [3 /*break*/, 18];
|
|
847
|
+
case 17:
|
|
848
|
+
_f.sent();
|
|
849
|
+
return [3 /*break*/, 18];
|
|
850
|
+
case 18:
|
|
851
|
+
_i++;
|
|
852
|
+
return [3 /*break*/, 1];
|
|
853
|
+
case 19: return [2 /*return*/];
|
|
854
|
+
}
|
|
855
|
+
});
|
|
856
|
+
});
|
|
857
|
+
};
|
|
858
|
+
/**
|
|
859
|
+
* Returns the first reverse geocoding result for given coordinates from any provider.
|
|
860
|
+
*
|
|
861
|
+
* @param coordinates - The longitude and latitude values.
|
|
862
|
+
* @returns A promise that resolves to the first reverse geocoding result, or undefined if no results are found.
|
|
863
|
+
*/
|
|
864
|
+
Geocoder.prototype.reverseGeocodeFirstResult = function (coordinates) {
|
|
865
|
+
var _a, e_3, _b, _c;
|
|
866
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
867
|
+
var _i, _d, provider, _e, _f, _g, result, e_3_1, error_1;
|
|
868
|
+
return __generator(this, function (_h) {
|
|
869
|
+
switch (_h.label) {
|
|
870
|
+
case 0:
|
|
871
|
+
_i = 0, _d = this.providers;
|
|
872
|
+
_h.label = 1;
|
|
873
|
+
case 1:
|
|
874
|
+
if (!(_i < _d.length)) return [3 /*break*/, 17];
|
|
875
|
+
provider = _d[_i];
|
|
876
|
+
if (!(typeof provider.reverse === 'function')) return [3 /*break*/, 16];
|
|
877
|
+
_h.label = 2;
|
|
878
|
+
case 2:
|
|
879
|
+
_h.trys.push([2, 15, , 16]);
|
|
880
|
+
_h.label = 3;
|
|
881
|
+
case 3:
|
|
882
|
+
_h.trys.push([3, 8, 9, 14]);
|
|
883
|
+
_e = true, _f = (e_3 = void 0, __asyncValues(provider.reverse(coordinates)));
|
|
884
|
+
_h.label = 4;
|
|
885
|
+
case 4: return [4 /*yield*/, _f.next()];
|
|
886
|
+
case 5:
|
|
887
|
+
if (!(_g = _h.sent(), _a = _g.done, !_a)) return [3 /*break*/, 7];
|
|
888
|
+
_c = _g.value;
|
|
889
|
+
_e = false;
|
|
890
|
+
result = _c;
|
|
891
|
+
return [2 /*return*/, result];
|
|
892
|
+
case 6:
|
|
893
|
+
_e = true;
|
|
894
|
+
return [3 /*break*/, 4];
|
|
895
|
+
case 7: return [3 /*break*/, 14];
|
|
896
|
+
case 8:
|
|
897
|
+
e_3_1 = _h.sent();
|
|
898
|
+
e_3 = { error: e_3_1 };
|
|
899
|
+
return [3 /*break*/, 14];
|
|
900
|
+
case 9:
|
|
901
|
+
_h.trys.push([9, , 12, 13]);
|
|
902
|
+
if (!(!_e && !_a && (_b = _f.return))) return [3 /*break*/, 11];
|
|
903
|
+
return [4 /*yield*/, _b.call(_f)];
|
|
904
|
+
case 10:
|
|
905
|
+
_h.sent();
|
|
906
|
+
_h.label = 11;
|
|
907
|
+
case 11: return [3 /*break*/, 13];
|
|
908
|
+
case 12:
|
|
909
|
+
if (e_3) throw e_3.error;
|
|
910
|
+
return [7 /*endfinally*/];
|
|
911
|
+
case 13: return [7 /*endfinally*/];
|
|
912
|
+
case 14: return [3 /*break*/, 16];
|
|
913
|
+
case 15:
|
|
914
|
+
error_1 = _h.sent();
|
|
915
|
+
console.error('Error in reverse geocoding:', error_1);
|
|
916
|
+
return [3 /*break*/, 16];
|
|
917
|
+
case 16:
|
|
918
|
+
_i++;
|
|
919
|
+
return [3 /*break*/, 1];
|
|
920
|
+
case 17: return [2 /*return*/, undefined];
|
|
921
|
+
}
|
|
922
|
+
});
|
|
923
|
+
});
|
|
924
|
+
};
|
|
781
925
|
return Geocoder;
|
|
782
926
|
}(BaseGeocoder));
|
|
783
927
|
|
|
@@ -2918,6 +3062,13 @@ var Geocoder = (function (exports) {
|
|
|
2918
3062
|
});
|
|
2919
3063
|
return req;
|
|
2920
3064
|
};
|
|
3065
|
+
NgwProvider.prototype.reverse = function (coordinates) {
|
|
3066
|
+
return __asyncGenerator(this, arguments, function reverse_1() {
|
|
3067
|
+
return __generator(this, function (_a) {
|
|
3068
|
+
throw new Error('Not implemented');
|
|
3069
|
+
});
|
|
3070
|
+
});
|
|
3071
|
+
};
|
|
2921
3072
|
NgwProvider.prototype._makeSignal = function () {
|
|
2922
3073
|
var abortController = new AbortController();
|
|
2923
3074
|
this._abortControllers.push(abortController);
|
|
@@ -3055,6 +3206,61 @@ var Geocoder = (function (exports) {
|
|
|
3055
3206
|
geom: model.geom,
|
|
3056
3207
|
});
|
|
3057
3208
|
};
|
|
3209
|
+
NominatimProvider.prototype.reverse = function (coordinates) {
|
|
3210
|
+
return __asyncGenerator(this, arguments, function reverse_1() {
|
|
3211
|
+
var lng, lat, url, request, item;
|
|
3212
|
+
var _this = this;
|
|
3213
|
+
return __generator(this, function (_a) {
|
|
3214
|
+
switch (_a.label) {
|
|
3215
|
+
case 0:
|
|
3216
|
+
lng = coordinates[0], lat = coordinates[1];
|
|
3217
|
+
url = fixUrlStr("".concat(this.searchUrl, "/reverse?format=geojson&lat=").concat(lat, "&lon=").concat(lng));
|
|
3218
|
+
request = new CancelablePromise(function (resolve, reject, onCancel) {
|
|
3219
|
+
var xhr = new XMLHttpRequest();
|
|
3220
|
+
xhr.open('GET', url, true);
|
|
3221
|
+
xhr.onload = function () {
|
|
3222
|
+
try {
|
|
3223
|
+
var geojson = JSON.parse(xhr.responseText);
|
|
3224
|
+
var feature = geojson.features[0];
|
|
3225
|
+
var result = {
|
|
3226
|
+
geom: feature,
|
|
3227
|
+
extent: feature.bbox,
|
|
3228
|
+
text: feature.properties && feature.properties.display_name,
|
|
3229
|
+
query: "".concat(lat, ", ").concat(lng),
|
|
3230
|
+
};
|
|
3231
|
+
resolve(result);
|
|
3232
|
+
}
|
|
3233
|
+
catch (er) {
|
|
3234
|
+
reject(er);
|
|
3235
|
+
}
|
|
3236
|
+
};
|
|
3237
|
+
xhr.onerror = function (er) {
|
|
3238
|
+
reject(er);
|
|
3239
|
+
};
|
|
3240
|
+
onCancel(function () {
|
|
3241
|
+
xhr.abort();
|
|
3242
|
+
});
|
|
3243
|
+
xhr.send();
|
|
3244
|
+
}).catch(function (er) {
|
|
3245
|
+
if (er.name === 'CancelError') ;
|
|
3246
|
+
throw er;
|
|
3247
|
+
});
|
|
3248
|
+
this._requests.push(request);
|
|
3249
|
+
return [4 /*yield*/, __await(request)];
|
|
3250
|
+
case 1:
|
|
3251
|
+
item = _a.sent();
|
|
3252
|
+
if (!item) return [3 /*break*/, 4];
|
|
3253
|
+
item.result = function () { return _this.result(item); };
|
|
3254
|
+
return [4 /*yield*/, __await(item)];
|
|
3255
|
+
case 2: return [4 /*yield*/, _a.sent()];
|
|
3256
|
+
case 3:
|
|
3257
|
+
_a.sent();
|
|
3258
|
+
_a.label = 4;
|
|
3259
|
+
case 4: return [2 /*return*/];
|
|
3260
|
+
}
|
|
3261
|
+
});
|
|
3262
|
+
});
|
|
3263
|
+
};
|
|
3058
3264
|
return NominatimProvider;
|
|
3059
3265
|
}(BaseProvider));
|
|
3060
3266
|
|