@panoramax/web-viewer 5.0.0-develop-d26305dd → 5.0.0-develop-be5ba1a7

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.
Files changed (153) hide show
  1. package/build/cjs/index.js +1 -1
  2. package/build/cjs/index_photoviewer.js +1 -1
  3. package/build/esm/components/core/Basic.js +1 -1
  4. package/build/esm/translations/el.json +92 -1
  5. package/package.json +1 -1
  6. package/build/bundle.cjs +0 -3399
  7. package/build/bundle.cjs.map +0 -1
  8. package/build/bundle_photoviewer.cjs +0 -2510
  9. package/build/bundle_photoviewer.cjs.map +0 -1
  10. package/build/components/core/Basic.css +0 -56
  11. package/build/components/core/Basic.js +0 -378
  12. package/build/components/core/CoverageMap.css +0 -10
  13. package/build/components/core/CoverageMap.js +0 -169
  14. package/build/components/core/Editor.css +0 -33
  15. package/build/components/core/Editor.js +0 -398
  16. package/build/components/core/PhotoViewer.css +0 -70
  17. package/build/components/core/PhotoViewer.js +0 -650
  18. package/build/components/core/Viewer.css +0 -130
  19. package/build/components/core/Viewer.js +0 -711
  20. package/build/components/core/index.js +0 -10
  21. package/build/components/index.js +0 -11
  22. package/build/components/index_photoviewer.js +0 -6
  23. package/build/components/layout/BottomDrawer.js +0 -258
  24. package/build/components/layout/CorneredGrid.js +0 -143
  25. package/build/components/layout/Mini.js +0 -121
  26. package/build/components/layout/Tabs.js +0 -140
  27. package/build/components/layout/index.js +0 -9
  28. package/build/components/menus/LocationPrecisionDoc.js +0 -42
  29. package/build/components/menus/MapBackground.js +0 -110
  30. package/build/components/menus/MapFilters.js +0 -567
  31. package/build/components/menus/MapLayers.js +0 -238
  32. package/build/components/menus/MapLegend.js +0 -68
  33. package/build/components/menus/MiniPictureLegend.js +0 -73
  34. package/build/components/menus/PictureLegend.js +0 -379
  35. package/build/components/menus/PictureMetadata.js +0 -380
  36. package/build/components/menus/PlayerOptions.js +0 -93
  37. package/build/components/menus/QualityScoreDoc.js +0 -42
  38. package/build/components/menus/ReportForm.js +0 -132
  39. package/build/components/menus/SemanticsDoc.js +0 -38
  40. package/build/components/menus/SemanticsDownload.js +0 -33
  41. package/build/components/menus/SemanticsFilters.js +0 -153
  42. package/build/components/menus/SemanticsList.js +0 -413
  43. package/build/components/menus/SemanticsMetadata.js +0 -368
  44. package/build/components/menus/Share.js +0 -105
  45. package/build/components/menus/index.js +0 -22
  46. package/build/components/menus/index_photoviewer.js +0 -11
  47. package/build/components/styles.js +0 -557
  48. package/build/components/ui/AnnotationsSwitch.js +0 -159
  49. package/build/components/ui/Button.js +0 -77
  50. package/build/components/ui/ButtonGroup.css +0 -59
  51. package/build/components/ui/ButtonGroup.js +0 -69
  52. package/build/components/ui/CopyButton.js +0 -110
  53. package/build/components/ui/Grade.js +0 -54
  54. package/build/components/ui/GradeFilter.js +0 -122
  55. package/build/components/ui/IconSwitch.js +0 -193
  56. package/build/components/ui/LinkButton.js +0 -67
  57. package/build/components/ui/ListGroup.js +0 -66
  58. package/build/components/ui/ListItem.js +0 -90
  59. package/build/components/ui/Loader.js +0 -203
  60. package/build/components/ui/Map.css +0 -63
  61. package/build/components/ui/Map.js +0 -853
  62. package/build/components/ui/MapMore.js +0 -175
  63. package/build/components/ui/Photo.css +0 -50
  64. package/build/components/ui/Photo.js +0 -1502
  65. package/build/components/ui/Popup.js +0 -145
  66. package/build/components/ui/ProgressBar.js +0 -104
  67. package/build/components/ui/QualityScore.js +0 -147
  68. package/build/components/ui/SearchBar.js +0 -374
  69. package/build/components/ui/SemanticsEditor.js +0 -191
  70. package/build/components/ui/SemanticsTable.js +0 -88
  71. package/build/components/ui/Switch.js +0 -139
  72. package/build/components/ui/TogglableGroup.js +0 -157
  73. package/build/components/ui/index.js +0 -29
  74. package/build/components/ui/index_photoviewer.js +0 -21
  75. package/build/components/ui/widgets/CopyCoordinates.js +0 -75
  76. package/build/components/ui/widgets/GeoSearch.css +0 -21
  77. package/build/components/ui/widgets/GeoSearch.js +0 -150
  78. package/build/components/ui/widgets/Legend.js +0 -190
  79. package/build/components/ui/widgets/LevelSelect.css +0 -51
  80. package/build/components/ui/widgets/LevelSelect.js +0 -143
  81. package/build/components/ui/widgets/MapFiltersButton.js +0 -114
  82. package/build/components/ui/widgets/MapLayersButton.js +0 -79
  83. package/build/components/ui/widgets/OSMEditors.js +0 -155
  84. package/build/components/ui/widgets/PictureLegendActions.js +0 -99
  85. package/build/components/ui/widgets/Player.css +0 -7
  86. package/build/components/ui/widgets/Player.js +0 -154
  87. package/build/components/ui/widgets/SemanticsFiltersButton.js +0 -65
  88. package/build/components/ui/widgets/Zoom.js +0 -84
  89. package/build/components/ui/widgets/index.js +0 -16
  90. package/build/components/ui/widgets/index_photoviewer.js +0 -7
  91. package/build/img/arrow_360.svg +0 -14
  92. package/build/img/arrow_flat.svg +0 -11
  93. package/build/img/arrow_triangle.svg +0 -9
  94. package/build/img/arrow_turn.svg +0 -8
  95. package/build/img/bg_aerial.jpg +0 -0
  96. package/build/img/bg_streets.jpg +0 -0
  97. package/build/img/loader_base.jpg +0 -0
  98. package/build/img/logo_dead.svg +0 -91
  99. package/build/img/marker.svg +0 -17
  100. package/build/img/marker_blue.svg +0 -20
  101. package/build/img/osm.svg +0 -49
  102. package/build/img/panoramax.svg +0 -13
  103. package/build/img/switch_big.svg +0 -54
  104. package/build/img/switch_mini.svg +0 -48
  105. package/build/img/wd.svg +0 -1
  106. package/build/index_photoviewer.js +0 -4
  107. package/build/package.json +0 -148
  108. package/build/servers.js +0 -14
  109. package/build/translations/ar.json +0 -1
  110. package/build/translations/be.json +0 -257
  111. package/build/translations/br.json +0 -81
  112. package/build/translations/cy.json +0 -117
  113. package/build/translations/da.json +0 -300
  114. package/build/translations/de.json +0 -309
  115. package/build/translations/en.json +0 -294
  116. package/build/translations/eo.json +0 -235
  117. package/build/translations/es.json +0 -292
  118. package/build/translations/fi.json +0 -1
  119. package/build/translations/fr.json +0 -294
  120. package/build/translations/hr.json +0 -294
  121. package/build/translations/hu.json +0 -294
  122. package/build/translations/it.json +0 -306
  123. package/build/translations/ja.json +0 -182
  124. package/build/translations/ko.json +0 -1
  125. package/build/translations/nl.json +0 -305
  126. package/build/translations/nn.json +0 -1
  127. package/build/translations/pl.json +0 -169
  128. package/build/translations/pt.json +0 -296
  129. package/build/translations/pt_BR.json +0 -304
  130. package/build/translations/sv.json +0 -182
  131. package/build/translations/ti.json +0 -9
  132. package/build/translations/tr.json +0 -297
  133. package/build/translations/uk.json +0 -268
  134. package/build/translations/zh_Hant.json +0 -309
  135. package/build/utils/API.js +0 -928
  136. package/build/utils/InitParameters.js +0 -521
  137. package/build/utils/MapStyleComposer.js +0 -889
  138. package/build/utils/PanoraMapProtocol.js +0 -49
  139. package/build/utils/PhotoAdapter.js +0 -49
  140. package/build/utils/PresetsManager.js +0 -148
  141. package/build/utils/SemanticsMapProtocol.js +0 -144
  142. package/build/utils/URLHandler.js +0 -426
  143. package/build/utils/geocoder.js +0 -203
  144. package/build/utils/i18n.js +0 -128
  145. package/build/utils/index.js +0 -17
  146. package/build/utils/index_photoviewer.js +0 -14
  147. package/build/utils/indoor.js +0 -200
  148. package/build/utils/map.js +0 -788
  149. package/build/utils/picture.js +0 -507
  150. package/build/utils/semantics.js +0 -321
  151. package/build/utils/services.js +0 -148
  152. package/build/utils/utils.js +0 -433
  153. package/build/utils/widgets.js +0 -110
@@ -1,321 +0,0 @@
1
- import { html } from "lit";
2
- import { OSMURL, OSMWikiURL, PanoramaxPresetsURL, WikidataAPIURL, WikidataURL } from "./services.js";
3
- import { getBestLabel } from "./i18n.js";
4
-
5
- const logoOsm = await fetch(new URL("../img/osm.svg", import.meta.url).href).then(res => res.text());
6
- const logoWd = await fetch(new URL("../img/wd.svg", import.meta.url).href).then(res => res.text());
7
-
8
-
9
- // List of [ Overlay ID, API filter, Maplibre Style, Sprites ]
10
- export const SEMANTICS_OVERLAYS = [
11
- [
12
- "features",
13
- "\"semantics\" IS NOT NULL",
14
- {
15
- metadata: { "name": "All features" },
16
- type: "circle",
17
- layout: {
18
- visibility: "none",
19
- },
20
- paint: {
21
- "circle-radius": 4,
22
- "circle-color": "#00897B"
23
- }
24
- }
25
- ],
26
- [
27
- "tfsigns",
28
- "\"semantics.osm|traffic_sign\" IS NOT NULL",
29
- {
30
- metadata: { "name": "Traffic signs" },
31
- type: "symbol",
32
- layout: {
33
- visibility: "none",
34
- "icon-overlap": "never",
35
- "icon-image": ["case",
36
- // Many signs
37
- ["in", ";", ["get", "osm|traffic_sign"]],
38
- "pnx-tfsigns-fr:0_many",
39
- // Single FR sign
40
- ["==", ["slice", ["get", "osm|traffic_sign"], 0, 2], "FR"],
41
- ["concat", "pnx-tfsigns-fr:", ["slice", ["get", "osm|traffic_sign"], 3]],
42
- // Generic value
43
- ["==", ["get", "osm|traffic_sign"], "yes"],
44
- "pnx-tfsigns-fr:0_unknown",
45
- // Fallbacks
46
- ["has", "osm|traffic_sign"],
47
- "pnx-tfsigns-fr:0_unknown",
48
- ""
49
- ]
50
- }
51
- },
52
- { "pnx-tfsigns-fr": `${PanoramaxPresetsURL()}/sprites/trafficsigns_fr` }
53
- ]
54
- ];
55
-
56
- // General helpers
57
- function valToValLink(val, url, title) {
58
- return html`<a href=${url} target="_blank" title=${title}>${val}</a>`;
59
- }
60
-
61
- // OSM helpers
62
- const OSM_MAIN_KEYS = [
63
- "highway", "building", "amenity", "landuse", "natural", "waterway", "leisure",
64
- "shop", "railway", "tourism", "barrier", "boundary", "place", "power"
65
- ];
66
-
67
- // Wikidata helpers
68
- const WD_LABELS_CACHE = {};
69
- function getWDLabel(entity, _t) {
70
- if(WD_LABELS_CACHE[entity]) {
71
- return Promise.resolve(WD_LABELS_CACHE[entity]);
72
- }
73
- else {
74
- const url = entity.startsWith("P") ? `properties/${entity}` : `items/${entity}/labels`;
75
- return fetch(`${WikidataAPIURL()}/entities/${url}`)
76
- .then(res => res.json())
77
- .then(res => {
78
- WD_LABELS_CACHE[entity] = getBestLabel(res.labels || res, _t.PREF_LANG);
79
- return WD_LABELS_CACHE[entity];
80
- });
81
- }
82
- }
83
-
84
- // Supported prefixes for nice semantic display
85
- const KNOWN_PREFIXES = {
86
- "": {
87
- title: "Panoramax",
88
- value_transform: (tag, _t) => {
89
- if(tag.key === "osm") {
90
- return valToValLink(
91
- tag.value,
92
- `${OSMURL()}/${tag.value}`,
93
- _t.pnx.semantics_value_show_osm
94
- );
95
- }
96
- else { return tag.value; }
97
- }
98
- },
99
-
100
- osm: {
101
- title: "OpenStreetMap",
102
- logo: logoOsm,
103
- key_transform: (tag, _t) => valToValLink(
104
- tag.key,
105
- `${OSMWikiURL()}/Key:${tag.key}`,
106
- _t.pnx.semantics_key_doc
107
- ),
108
- value_transform: (tag, _t) => {
109
- if(OSM_MAIN_KEYS.includes(tag.key)) {
110
- return valToValLink(
111
- tag.value,
112
- `${OSMWikiURL()}/Tag:${tag.key}=${tag.value}`,
113
- _t.pnx.semantics_value_doc
114
- );
115
- }
116
- else { return tag.value; }
117
- }
118
- },
119
-
120
- wd: {
121
- title: "Wikidata",
122
- logo: logoWd,
123
- key_transform: (tag, _t) => {
124
- const url = `${WikidataURL()}/Property:${tag.key}`;
125
- const keylabel = _t.pnx.semantics_wikidata_properties[tag.key];
126
-
127
- if(keylabel) {
128
- return valToValLink(
129
- html`${_t.pnx.semantics_wikidata_properties[tag.key]} <small>(${tag.key})</small>`,
130
- url,
131
- _t.pnx.semantics_key_doc
132
- );
133
- }
134
- else {
135
- const label = document.createElement("span");
136
- label.innerText = tag.key;
137
-
138
- // Try to fetch label from API
139
- getWDLabel(tag.key, _t).then(wdl => {
140
- label.innerHTML = `${wdl} <small>(${tag.key})</small>`;
141
- });
142
-
143
- return valToValLink(label, url, _t.pnx.semantics_key_doc);
144
- }
145
- },
146
- value_transform: (tag, _t) => {
147
- const label = document.createElement("span");
148
- label.innerText = tag.value;
149
-
150
- // Try to fetch label from API
151
- getWDLabel(tag.value, _t).then(wdl => {
152
- label.innerHTML = `${wdl} <small>(${tag.value})</small>`;
153
- });
154
-
155
- return valToValLink(
156
- label,
157
- `${WikidataURL()}/${tag.value}`,
158
- _t.pnx.semantics_value_doc
159
- );
160
- }
161
- },
162
-
163
- exif: { title: "EXIF" },
164
- };
165
-
166
-
167
- /**
168
- * Transform a prefix|key=value into parsed object.
169
- * Does not handle qualifiers tags.
170
- * @private
171
- */
172
- export function decodeBasicTag(tag) {
173
- const firstEqual = (tag || "").lastIndexOf("=");
174
- if(firstEqual < 0) { return null; }
175
-
176
-
177
- const key = decodeKey(tag.substring(0, firstEqual));
178
- if(key.subkey.indexOf("=") >= 0) { return null; }
179
-
180
- return { key, value: tag.substring(firstEqual+1) };
181
- }
182
-
183
-
184
- /** @private */
185
- export function decodeKey(key = "") {
186
- const regex = /^(?:([a-z_]+)\|)?([^[]+)(?:\[(.*)\])?$/;
187
- const match = key.match(regex);
188
-
189
- if (!match) {
190
- return { prefix: "", subkey: key, qualifies: null };
191
- }
192
-
193
- const [, prefix, subkey, qualifies ] = match;
194
- return {
195
- key: key,
196
- prefix: prefix || "",
197
- subkey,
198
- qualifies: decodeBasicTag(qualifies),
199
- };
200
- }
201
-
202
-
203
- /**
204
- * Transforms a string containing a list of tags in a ready-to-use parsed object list.
205
- * @param {string} str The string to read (each tag separated by newline `\n`)
206
- * @returns {object[]} List of API-formatted tags
207
- */
208
- export function parseSemanticsString(str) {
209
- const parsedTags = str.split("\n").map(t => {
210
- const parts = decodeBasicTag(t);
211
- if(
212
- parts
213
- && parts.key.key.length <= 256
214
- && parts.value.length <= 2048
215
- ) {
216
- return { key: parts.key.key, value: parts.value };
217
- } else { return null; }
218
- });
219
-
220
- if(parsedTags.findIndex(v => !v) >= 0) {
221
- if(str.trim().length === 0 && parsedTags.length === 1) { return []; }
222
- throw new Error("Invalid tags");
223
- }
224
-
225
- return parsedTags;
226
- }
227
-
228
-
229
- /**
230
- * Transforms a semantics array into a key=value string.
231
- * @param {object[]} semantics List of API-formatted tags
232
- * @returns {string} The readable string (each tag separated by newline `\n`)
233
- */
234
- export function semanticsToString(semantics) {
235
- return (semantics || []).map(s => `${s.key}=${s.value}`).join("\n");
236
- }
237
-
238
-
239
- /**
240
- * Computes the difference between two set of API tags.
241
- * API expects a delta between old & new, so result contains only
242
- * added and deleted tags.
243
- * @param {object[]} prev The previous set of tags
244
- * @param {object[]} next The new set of tags
245
- * @returns {object[]} The new set of tags, with only added/deleted tags
246
- */
247
- export function computeDiffTags(prev = [], next = []) {
248
- const res = [];
249
-
250
- // Look for new values
251
- (next || [])
252
- // eslint-disable-next-line eqeqeq
253
- .filter(nt => prev.find(pt => pt.key == nt.key && pt.value == nt.value) === undefined)
254
- .forEach(t => res.push({key: t.key, value: t.value, action: "add"}));
255
-
256
- // Look for prev values missing in next
257
- (prev || [])
258
- // eslint-disable-next-line eqeqeq
259
- .filter(pt => next.find(nt => pt.key == nt.key && pt.value == nt.value) === undefined)
260
- .forEach(t => res.push({key: t.key, value: t.value, action: "delete"}));
261
-
262
- return res;
263
- }
264
-
265
-
266
- /**
267
- * Transforms raw API semantics properties into ready-to-display container.
268
- * @param {object[]} tags The API semantics tags
269
- * @returns {object[]} A list of groups (by prefix), with {title, tags} information.
270
- */
271
- export function groupByPrefix(tags) {
272
- // Create raw groups by prefix
273
- const byPrefix = {};
274
- const qualifiers = [];
275
-
276
- // First pass: analyze tags, separate by prefix
277
- tags.forEach(tag => {
278
- if(tag.action === "delete") { return; }
279
-
280
- const decodedKey = decodeKey(tag.key);
281
-
282
- // Put apart qualifiers, to later insert on tags themselves
283
- if(decodedKey.qualifies) {
284
- qualifiers.push(Object.assign({}, tag, decodedKey));
285
- }
286
- // Process classic tag
287
- else {
288
- if (!byPrefix[decodedKey.prefix]) { byPrefix[decodedKey.prefix] = []; }
289
-
290
- byPrefix[decodedKey.prefix].push(decodedKey.prefix.length > 0 ? {
291
- key: decodedKey.subkey,
292
- value: tag.value
293
- } : tag);
294
- }
295
- });
296
-
297
- // Second pass: add qualifiers on concerned tags
298
- qualifiers.forEach(({key, prefix, subkey, qualifies, value}) => {
299
- const concernedTag = byPrefix[qualifies.key.prefix]?.find(t => (
300
- t.key === qualifies.key.subkey
301
- && (!qualifies.value || qualifies.value === t.value)
302
- ));
303
-
304
- if(concernedTag) {
305
- if(!concernedTag.qualifiers) { concernedTag.qualifiers = []; }
306
- concernedTag.qualifiers.push({key, prefix, subkey, value});
307
- }
308
- });
309
-
310
- // Append known prefixes information
311
- let groups = Object.entries(byPrefix).map(([prefix, prefixTags]) => {
312
- if(KNOWN_PREFIXES[prefix]) {
313
- return Object.assign({ prefix, tags: prefixTags }, KNOWN_PREFIXES[prefix]);
314
- }
315
- else {
316
- return { prefix, title: prefix, tags: prefixTags };
317
- }
318
- });
319
-
320
- return groups;
321
- }
@@ -1,148 +0,0 @@
1
- /*
2
- * Settings that may be useful to change for special cases (e.g. offline implementation).
3
- * Most users will be fine with the defaults.
4
- */
5
-
6
-
7
- /**
8
- * Default map background tiles
9
- * @returns {string} The website URL
10
- */
11
- export function MapTiles() {
12
- return "https://panoramax.openstreetmap.fr/pmtiles/basic.json";
13
- }
14
-
15
- /**
16
- * Panoramax website URL
17
- * @returns {string} The website URL
18
- */
19
- export function PanoramaxWebsiteURL() {
20
- return "https://panoramax.fr";
21
- }
22
-
23
- /**
24
- * Panoramax Presets URL
25
- * @returns {string} The presets URL
26
- */
27
- export function PanoramaxPresetsURL() {
28
- return "https://presets.panoramax.fr";
29
- }
30
-
31
- /**
32
- * Panoramax meta-catalog URL
33
- * @returns {string} The metacatalog URL
34
- */
35
- export function PanoramaxMetaCatalogURL() {
36
- return "https://explore.panoramax.fr";
37
- }
38
-
39
- /**
40
- * Temaki icons URL
41
- * @param {string} [iconName] The icon name to insert in URL
42
- * @returns {string} The SVG icon URL
43
- */
44
- export function TemakiIconURL(iconName) {
45
- return `https://raw.githubusercontent.com/rapideditor/temaki/refs/heads/main/icons/${iconName}.svg`;
46
- }
47
-
48
-
49
- /* -----------------------------------------------------
50
- * Wikidata docs & tools
51
- */
52
-
53
- /**
54
- * Wikidata URL
55
- * @returns {string} The Wikidata URL
56
- */
57
- export function WikidataURL() {
58
- return "https://www.wikidata.org/wiki";
59
- }
60
-
61
- /**
62
- * Wikidata API URL
63
- * @returns {string} The Wikidata URL
64
- */
65
- export function WikidataAPIURL() {
66
- return "https://www.wikidata.org/w/rest.php/wikibase/v1";
67
- }
68
-
69
-
70
- /* -----------------------------------------------------
71
- * OpenStreetMap docs & tools
72
- */
73
-
74
- /**
75
- * OpenStreetMap iD editor URL
76
- * @returns {string} The editor URL
77
- */
78
- export function IdEditorURL() {
79
- return "https://www.openstreetmap.org/edit?editor=id";
80
- }
81
-
82
- /**
83
- * OpenStreetMap wiki URL
84
- * @returns {string} The wiki URL
85
- */
86
- export function OSMWikiURL() {
87
- return "https://wiki.openstreetmap.org/wiki";
88
- }
89
-
90
- /**
91
- * OpenStreetMap website URL
92
- * @returns {string} The OSM website URL
93
- */
94
- export function OSMURL() {
95
- return "https://openstreetmap.org";
96
- }
97
-
98
- /**
99
- * Indoor= sprites URL
100
- * @returns {string} The indoor= sprites URL
101
- */
102
- export function IndoorEqualSpritesURL() {
103
- return "https://files.pavie.info/depot/remote/indoorequal/indoorequal";
104
- }
105
-
106
-
107
- /* -----------------------------------------------------
108
- * Internet speed tests
109
- */
110
-
111
- /**
112
- * Get the threshold fast internet speed value.
113
- *
114
- * @returns {number} the minimum speed in MBps for internet to be considered "fast"
115
- */
116
- export function InternetFastThreshold() {
117
- return 10;
118
- }
119
-
120
- /**
121
- * Get the fast internet speed test file.
122
- *
123
- * @returns {string} URL for the file to use for internet speed testing.
124
- */
125
- export function InternetFastTestFile() {
126
- return "https://panoramax.openstreetmap.fr/images/05/ca/2c/98/0111-4baf-b6f3-587bb8847d2e.jpg";
127
- }
128
-
129
-
130
- /* -----------------------------------------------------
131
- * Geocoding-related settings
132
- */
133
-
134
- /**
135
- * Get the Base Adresse Nationale URL for geocoding API.
136
- * @returns {string} The Base Adresse Nationale URL (must support /search calls).
137
- */
138
- export function AdresseDataGouvBaseURL() {
139
- return "https://data.geopf.fr/geocodage/search";
140
- }
141
-
142
- /**
143
- * Get the Nominatim base URL for geocoding API.
144
- * @returns {string} The Nominatim URL (must support /search & /reverse calls).
145
- */
146
- export function NominatimBaseUrl() {
147
- return "https://nominatim.openstreetmap.org";
148
- }