@fieldia/map 0.19.0 → 0.19.1
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/README.md +90 -3
- package/package.json +4 -4
- package/src/lib/address-labels.d.mts +14 -2
- package/src/lib/address-labels.d.ts +14 -2
- package/src/lib/address-labels.js.map +1 -1
- package/src/lib/address-labels.mjs.map +1 -1
- package/src/lib/address-line.d.mts +10 -1
- package/src/lib/address-line.d.ts +10 -1
- package/src/lib/address-line.js +25 -8
- package/src/lib/address-line.js.map +1 -1
- package/src/lib/address-line.mjs +24 -8
- package/src/lib/address-line.mjs.map +1 -1
- package/src/lib/address-names.d.mts +38 -0
- package/src/lib/address-names.d.ts +38 -0
- package/src/lib/address-names.js +240 -0
- package/src/lib/address-names.js.map +1 -0
- package/src/lib/address-names.mjs +232 -0
- package/src/lib/address-names.mjs.map +1 -0
- package/src/lib/address-parts.d.mts +128 -10
- package/src/lib/address-parts.d.ts +128 -10
- package/src/lib/address-parts.js +836 -17
- package/src/lib/address-parts.js.map +1 -1
- package/src/lib/address-parts.mjs +827 -14
- package/src/lib/address-parts.mjs.map +1 -1
- package/src/lib/address-search.d.mts +8 -4
- package/src/lib/address-search.d.ts +8 -4
- package/src/lib/address-search.js +27 -9
- package/src/lib/address-search.js.map +1 -1
- package/src/lib/address-search.mjs +28 -10
- package/src/lib/address-search.mjs.map +1 -1
- package/src/lib/address-suggest.d.mts +5 -2
- package/src/lib/address-suggest.d.ts +5 -2
- package/src/lib/address-suggest.js +161 -28
- package/src/lib/address-suggest.js.map +1 -1
- package/src/lib/address-suggest.mjs +161 -28
- package/src/lib/address-suggest.mjs.map +1 -1
- package/src/lib/form-map.js +9 -7
- package/src/lib/form-map.js.map +1 -1
- package/src/lib/form-map.mjs +10 -8
- package/src/lib/form-map.mjs.map +1 -1
- package/src/lib/place.js +21 -10
- package/src/lib/place.js.map +1 -1
- package/src/lib/place.mjs +21 -10
- package/src/lib/place.mjs.map +1 -1
- package/src/lib/providers.d.mts +6 -0
- package/src/lib/providers.d.ts +6 -0
- package/src/lib/providers.js +46 -97
- package/src/lib/providers.js.map +1 -1
- package/src/lib/providers.mjs +46 -97
- package/src/lib/providers.mjs.map +1 -1
- package/src/lib/route-line.d.mts +9 -0
- package/src/lib/route-line.d.ts +9 -0
- package/src/lib/route-line.js +13 -0
- package/src/lib/route-line.js.map +1 -1
- package/src/lib/route-line.mjs +11 -0
- package/src/lib/route-line.mjs.map +1 -1
- package/src/lib/routes.js +6 -2
- package/src/lib/routes.js.map +1 -1
- package/src/lib/routes.mjs +6 -2
- package/src/lib/routes.mjs.map +1 -1
- package/src/lib/search-box.d.mts +15 -3
- package/src/lib/search-box.d.ts +15 -3
- package/src/lib/search-box.js +118 -34
- package/src/lib/search-box.js.map +1 -1
- package/src/lib/search-box.mjs +118 -34
- package/src/lib/search-box.mjs.map +1 -1
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nameIn = exports.nameKey = void 0;
|
|
4
|
+
exports.knownRegion = knownRegion;
|
|
5
|
+
exports.knownCity = knownCity;
|
|
6
|
+
exports.sameKnown = sameKnown;
|
|
7
|
+
/**
|
|
8
|
+
* One place a line: its code (Azure's, where it gives one), its English
|
|
9
|
+
* and Arabic names, then its other names, comma-separated; `fr=`/`de=` give
|
|
10
|
+
* its French or German name.
|
|
11
|
+
*/
|
|
12
|
+
const REGIONS = {
|
|
13
|
+
EG: `
|
|
14
|
+
|Cairo|القاهرة|Al Qahirah, Al Qāhirah, al-Qahirah, Cairo Governorate, محافظة القاهرة, fr=Le Caire, de=Kairo
|
|
15
|
+
|Giza|الجيزة|Al Jizah, Al Jīzah, al-Jeezah, Giza Governorate, محافظة الجيزة, fr=Gizeh, de=Gizeh, Gise
|
|
16
|
+
|Alexandria|الإسكندرية|Al Iskandariyah, Alexandria Governorate, الاسكندرية, الأسكندرية, محافظة الإسكندرية, fr=Alexandrie
|
|
17
|
+
|Qalyubia|القليوبية|Al Qalyubiyah, Qalyubiyah, Kalyubia
|
|
18
|
+
|Beheira|البحيرة|Al Buhayrah, Buhayrah
|
|
19
|
+
|Ismailia|الإسماعيلية|Al Isma'iliyah, Al Ismailiyah, الاسماعيلية
|
|
20
|
+
|Sharqia|الشرقية|Ash Sharqiyah, Ash Sharqīyah, Sharkia, Al Sharqia
|
|
21
|
+
|Dakahlia|الدقهلية|Ad Daqahliyah, Daqahliyah
|
|
22
|
+
|Gharbia|الغربية|Al Gharbiyah
|
|
23
|
+
|Monufia|المنوفية|Al Minufiyah, Menofia
|
|
24
|
+
|Kafr El Sheikh|كفر الشيخ|Kafr ash Shaykh
|
|
25
|
+
|Damietta|دمياط|Dumyat, Dumyāţ, Domiat
|
|
26
|
+
|Port Said|بورسعيد|Bur Sa'id, Būr Sa‘īd, Bour Sa'eed, بور سعيد
|
|
27
|
+
|Suez|السويس|As Suways
|
|
28
|
+
|Faiyum|الفيوم|Al Fayyum, Fayoum
|
|
29
|
+
|Beni Suef|بني سويف|Bani Suwayf
|
|
30
|
+
|Minya|المنيا|Al Minya
|
|
31
|
+
|Asyut|أسيوط|Assiut, اسيوط
|
|
32
|
+
|Sohag|سوهاج|Suhaj
|
|
33
|
+
|Qena|قنا|Qina
|
|
34
|
+
|Luxor|الأقصر|Al Uqsur, الاقصر
|
|
35
|
+
|Aswan|أسوان|اسوان
|
|
36
|
+
|Red Sea|البحر الأحمر|Al Bahr al Ahmar
|
|
37
|
+
|New Valley|الوادي الجديد|Al Wadi al Jadid
|
|
38
|
+
|Matrouh|مطروح|Matruh
|
|
39
|
+
|North Sinai|شمال سيناء|Shamal Sina'
|
|
40
|
+
|South Sinai|جنوب سيناء|Janub Sina'`,
|
|
41
|
+
SA: `
|
|
42
|
+
RIY|Riyadh|الرياض|Ar Riyad, Ar Riyāḑ, Riyadh Region, Riyadh Province, منطقة الرياض, fr=Riyad, de=Riad
|
|
43
|
+
MAK|Makkah|مكة المكرمة|Mecca, Makkah Region, Makkah Province, Makkah Al Mukarramah, مكة, منطقة مكة المكرمة, fr=La Mecque, de=Mekka
|
|
44
|
+
MAD|Madinah|المدينة المنورة|Medina, Al Madinah, Al Madinah Al Munawwarah, المدينة, منطقة المدينة المنورة, fr=Médine, de=Medina
|
|
45
|
+
EAS|Eastern Province|المنطقة الشرقية|Eastern, Eastern Region, Ash Sharqiyah, الشرقية
|
|
46
|
+
QAS|Al Qassim|القصيم|Al Qasim, Qassim, منطقة القصيم
|
|
47
|
+
ASI|Asir|عسير|'Asir, ‘Asir, منطقة عسير
|
|
48
|
+
TAB|Tabuk|تبوك|منطقة تبوك
|
|
49
|
+
HAI|Hail|حائل|Ha'il, Ḩā'il, منطقة حائل
|
|
50
|
+
JAZ|Jazan|جازان|Jizan, Gizan, جيزان, منطقة جازان
|
|
51
|
+
|Najran|نجران|منطقة نجران
|
|
52
|
+
|Al Bahah|الباحة|Al Baha, منطقة الباحة
|
|
53
|
+
JOF|Al Jawf|الجوف|منطقة الجوف
|
|
54
|
+
|Northern Borders|الحدود الشمالية|Northern Frontier, Al Hudud ash Shamaliyah, منطقة الحدود الشمالية`,
|
|
55
|
+
AE: `
|
|
56
|
+
AZ|Abu Dhabi|أبوظبي|Abu Dhabi Emirate, Abu Zabi, أبو ظبي, إمارة أبوظبي, إمارة أبو ظبي, fr=Abou Dabi
|
|
57
|
+
DU|Dubai|دبي|Dubai Emirate, إمارة دبي, fr=Dubaï
|
|
58
|
+
SH|Sharjah|الشارقة|Sharjah Emirate, Ash Shariqah, Ash Shāriqah, إمارة الشارقة, fr=Charjah, de=Schardscha
|
|
59
|
+
AJ|Ajman|عجمان|Ajman Emirate, 'Ajman, إمارة عجمان
|
|
60
|
+
UQ|Umm Al Quwain|أم القيوين|Umm al Qaywayn, Umm Al-Quwain, Umm Al Quwain Emirate, Umm al-Quwain Emirate, ام القيوين
|
|
61
|
+
RK|Ras Al Khaimah|رأس الخيمة|Ra's al Khaymah, Ras al-Khaimah, Ras Al Khaimah Emirate, Ras al-Khaimah Emirate, راس الخيمة
|
|
62
|
+
FU|Fujairah|الفجيرة|Al Fujayrah, Fujairah Emirate`,
|
|
63
|
+
JO: `
|
|
64
|
+
|Amman|عمان|Amman Governorate, Capital Governorate, Al Asimah, عمّان, محافظة العاصمة, العاصمة
|
|
65
|
+
|Irbid|إربد|اربد
|
|
66
|
+
|Zarqa|الزرقاء|Az Zarqa
|
|
67
|
+
|Balqa|البلقاء|Al Balqa
|
|
68
|
+
|Madaba|مادبا
|
|
69
|
+
|Karak|الكرك|Al Karak
|
|
70
|
+
|Tafilah|الطفيلة|At Tafilah
|
|
71
|
+
|Ma'an|معان|Maan
|
|
72
|
+
|Aqaba|العقبة|Al Aqabah
|
|
73
|
+
|Mafraq|المفرق|Al Mafraq
|
|
74
|
+
|Jerash|جرش|Jarash, محافظة جرش
|
|
75
|
+
|Ajloun|عجلون|Ajlun`,
|
|
76
|
+
};
|
|
77
|
+
const CITIES = {
|
|
78
|
+
EG: `
|
|
79
|
+
|Cairo|القاهرة|Al Qahirah, Al Qāhirah, fr=Le Caire, de=Kairo
|
|
80
|
+
|Giza|الجيزة|Al Jizah, Al Jīzah, fr=Gizeh, de=Gizeh
|
|
81
|
+
|Alexandria|الإسكندرية|Al Iskandariyah, الاسكندرية, الأسكندرية, fr=Alexandrie
|
|
82
|
+
|New Cairo|القاهرة الجديدة|New Cairo City, Al Qahirah al Jadidah, مدينة القاهرة الجديدة
|
|
83
|
+
|6th of October|6 أكتوبر|6 October, 6th October, 6th of October City, Sixth of October, أكتوبر 6, السادس من أكتوبر, مدينة 6 أكتوبر, مدينة السادس من أكتوبر
|
|
84
|
+
|Sheikh Zayed|الشيخ زايد|El Sheikh Zaid, El Sheikh Zayed, Sheikh Zayed City, Sheikh Zaid, مدينة الشيخ زايد
|
|
85
|
+
|Helwan|حلوان
|
|
86
|
+
|Shubra El Kheima|شبرا الخيمة|Shubra al Khaymah, Shubrā al Khaymah
|
|
87
|
+
|Port Said|بورسعيد|Bur Sa'id, بور سعيد
|
|
88
|
+
|Suez|السويس|As Suways
|
|
89
|
+
|Ismailia|الإسماعيلية|El Ismailia, Al Isma'iliyah, الاسماعيلية
|
|
90
|
+
|Mansoura|المنصورة|El Mansoura, Al Mansurah
|
|
91
|
+
|Tanta|طنطا
|
|
92
|
+
|Zagazig|الزقازيق|El Zaqaziq, Az Zaqaziq
|
|
93
|
+
|Damietta|دمياط|Dumyat
|
|
94
|
+
|Banha|بنها|Benha
|
|
95
|
+
|Damanhur|دمنهور|Damanhour
|
|
96
|
+
|Shibin El Kom|شبين الكوم|Shibin al Kawm, Shebin El Kom
|
|
97
|
+
|Kafr El Sheikh|كفر الشيخ|Kafr ash Shaykh
|
|
98
|
+
|Faiyum|الفيوم|El Faiyum, Al Fayyum, Fayoum
|
|
99
|
+
|Beni Suef|بني سويف|Bani Suwayf
|
|
100
|
+
|Minya|المنيا|El Minya, El Menia, Al Minya
|
|
101
|
+
|Asyut|أسيوط|Assiut, اسيوط
|
|
102
|
+
|Sohag|سوهاج|Sawhaj, Suhaj
|
|
103
|
+
|Qena|قنا|Qina
|
|
104
|
+
|Luxor|الأقصر|Al Uqsur, الاقصر
|
|
105
|
+
|Aswan|أسوان|اسوان
|
|
106
|
+
|Hurghada|الغردقة|Al Ghardaqah
|
|
107
|
+
|Kharga|الخارجة|El Kharga, Al Kharijah
|
|
108
|
+
|Marsa Matruh|مرسى مطروح|Marsa Matrouh
|
|
109
|
+
|Arish|العريش|El Arish, Al Arish
|
|
110
|
+
|El Tor|الطور|At Tur, مدينة الطور, مدينه الطور
|
|
111
|
+
|Sharm El Sheikh|شرم الشيخ|Sharm ash Shaykh`,
|
|
112
|
+
SA: `
|
|
113
|
+
|Riyadh|الرياض|Ar Riyad, fr=Riyad, de=Riad
|
|
114
|
+
|Jeddah|جدة|Jiddah, Jedda, جده, fr=Djeddah, de=Dschidda
|
|
115
|
+
|Makkah|مكة المكرمة|Mecca, Makkah Al Mukarramah, مكة, fr=La Mecque, de=Mekka
|
|
116
|
+
|Madinah|المدينة المنورة|Medina, Al Madinah, Al Madinah Al Munawwarah, المدينة, fr=Médine
|
|
117
|
+
|Dammam|الدمام|Ad Dammam, Ad Dammām
|
|
118
|
+
|Al Khobar|الخبر|Al Khubar, Khobar
|
|
119
|
+
|Dhahran|الظهران|Az Zahran
|
|
120
|
+
|Taif|الطائف|At Taif, At Ta’if, Ta'if
|
|
121
|
+
|Abha|أبها
|
|
122
|
+
|Khamis Mushait|خميس مشيط
|
|
123
|
+
|Tabuk|تبوك
|
|
124
|
+
|Buraydah|بريدة|Al Buraydah, Buraidah
|
|
125
|
+
|Hail|حائل|Ha'il
|
|
126
|
+
|Al Kharj|الخرج
|
|
127
|
+
|Al Hofuf|الهفوف|Al Hufuf, Hofuf
|
|
128
|
+
|Jubail|الجبيل|Al Jubayl, Al Jubail
|
|
129
|
+
|Yanbu|ينبع
|
|
130
|
+
|Najran|نجران
|
|
131
|
+
|Jazan|جازان|Jizan, جيزان
|
|
132
|
+
|Al Bahah|الباحة|Al Baha
|
|
133
|
+
|Sakaka|سكاكا|Sakakah
|
|
134
|
+
|Arar|عرعر|Arar & Wardat Nuaman, عرعر ورده نعمان`,
|
|
135
|
+
AE: `
|
|
136
|
+
|Dubai|دبي|fr=Dubaï
|
|
137
|
+
|Abu Dhabi|أبوظبي|أبو ظبي, Abu Zabi, fr=Abou Dabi
|
|
138
|
+
|Sharjah|الشارقة|Sharjah City, مدينة الشارقة, Ash Shariqah, fr=Charjah, de=Schardscha
|
|
139
|
+
|Al Ain|العين|Al Ayn
|
|
140
|
+
|Ajman|عجمان|'Ajman
|
|
141
|
+
|Ras Al Khaimah|رأس الخيمة|Ra's al Khaymah, راس الخيمة
|
|
142
|
+
|Fujairah|الفجيرة|Al Fujayrah
|
|
143
|
+
|Umm Al Quwain|أم القيوين|Umm al Qaywayn, ام القيوين
|
|
144
|
+
|Khor Fakkan|خورفكان|Khawr Fakkan, خور فكان
|
|
145
|
+
|Kalba|كلباء`,
|
|
146
|
+
JO: `
|
|
147
|
+
|Amman|عمان|عمّان
|
|
148
|
+
|Zarqa|الزرقاء|Az Zarqa, Zerka
|
|
149
|
+
|Irbid|إربد|اربد
|
|
150
|
+
|Aqaba|العقبة|Al Aqabah
|
|
151
|
+
|Salt|السلط|As Salt, Al Salt
|
|
152
|
+
|Tafilah|الطفيلة|At Tafila, At Tafilah
|
|
153
|
+
|Ma'an|معان|Maan
|
|
154
|
+
|Ajloun|عجلون|Ajlun
|
|
155
|
+
|Madaba|مادبا
|
|
156
|
+
|Jerash|جرش
|
|
157
|
+
|Mafraq|المفرق|Al Mafraq
|
|
158
|
+
|Karak|الكرك|Al Karak`,
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* A name as two of Azure's answers write one place's: its words, without
|
|
162
|
+
* accents, tatweel, vowel marks or the direction marks Arabic carries, in
|
|
163
|
+
* lower case ("Ash Shāriqah" is "ash shariqah", "الشيـخ زايد" "الشيخ زايد").
|
|
164
|
+
*/
|
|
165
|
+
const nameKey = (name) => (typeof name === 'string' ? name : '')
|
|
166
|
+
.replace(/[--]/g, '')
|
|
167
|
+
.normalize('NFD')
|
|
168
|
+
.replace(/[\p{M}ـ]/gu, '')
|
|
169
|
+
.toLowerCase()
|
|
170
|
+
.replace(/\s+/g, ' ')
|
|
171
|
+
.trim();
|
|
172
|
+
exports.nameKey = nameKey;
|
|
173
|
+
const tables = new Map();
|
|
174
|
+
function table(of, country) {
|
|
175
|
+
const id = `${of === REGIONS ? 'r' : 'c'}${country}`;
|
|
176
|
+
if (!tables.has(id) && of[country]) {
|
|
177
|
+
const places = [];
|
|
178
|
+
const byName = new Map();
|
|
179
|
+
const byCode = new Map();
|
|
180
|
+
for (const line of of[country].trim().split('\n')) {
|
|
181
|
+
const [code, en, ar, others = ''] = line.split('|');
|
|
182
|
+
const names = { en, ar };
|
|
183
|
+
const all = [en, ar];
|
|
184
|
+
for (const other of others.split(',').map((one) => one.trim()).filter(Boolean)) {
|
|
185
|
+
const [, locale, name] = other.match(/^(fr|de)=(.*)$/) ?? [];
|
|
186
|
+
if (locale)
|
|
187
|
+
names[locale] = name;
|
|
188
|
+
all.push(name ?? other);
|
|
189
|
+
}
|
|
190
|
+
const known = { names, ...(code ? { code } : {}) };
|
|
191
|
+
places.push(known);
|
|
192
|
+
if (code)
|
|
193
|
+
byCode.set(code, known);
|
|
194
|
+
for (const name of all) {
|
|
195
|
+
const of = byName.get((0, exports.nameKey)(name)) ?? [];
|
|
196
|
+
if (!of.includes(known))
|
|
197
|
+
byName.set((0, exports.nameKey)(name), [...of, known]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
tables.set(id, { places, byName, byCode });
|
|
201
|
+
}
|
|
202
|
+
return tables.get(id);
|
|
203
|
+
}
|
|
204
|
+
/** A region (a governorate, a province, an emirate) of these countries, by Azure's code for it or by one of its names. */
|
|
205
|
+
function knownRegion(country, ...names) {
|
|
206
|
+
const regions = table(REGIONS, country);
|
|
207
|
+
if (!regions)
|
|
208
|
+
return undefined;
|
|
209
|
+
for (const name of names)
|
|
210
|
+
if (/^[A-Z]{2,3}$/.test(name) && regions.byCode.has(name))
|
|
211
|
+
return regions.byCode.get(name);
|
|
212
|
+
for (const name of names) {
|
|
213
|
+
const found = regions.byName.get((0, exports.nameKey)(name));
|
|
214
|
+
if (found?.length === 1)
|
|
215
|
+
return found[0];
|
|
216
|
+
}
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
/** A city of these countries, by one of its names. */
|
|
220
|
+
function knownCity(country, name) {
|
|
221
|
+
const found = table(CITIES, country)?.byName.get((0, exports.nameKey)(name));
|
|
222
|
+
return found?.length === 1 ? found[0] : undefined;
|
|
223
|
+
}
|
|
224
|
+
/** A known place's name in a page's language: its own in French or German where it has one, its English one otherwise. */
|
|
225
|
+
const nameIn = (known, locale) => known.names[locale] ?? known.names.en;
|
|
226
|
+
exports.nameIn = nameIn;
|
|
227
|
+
/** Whether two names are one known city's or region's in a country ("Cairo" and "القاهرة"; "Al Jizah" and "Giza"). */
|
|
228
|
+
function sameKnown(country, one, other) {
|
|
229
|
+
const [a, b] = [(0, exports.nameKey)(one), (0, exports.nameKey)(other)];
|
|
230
|
+
if (!a || !b)
|
|
231
|
+
return false;
|
|
232
|
+
if (a === b)
|
|
233
|
+
return true;
|
|
234
|
+
return [REGIONS, CITIES].some((of) => {
|
|
235
|
+
const byName = table(of, country)?.byName;
|
|
236
|
+
const mine = byName?.get(a) ?? [];
|
|
237
|
+
return mine.length > 0 && (byName?.get(b) ?? []).some((known) => mine.includes(known));
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=address-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-names.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/address-names.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One place a line: its code (Azure's, where it gives one), its English
|
|
3
|
+
* and Arabic names, then its other names, comma-separated; `fr=`/`de=` give
|
|
4
|
+
* its French or German name.
|
|
5
|
+
*/
|
|
6
|
+
const REGIONS = {
|
|
7
|
+
EG: `
|
|
8
|
+
|Cairo|القاهرة|Al Qahirah, Al Qāhirah, al-Qahirah, Cairo Governorate, محافظة القاهرة, fr=Le Caire, de=Kairo
|
|
9
|
+
|Giza|الجيزة|Al Jizah, Al Jīzah, al-Jeezah, Giza Governorate, محافظة الجيزة, fr=Gizeh, de=Gizeh, Gise
|
|
10
|
+
|Alexandria|الإسكندرية|Al Iskandariyah, Alexandria Governorate, الاسكندرية, الأسكندرية, محافظة الإسكندرية, fr=Alexandrie
|
|
11
|
+
|Qalyubia|القليوبية|Al Qalyubiyah, Qalyubiyah, Kalyubia
|
|
12
|
+
|Beheira|البحيرة|Al Buhayrah, Buhayrah
|
|
13
|
+
|Ismailia|الإسماعيلية|Al Isma'iliyah, Al Ismailiyah, الاسماعيلية
|
|
14
|
+
|Sharqia|الشرقية|Ash Sharqiyah, Ash Sharqīyah, Sharkia, Al Sharqia
|
|
15
|
+
|Dakahlia|الدقهلية|Ad Daqahliyah, Daqahliyah
|
|
16
|
+
|Gharbia|الغربية|Al Gharbiyah
|
|
17
|
+
|Monufia|المنوفية|Al Minufiyah, Menofia
|
|
18
|
+
|Kafr El Sheikh|كفر الشيخ|Kafr ash Shaykh
|
|
19
|
+
|Damietta|دمياط|Dumyat, Dumyāţ, Domiat
|
|
20
|
+
|Port Said|بورسعيد|Bur Sa'id, Būr Sa‘īd, Bour Sa'eed, بور سعيد
|
|
21
|
+
|Suez|السويس|As Suways
|
|
22
|
+
|Faiyum|الفيوم|Al Fayyum, Fayoum
|
|
23
|
+
|Beni Suef|بني سويف|Bani Suwayf
|
|
24
|
+
|Minya|المنيا|Al Minya
|
|
25
|
+
|Asyut|أسيوط|Assiut, اسيوط
|
|
26
|
+
|Sohag|سوهاج|Suhaj
|
|
27
|
+
|Qena|قنا|Qina
|
|
28
|
+
|Luxor|الأقصر|Al Uqsur, الاقصر
|
|
29
|
+
|Aswan|أسوان|اسوان
|
|
30
|
+
|Red Sea|البحر الأحمر|Al Bahr al Ahmar
|
|
31
|
+
|New Valley|الوادي الجديد|Al Wadi al Jadid
|
|
32
|
+
|Matrouh|مطروح|Matruh
|
|
33
|
+
|North Sinai|شمال سيناء|Shamal Sina'
|
|
34
|
+
|South Sinai|جنوب سيناء|Janub Sina'`,
|
|
35
|
+
SA: `
|
|
36
|
+
RIY|Riyadh|الرياض|Ar Riyad, Ar Riyāḑ, Riyadh Region, Riyadh Province, منطقة الرياض, fr=Riyad, de=Riad
|
|
37
|
+
MAK|Makkah|مكة المكرمة|Mecca, Makkah Region, Makkah Province, Makkah Al Mukarramah, مكة, منطقة مكة المكرمة, fr=La Mecque, de=Mekka
|
|
38
|
+
MAD|Madinah|المدينة المنورة|Medina, Al Madinah, Al Madinah Al Munawwarah, المدينة, منطقة المدينة المنورة, fr=Médine, de=Medina
|
|
39
|
+
EAS|Eastern Province|المنطقة الشرقية|Eastern, Eastern Region, Ash Sharqiyah, الشرقية
|
|
40
|
+
QAS|Al Qassim|القصيم|Al Qasim, Qassim, منطقة القصيم
|
|
41
|
+
ASI|Asir|عسير|'Asir, ‘Asir, منطقة عسير
|
|
42
|
+
TAB|Tabuk|تبوك|منطقة تبوك
|
|
43
|
+
HAI|Hail|حائل|Ha'il, Ḩā'il, منطقة حائل
|
|
44
|
+
JAZ|Jazan|جازان|Jizan, Gizan, جيزان, منطقة جازان
|
|
45
|
+
|Najran|نجران|منطقة نجران
|
|
46
|
+
|Al Bahah|الباحة|Al Baha, منطقة الباحة
|
|
47
|
+
JOF|Al Jawf|الجوف|منطقة الجوف
|
|
48
|
+
|Northern Borders|الحدود الشمالية|Northern Frontier, Al Hudud ash Shamaliyah, منطقة الحدود الشمالية`,
|
|
49
|
+
AE: `
|
|
50
|
+
AZ|Abu Dhabi|أبوظبي|Abu Dhabi Emirate, Abu Zabi, أبو ظبي, إمارة أبوظبي, إمارة أبو ظبي, fr=Abou Dabi
|
|
51
|
+
DU|Dubai|دبي|Dubai Emirate, إمارة دبي, fr=Dubaï
|
|
52
|
+
SH|Sharjah|الشارقة|Sharjah Emirate, Ash Shariqah, Ash Shāriqah, إمارة الشارقة, fr=Charjah, de=Schardscha
|
|
53
|
+
AJ|Ajman|عجمان|Ajman Emirate, 'Ajman, إمارة عجمان
|
|
54
|
+
UQ|Umm Al Quwain|أم القيوين|Umm al Qaywayn, Umm Al-Quwain, Umm Al Quwain Emirate, Umm al-Quwain Emirate, ام القيوين
|
|
55
|
+
RK|Ras Al Khaimah|رأس الخيمة|Ra's al Khaymah, Ras al-Khaimah, Ras Al Khaimah Emirate, Ras al-Khaimah Emirate, راس الخيمة
|
|
56
|
+
FU|Fujairah|الفجيرة|Al Fujayrah, Fujairah Emirate`,
|
|
57
|
+
JO: `
|
|
58
|
+
|Amman|عمان|Amman Governorate, Capital Governorate, Al Asimah, عمّان, محافظة العاصمة, العاصمة
|
|
59
|
+
|Irbid|إربد|اربد
|
|
60
|
+
|Zarqa|الزرقاء|Az Zarqa
|
|
61
|
+
|Balqa|البلقاء|Al Balqa
|
|
62
|
+
|Madaba|مادبا
|
|
63
|
+
|Karak|الكرك|Al Karak
|
|
64
|
+
|Tafilah|الطفيلة|At Tafilah
|
|
65
|
+
|Ma'an|معان|Maan
|
|
66
|
+
|Aqaba|العقبة|Al Aqabah
|
|
67
|
+
|Mafraq|المفرق|Al Mafraq
|
|
68
|
+
|Jerash|جرش|Jarash, محافظة جرش
|
|
69
|
+
|Ajloun|عجلون|Ajlun`,
|
|
70
|
+
};
|
|
71
|
+
const CITIES = {
|
|
72
|
+
EG: `
|
|
73
|
+
|Cairo|القاهرة|Al Qahirah, Al Qāhirah, fr=Le Caire, de=Kairo
|
|
74
|
+
|Giza|الجيزة|Al Jizah, Al Jīzah, fr=Gizeh, de=Gizeh
|
|
75
|
+
|Alexandria|الإسكندرية|Al Iskandariyah, الاسكندرية, الأسكندرية, fr=Alexandrie
|
|
76
|
+
|New Cairo|القاهرة الجديدة|New Cairo City, Al Qahirah al Jadidah, مدينة القاهرة الجديدة
|
|
77
|
+
|6th of October|6 أكتوبر|6 October, 6th October, 6th of October City, Sixth of October, أكتوبر 6, السادس من أكتوبر, مدينة 6 أكتوبر, مدينة السادس من أكتوبر
|
|
78
|
+
|Sheikh Zayed|الشيخ زايد|El Sheikh Zaid, El Sheikh Zayed, Sheikh Zayed City, Sheikh Zaid, مدينة الشيخ زايد
|
|
79
|
+
|Helwan|حلوان
|
|
80
|
+
|Shubra El Kheima|شبرا الخيمة|Shubra al Khaymah, Shubrā al Khaymah
|
|
81
|
+
|Port Said|بورسعيد|Bur Sa'id, بور سعيد
|
|
82
|
+
|Suez|السويس|As Suways
|
|
83
|
+
|Ismailia|الإسماعيلية|El Ismailia, Al Isma'iliyah, الاسماعيلية
|
|
84
|
+
|Mansoura|المنصورة|El Mansoura, Al Mansurah
|
|
85
|
+
|Tanta|طنطا
|
|
86
|
+
|Zagazig|الزقازيق|El Zaqaziq, Az Zaqaziq
|
|
87
|
+
|Damietta|دمياط|Dumyat
|
|
88
|
+
|Banha|بنها|Benha
|
|
89
|
+
|Damanhur|دمنهور|Damanhour
|
|
90
|
+
|Shibin El Kom|شبين الكوم|Shibin al Kawm, Shebin El Kom
|
|
91
|
+
|Kafr El Sheikh|كفر الشيخ|Kafr ash Shaykh
|
|
92
|
+
|Faiyum|الفيوم|El Faiyum, Al Fayyum, Fayoum
|
|
93
|
+
|Beni Suef|بني سويف|Bani Suwayf
|
|
94
|
+
|Minya|المنيا|El Minya, El Menia, Al Minya
|
|
95
|
+
|Asyut|أسيوط|Assiut, اسيوط
|
|
96
|
+
|Sohag|سوهاج|Sawhaj, Suhaj
|
|
97
|
+
|Qena|قنا|Qina
|
|
98
|
+
|Luxor|الأقصر|Al Uqsur, الاقصر
|
|
99
|
+
|Aswan|أسوان|اسوان
|
|
100
|
+
|Hurghada|الغردقة|Al Ghardaqah
|
|
101
|
+
|Kharga|الخارجة|El Kharga, Al Kharijah
|
|
102
|
+
|Marsa Matruh|مرسى مطروح|Marsa Matrouh
|
|
103
|
+
|Arish|العريش|El Arish, Al Arish
|
|
104
|
+
|El Tor|الطور|At Tur, مدينة الطور, مدينه الطور
|
|
105
|
+
|Sharm El Sheikh|شرم الشيخ|Sharm ash Shaykh`,
|
|
106
|
+
SA: `
|
|
107
|
+
|Riyadh|الرياض|Ar Riyad, fr=Riyad, de=Riad
|
|
108
|
+
|Jeddah|جدة|Jiddah, Jedda, جده, fr=Djeddah, de=Dschidda
|
|
109
|
+
|Makkah|مكة المكرمة|Mecca, Makkah Al Mukarramah, مكة, fr=La Mecque, de=Mekka
|
|
110
|
+
|Madinah|المدينة المنورة|Medina, Al Madinah, Al Madinah Al Munawwarah, المدينة, fr=Médine
|
|
111
|
+
|Dammam|الدمام|Ad Dammam, Ad Dammām
|
|
112
|
+
|Al Khobar|الخبر|Al Khubar, Khobar
|
|
113
|
+
|Dhahran|الظهران|Az Zahran
|
|
114
|
+
|Taif|الطائف|At Taif, At Ta’if, Ta'if
|
|
115
|
+
|Abha|أبها
|
|
116
|
+
|Khamis Mushait|خميس مشيط
|
|
117
|
+
|Tabuk|تبوك
|
|
118
|
+
|Buraydah|بريدة|Al Buraydah, Buraidah
|
|
119
|
+
|Hail|حائل|Ha'il
|
|
120
|
+
|Al Kharj|الخرج
|
|
121
|
+
|Al Hofuf|الهفوف|Al Hufuf, Hofuf
|
|
122
|
+
|Jubail|الجبيل|Al Jubayl, Al Jubail
|
|
123
|
+
|Yanbu|ينبع
|
|
124
|
+
|Najran|نجران
|
|
125
|
+
|Jazan|جازان|Jizan, جيزان
|
|
126
|
+
|Al Bahah|الباحة|Al Baha
|
|
127
|
+
|Sakaka|سكاكا|Sakakah
|
|
128
|
+
|Arar|عرعر|Arar & Wardat Nuaman, عرعر ورده نعمان`,
|
|
129
|
+
AE: `
|
|
130
|
+
|Dubai|دبي|fr=Dubaï
|
|
131
|
+
|Abu Dhabi|أبوظبي|أبو ظبي, Abu Zabi, fr=Abou Dabi
|
|
132
|
+
|Sharjah|الشارقة|Sharjah City, مدينة الشارقة, Ash Shariqah, fr=Charjah, de=Schardscha
|
|
133
|
+
|Al Ain|العين|Al Ayn
|
|
134
|
+
|Ajman|عجمان|'Ajman
|
|
135
|
+
|Ras Al Khaimah|رأس الخيمة|Ra's al Khaymah, راس الخيمة
|
|
136
|
+
|Fujairah|الفجيرة|Al Fujayrah
|
|
137
|
+
|Umm Al Quwain|أم القيوين|Umm al Qaywayn, ام القيوين
|
|
138
|
+
|Khor Fakkan|خورفكان|Khawr Fakkan, خور فكان
|
|
139
|
+
|Kalba|كلباء`,
|
|
140
|
+
JO: `
|
|
141
|
+
|Amman|عمان|عمّان
|
|
142
|
+
|Zarqa|الزرقاء|Az Zarqa, Zerka
|
|
143
|
+
|Irbid|إربد|اربد
|
|
144
|
+
|Aqaba|العقبة|Al Aqabah
|
|
145
|
+
|Salt|السلط|As Salt, Al Salt
|
|
146
|
+
|Tafilah|الطفيلة|At Tafila, At Tafilah
|
|
147
|
+
|Ma'an|معان|Maan
|
|
148
|
+
|Ajloun|عجلون|Ajlun
|
|
149
|
+
|Madaba|مادبا
|
|
150
|
+
|Jerash|جرش
|
|
151
|
+
|Mafraq|المفرق|Al Mafraq
|
|
152
|
+
|Karak|الكرك|Al Karak`,
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* A name as two of Azure's answers write one place's: its words, without
|
|
156
|
+
* accents, tatweel, vowel marks or the direction marks Arabic carries, in
|
|
157
|
+
* lower case ("Ash Shāriqah" is "ash shariqah", "الشيـخ زايد" "الشيخ زايد").
|
|
158
|
+
*/
|
|
159
|
+
export const nameKey = (name) => (typeof name === 'string' ? name : '')
|
|
160
|
+
.replace(/[--]/g, '')
|
|
161
|
+
.normalize('NFD')
|
|
162
|
+
.replace(/[\p{M}ـ]/gu, '')
|
|
163
|
+
.toLowerCase()
|
|
164
|
+
.replace(/\s+/g, ' ')
|
|
165
|
+
.trim();
|
|
166
|
+
const tables = new Map();
|
|
167
|
+
function table(of, country) {
|
|
168
|
+
const id = `${of === REGIONS ? 'r' : 'c'}${country}`;
|
|
169
|
+
if (!tables.has(id) && of[country]) {
|
|
170
|
+
const places = [];
|
|
171
|
+
const byName = new Map();
|
|
172
|
+
const byCode = new Map();
|
|
173
|
+
for (const line of of[country].trim().split('\n')) {
|
|
174
|
+
const [code, en, ar, others = ''] = line.split('|');
|
|
175
|
+
const names = { en, ar };
|
|
176
|
+
const all = [en, ar];
|
|
177
|
+
for (const other of others.split(',').map((one) => one.trim()).filter(Boolean)) {
|
|
178
|
+
const [, locale, name] = other.match(/^(fr|de)=(.*)$/) ?? [];
|
|
179
|
+
if (locale)
|
|
180
|
+
names[locale] = name;
|
|
181
|
+
all.push(name ?? other);
|
|
182
|
+
}
|
|
183
|
+
const known = { names, ...(code ? { code } : {}) };
|
|
184
|
+
places.push(known);
|
|
185
|
+
if (code)
|
|
186
|
+
byCode.set(code, known);
|
|
187
|
+
for (const name of all) {
|
|
188
|
+
const of = byName.get(nameKey(name)) ?? [];
|
|
189
|
+
if (!of.includes(known))
|
|
190
|
+
byName.set(nameKey(name), [...of, known]);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
tables.set(id, { places, byName, byCode });
|
|
194
|
+
}
|
|
195
|
+
return tables.get(id);
|
|
196
|
+
}
|
|
197
|
+
/** A region (a governorate, a province, an emirate) of these countries, by Azure's code for it or by one of its names. */
|
|
198
|
+
export function knownRegion(country, ...names) {
|
|
199
|
+
const regions = table(REGIONS, country);
|
|
200
|
+
if (!regions)
|
|
201
|
+
return undefined;
|
|
202
|
+
for (const name of names)
|
|
203
|
+
if (/^[A-Z]{2,3}$/.test(name) && regions.byCode.has(name))
|
|
204
|
+
return regions.byCode.get(name);
|
|
205
|
+
for (const name of names) {
|
|
206
|
+
const found = regions.byName.get(nameKey(name));
|
|
207
|
+
if (found?.length === 1)
|
|
208
|
+
return found[0];
|
|
209
|
+
}
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
/** A city of these countries, by one of its names. */
|
|
213
|
+
export function knownCity(country, name) {
|
|
214
|
+
const found = table(CITIES, country)?.byName.get(nameKey(name));
|
|
215
|
+
return found?.length === 1 ? found[0] : undefined;
|
|
216
|
+
}
|
|
217
|
+
/** A known place's name in a page's language: its own in French or German where it has one, its English one otherwise. */
|
|
218
|
+
export const nameIn = (known, locale) => known.names[locale] ?? known.names.en;
|
|
219
|
+
/** Whether two names are one known city's or region's in a country ("Cairo" and "القاهرة"; "Al Jizah" and "Giza"). */
|
|
220
|
+
export function sameKnown(country, one, other) {
|
|
221
|
+
const [a, b] = [nameKey(one), nameKey(other)];
|
|
222
|
+
if (!a || !b)
|
|
223
|
+
return false;
|
|
224
|
+
if (a === b)
|
|
225
|
+
return true;
|
|
226
|
+
return [REGIONS, CITIES].some((of) => {
|
|
227
|
+
const byName = table(of, country)?.byName;
|
|
228
|
+
const mine = byName?.get(a) ?? [];
|
|
229
|
+
return mine.length > 0 && (byName?.get(b) ?? []).some((known) => mine.includes(known));
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=address-names.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-names.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/address-names.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
import type { Locale } from '@fieldia/core';
|
|
2
|
+
import type { PlaceFound, SearchRequest } from './providers.mjs';
|
|
1
3
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* How each provider's addresses read, loaded with the first search that
|
|
5
|
+
* needs it (an address field's; any of Azure's or Google's), never with a
|
|
6
|
+
* page: an address in its parts, as Fieldia's address field
|
|
7
|
+
* (`json.address`) keeps one (the street with its number, the city, the
|
|
8
|
+
* region, a state or a governorate, the postcode, and the country as its ISO
|
|
9
|
+
* code, "EG"); Azure's and Google's places on two lines, in the page's
|
|
10
|
+
* language; and where a suggestion picked is, for those whose suggestions
|
|
11
|
+
* carry no place. Each provider names the parts its own way: what each
|
|
12
|
+
* answered in Egypt, Saudi Arabia, the UAE and Jordan on 12 Oct 2026 is
|
|
13
|
+
* read here.
|
|
7
14
|
*/
|
|
8
15
|
export interface AddressParts {
|
|
9
16
|
street?: string;
|
|
@@ -16,13 +23,124 @@ export interface AddressParts {
|
|
|
16
23
|
export declare const photonParts: (p: unknown) => AddressParts | undefined;
|
|
17
24
|
/** Nominatim's `address` (with `addressdetails=1`): a town or a village where there is no city. */
|
|
18
25
|
export declare const nominatimParts: (a: unknown) => AddressParts | undefined;
|
|
19
|
-
/**
|
|
20
|
-
export declare const azureParts: (a: unknown) => AddressParts | undefined;
|
|
21
|
-
/** Google's `addressComponents`, each by its type: the country by its short code. */
|
|
22
|
-
export declare const googleParts: (components: unknown) => AddressParts | undefined;
|
|
23
|
-
/** Mapbox's `context`: its address's own line (number and street), or the street alone. */
|
|
26
|
+
/** Mapbox's `context`: its address's own line (number and street, in its country's order), or the street alone. */
|
|
24
27
|
export declare const mapboxParts: (p: unknown) => AddressParts | undefined;
|
|
25
28
|
/** Only places in the countries asked for, when some are: for a provider that cannot be asked to keep to them. */
|
|
26
29
|
export declare const inCountries: <T extends {
|
|
27
30
|
parts?: AddressParts;
|
|
28
31
|
}>(places: T[], countries?: string[]) => T[];
|
|
32
|
+
/**
|
|
33
|
+
* The countries a provider can be asked to keep to: ISO codes, each once,
|
|
34
|
+
* "UK" read as "GB" (as every provider's parts name it). A code no one
|
|
35
|
+
* knows ("XX", "EGY") is left out and said once: Azure and Google refuse a
|
|
36
|
+
* whole search for one.
|
|
37
|
+
*/
|
|
38
|
+
export declare function knownCountries(countries: string[] | undefined): string[];
|
|
39
|
+
/** The countries Google is asked to keep to (`includedRegionCodes`): 15 at most, as it refuses a whole search for more; with more, none, said once. */
|
|
40
|
+
export declare function googleRegions(countries: string[] | undefined): string[];
|
|
41
|
+
/** What one of Azure's places is, by its type: a street (an address, a road), an area (a town, a district, a governorate), or a place with a name of its own (a station, a park, a mall). */
|
|
42
|
+
type Level = 'street' | 'area' | 'named';
|
|
43
|
+
type LatLngAt = {
|
|
44
|
+
lat: number;
|
|
45
|
+
lng: number;
|
|
46
|
+
};
|
|
47
|
+
/** A place of Azure's, with what locating it takes: its address as Azure gave it, its level, its street line or its area's own name, and where the search looked. */
|
|
48
|
+
export interface AzurePlace extends PlaceFound {
|
|
49
|
+
country: string;
|
|
50
|
+
azure: {
|
|
51
|
+
address: unknown;
|
|
52
|
+
level: Level;
|
|
53
|
+
street: string;
|
|
54
|
+
area?: string;
|
|
55
|
+
type?: string;
|
|
56
|
+
near?: LatLngAt;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Azure's places on two lines: the street, or the place's own name (a quarter's, a town's), then where it is; their parts when asked. */
|
|
60
|
+
export declare function azurePlaces(found: unknown, locale: Locale, typed?: string, withParts?: boolean, near?: LatLngAt): AzurePlace[];
|
|
61
|
+
/** A point named by Azure: its first address, in order. */
|
|
62
|
+
export declare function azureNamed(found: unknown, locale: Locale): string;
|
|
63
|
+
type Ask = (params: Record<string, string | number | undefined>) => Promise<unknown>;
|
|
64
|
+
/**
|
|
65
|
+
* Azure's suggestions: nearest the place the page gives first, or the whole
|
|
66
|
+
* world's by prominence when it gives none; kept to the countries the page
|
|
67
|
+
* names by Azure itself (`countryRegion`), one request for each (a tenth of
|
|
68
|
+
* a Search transaction each; a list of them answers nothing), taken in
|
|
69
|
+
* turn, five in all. For an address field (`addresses`), no postcodes alone,
|
|
70
|
+
* and the addresses and areas first, the places with names of their own
|
|
71
|
+
* (a station, a park) after them, as Azure's types say. A row that reads as
|
|
72
|
+
* one before it is left out, as one that says less of the same place than
|
|
73
|
+
* another is. The word for a district typed before its name ("حي الروضة")
|
|
74
|
+
* is left out of the words asked, as Azure names its districts without it
|
|
75
|
+
* (with it, Azure lists other towns' streets and districts named with the
|
|
76
|
+
* word, and none of Riyadh's Al Rawdah); the words are asked as typed only
|
|
77
|
+
* when that finds nothing.
|
|
78
|
+
*/
|
|
79
|
+
export declare function azureSearch(autocomplete: Ask, request: SearchRequest): Promise<AzurePlace[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Where a suggestion of Azure's is (its suggestions carry no place), asked
|
|
82
|
+
* of its geocoding, the hits in the suggestion's own country and admin
|
|
83
|
+
* districts kept (`fits`; "Al Rawdah" in Riyadh's governorate, never in
|
|
84
|
+
* Al Wasiah's).
|
|
85
|
+
*
|
|
86
|
+
* A street, by its own address in Azure's structured form: its street line
|
|
87
|
+
* (never with a house number Azure made up), its own district for its
|
|
88
|
+
* locality where it names one below its town (its neighbourhood, the
|
|
89
|
+
* district its line names, "Kamel El Shenawy, Garden City"), then its
|
|
90
|
+
* locality, its admin districts, postcode and country; then by its two
|
|
91
|
+
* lines (`query`). Of each answer's streets, the one that names its
|
|
92
|
+
* district; else one in the district's own box as Azure has it (a little
|
|
93
|
+
* beyond it, as its point is a stretch's middle), asked for once; never a
|
|
94
|
+
* street of the name in another district (Azure's first "Kamel El Shenawy"
|
|
95
|
+
* is New Cairo's, 25 km from Garden City's), nor, for a street named by its
|
|
96
|
+
* number alone ("10 41 Street | Abu Tina"), one that does not say it is in
|
|
97
|
+
* its district where Azure knows none. Found nowhere so, its district
|
|
98
|
+
* (`precise: false`), else its town.
|
|
99
|
+
*
|
|
100
|
+
* An area by its own name (its neighbourhood, the place its line names, its
|
|
101
|
+
* locality; a governorate named for its town as the town: "Sohag", whose
|
|
102
|
+
* division's middle is 57 km from the city), never by its postcode (one of
|
|
103
|
+
* a town's many: Azure gives Tanta's 31111 for Tanta), or by its two lines
|
|
104
|
+
* where its neighbourhood is not its locality; a place with a name of its
|
|
105
|
+
* own by its two lines. Of places of one kind and name (Abu Dhabi's Al
|
|
106
|
+
* Bateen and Al Ain's), the one nearest where the search looked; found
|
|
107
|
+
* nowhere, the town it is in (`precise: false`).
|
|
108
|
+
*
|
|
109
|
+
* It is precise when the hit is the place itself (`isItself`), a street's
|
|
110
|
+
* in its own district: where Azure knows no box for the district, a street
|
|
111
|
+
* it marks `Ambiguous` (several of the words) is only near, as one of a
|
|
112
|
+
* number is unless it says it is in its district. Otherwise only near it.
|
|
113
|
+
* Never a place anywhere else: none is found then.
|
|
114
|
+
* A suggestion that names no region ("البرشاء 2", which Azure lists beside
|
|
115
|
+
* the same in Dubai) takes its city and region from the place found.
|
|
116
|
+
*/
|
|
117
|
+
export declare function azureLocate(geocode: Ask, place: AzurePlace, locale: Locale): Promise<{
|
|
118
|
+
precise?: false | undefined;
|
|
119
|
+
parts?: {
|
|
120
|
+
city?: string;
|
|
121
|
+
region?: string;
|
|
122
|
+
street?: string;
|
|
123
|
+
postcode?: string;
|
|
124
|
+
country?: string;
|
|
125
|
+
} | undefined;
|
|
126
|
+
address: string;
|
|
127
|
+
lat: number;
|
|
128
|
+
lng: number;
|
|
129
|
+
}>;
|
|
130
|
+
/**
|
|
131
|
+
* Google's `addressComponents`, each by its type: the country by its short
|
|
132
|
+
* code. Its number where Google's own line (`formatted`) puts it: before the
|
|
133
|
+
* street in Egypt and Saudi Arabia ("7524 King Fahd Rd"), after it in Jordan
|
|
134
|
+
* and Germany ("Rainbow St. 15"). Its city its locality; Egypt's streets have
|
|
135
|
+
* none, and their district stands for it ("Qasr El Nil", "Maadi"), by its
|
|
136
|
+
* name alone in Arabic too ("الدقي", not "قسم الدقي", its police district's).
|
|
137
|
+
*/
|
|
138
|
+
export declare const googleParts: (components: unknown, formatted?: unknown) => AddressParts | undefined;
|
|
139
|
+
/**
|
|
140
|
+
* Google's suggestions: each one's name, and where it is; for an address
|
|
141
|
+
* field, the addresses first (their types say "geocode"), the shops and
|
|
142
|
+
* buildings after them. Each is located when picked, through `details`
|
|
143
|
+
* (Place Details), which ends its session (`end`), as picking it does.
|
|
144
|
+
*/
|
|
145
|
+
export declare function googlePlaces(answer: unknown, { locale, addresses, parts }: SearchRequest, details: (placeId: string) => Promise<unknown>, end: () => void): PlaceFound[];
|
|
146
|
+
export {};
|