-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
220 lines (210 loc) · 15.9 KB
/
script.js
File metadata and controls
220 lines (210 loc) · 15.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
const STATIONS = [
{ en: "Tajrish Metro Station", fa: "ایستگاه متروی تجریش" },
{ en: "Gheytariyeh Metro Station", fa: "ایستگاه متروی قیطریه" },
{ en: "Shahid Sadr Metro Station", fa: "ایستگاه متروی شهید صدر" },
{ en: "Gholhak Metro Station", fa: "ایستگاه متروی قلهک" },
{ en: "Shariati Metro Station", fa: "ایستگاه متروی شریعتی" },
{ en: "Mirdamad Metro Station", fa: "ایستگاه متروی میرداماد" },
{ en: "Shahid Haghani Metro Station", fa: "ایستگاه متروی شهید حقانی" },
{ en: "Shahid Hemmat Metro Station", fa: "ایستگاه متروی شهید همت" },
{ en: "Mosalla Imam Khomeini Metro Station", fa: "ایستگاه متروی مصلی امام خمینی" },
{ en: "Shahid Beheshti Metro Station", fa: "ایستگاه متروی شهید بهشتی" },
{ en: "Shahid Mofatteh Metro Station", fa: "ایستگاه متروی شهید مفتح" },
{ en: "Shohada-ye Haftom-e Tir Metro Station", fa: "ایستگاه متروی شهدای هفتم تیر" },
{ en: "Taleghani Metro Station", fa: "ایستگاه متروی طالقانی" },
{ en: "Darvazeh Dowlat Metro Station", fa: "ایستگاه متروی دروازه دولت" },
{ en: "Saadi Metro Station", fa: "ایستگاه متروی سعدی" },
{ en: "Imam Khomeini Metro Station", fa: "ایستگاه متروی امام خمینی" },
{ en: "Panzdah-e Khordad Metro Station", fa: "ایستگاه متروی پانزده خرداد" },
{ en: "Khayam Metro Station", fa: "ایستگاه متروی خیام" },
{ en: "Meydan-e Mohammadiyeh Metro Station", fa: "ایستگاه متروی میدان محمدیه" },
{ en: "Shush Metro Station", fa: "ایستگاه متروی شوش" },
{ en: "Payane Jonoob Metro Station", fa: "ایستگاه متروی پایانه جنوب" },
{ en: "Shahid Bokharaei Metro Station", fa: "ایستگاه متروی شهید بخارایی" },
{ en: "Ali Abad Metro Station", fa: "ایستگاه متروی علیآباد" },
{ en: "Javanmard-e-Ghassab Metro Station", fa: "ایستگاه متروی جوانمرد قصاب" },
{ en: "Shahr-e-Rey Metro Station", fa: "ایستگاه متروی شهرری" },
{ en: "Palayeshgah Metro Station", fa: "ایستگاه متروی پالایشگاه" },
{ en: "Shahed - Bagher Shahr Metro Station", fa: "ایستگاه متروی شهید باقرشهر" },
{ en: "Imam Khomeini International Airport Metro Station", fa: "ایستگاه متروی فرودگاه امام خمینی" },
{ en: "Parand City Metro Station", fa: "ایستگاه متروی شهر پارند" },
{ en: "Haram-e Motahhar-e Emam Khomeini Metro Station", fa: "ایستگاه متروی حرم مطهر امام خمینی" },
{ en: "Kahrizak Metro Station", fa: "ایستگاه متروی کهریزک" },
{ en: "Farhangsara Metro Station", fa: "ایستگاه متروی فرهنگسرا" },
{ en: "Tehranpars Metro Station", fa: "ایستگاه متروی تهرانپارس" },
{ en: "Shahid Bagheri Metro Station", fa: "ایستگاه متروی شهید باقری" },
{ en: "Elm-o-Sanat University Metro Station", fa: "ایستگاه متروی دانشگاه علم و صنعت" },
{ en: "Sarsabz Metro Station", fa: "ایستگاه متروی سرسبز" },
{ en: "Janbazan Metro Station", fa: "ایستگاه متروی جانبازان" },
{ en: "Fadak Metro Station", fa: "ایستگاه متروی فدک" },
{ en: "Sabalan Metro Station", fa: "ایستگاه متروی سبلان" },
{ en: "Shahid Madani Metro Station", fa: "ایستگاه متروی شهید مدنی" },
{ en: "Imam Hossein Metro Station", fa: "ایستگاه متروی امام حسین" },
{ en: "Darvazeh Shemiran Metro Station", fa: "ایستگاه متروی دروازه شمیران" },
{ en: "Baharestan Metro Station", fa: "ایستگاه متروی بهارستان" },
{ en: "Mellat Metro Station", fa: "ایستگاه متروی ملت" },
{ en: "Hasan Abad Metro Station", fa: "ایستگاه متروی حسنآباد" },
{ en: "Daneshgah-e Emam Ali Metro Station", fa: "ایستگاه متروی دانشگاه امام علی" },
{ en: "Meydan-e Horr Metro Station", fa: "ایستگاه متروی میدان حر" },
{ en: "Shahid Navvab-e Safavi Metro Station", fa: "ایستگاه متروی شهید نواب صفوی" },
{ en: "Shademan Metro Station", fa: "ایستگاه متروی شادمان" },
{ en: "Daneshgah-e Sharif Metro Station", fa: "ایستگاه متروی دانشگاه شریف" },
{ en: "Tarasht Metro Station", fa: "ایستگاه متروی طرشت" },
{ en: "Tehran (Sadeghiyeh) Metro Station", fa: "ایستگاه متروی تهران (صادقیه)" },
{ en: "Ghaem Metro Station", fa: "ایستگاه متروی قائم" },
{ en: "Shahid Mahallati Metro Station", fa: "ایستگاه متروی شهید محلاتی" },
{ en: "Aghdasiyeh Metro Station", fa: "ایستگاه متروی اقدسیه" },
{ en: "Nobonyad Metro Station", fa: "ایستگاه متروی نوبنیاد" },
{ en: "Hossein Abad Metro Station", fa: "ایستگاه متروی حسینآباد" },
{ en: "Heravi Metro Station", fa: "ایستگاه متروی هروی" },
{ en: "Shahid Zeyn-o-ddin Metro Station", fa: "ایستگاه متروی شهید زینالدین" },
{ en: "Khajeh Abdollah-e Ansari Metro Station", fa: "ایستگاه متروی خواجه عبدالله انصاری" },
{ en: "Shahid Sayyad-e Shirazi Metro Station", fa: "ایستگاه متروی شهید صیاد شیرازی" },
{ en: "Shahid Ghoddoosi Metro Station", fa: "ایستگاه متروی شهید قدوسی" },
{ en: "Sohrevardi Metro Station", fa: "ایستگاه متروی سهروردی" },
{ en: "Shahid Beheshti Metro Station", fa: "ایستگاه متروی شهید بهشتی" },
{ en: "Mirzaye Shirazi Metro Station", fa: "ایستگاه متروی میرزای شیرازی" },
{ en: "Meydan-e Jahad Metro Station", fa: "ایستگاه متروی میدان جهاد" },
{ en: "Meydan-e Vali Asr Metro Station", fa: "ایستگاه متروی میدان ولیعصر" },
{ en: "Teatr-e Shahr Metro Station", fa: "ایستگاه متروی تئاتر شهر" },
{ en: "Moniriyeh Metro Station", fa: "ایستگاه متروی منیریه" },
{ en: "Mahdiyeh Metro Station", fa: "ایستگاه متروی مهدیه" },
{ en: "Rahahan Metro Station", fa: "ایستگاه متروی راهآهن" },
{ en: "Javadiyeh Metro Station", fa: "ایستگاه متروی جوادیه" },
{ en: "Zam Zam Metro Station", fa: "ایستگاه متروی زمزم" },
{ en: "Shahrak-e Shari'ati Metro Station", fa: "ایستگاه متروی شهرک شریعتی" },
{ en: "Abdol Abad Metro Station", fa: "ایستگاه متروی عبدلآباد" },
{ en: "Ne'mat Abad Metro Station", fa: "ایستگاه متروی نعمتآباد" },
{ en: "Azadegan Metro Station", fa: "ایستگاه متروی آزادگان" },
{ en: "Shahid Kolahdooz Metro Station", fa: "ایستگاه متروی شهید کلاهدوز" },
{ en: "Nirooye Havaei Metro Station", fa: "ایستگاه متروی نیروی هوایی" },
{ en: "Nabard Metro Station", fa: "ایستگاه متروی نبرد" },
{ en: "Piroozi Metro Station", fa: "ایستگاه متروی پیروزی" },
{ en: "Ebn-e Sina Metro Station", fa: "ایستگاه متروی ابن سینا" },
{ en: "Meydan-e Shohada Metro Station", fa: "ایستگاه متروی میدان شهدا" },
{ en: "Doctor Habib-o-llah Metro Station", fa: "ایستگاه متروی دکتر حبیب الله" },
{ en: "Ostad Moein Metro Station", fa: "ایستگاه متروی استاد معین" },
{ en: "Meydan-e Azadi Metro Station", fa: "ایستگاه متروی میدان آزادی" },
{ en: "Bimeh Metro Station", fa: "ایستگاه متروی بیمه" },
{ en: "Mehrabad International Airport Metro Station", fa: "ایستگاه متروی فرودگاه مهرآباد" },
{ en: "Shahrak-e Ekbatan Metro Station", fa: "ایستگاه متروی شهرک اکباتان" },
{ en: "Eram-e Sabz Metro Station", fa: "ایستگاه متروی ارم سبز" },
{ en: "Allameh Jafari Metro Station", fa: "ایستگاه متروی علامه جعفری" },
{ en: "Eram-e Sabz Metro Station", fa: "ایستگاه متروی ارم سبز" },
{ en: "Varzeshgah-e Azadi Metro Station", fa: "ایستگاه متروی ورزشگاه آزادی" },
{ en: "Chitgar Metro Station", fa: "ایستگاه متروی چیتگر" },
{ en: "Iran Khodro Metro Station", fa: "ایستگاه متروی ایران خودرو" },
{ en: "Vardavard Metro Station", fa: "ایستگاه متروی وردآورد" },
{ en: "Garmdarreh Metro Station", fa: "ایستگاه متروی گرمدره" },
{ en: "Atmosfer Metro Station", fa: "ایستگاه متروی اتمسفر" },
{ en: "Karaj Metro Station", fa: "ایستگاه متروی کرج" },
{ en: "Mohammad Shahr Metro Station", fa: "ایستگاه متروی محمدشهر" },
{ en: "Golshahr Metro Station", fa: "ایستگاه متروی گلشهر" },
{ en: "Shahid Fakhrizadeh (Mammut) Metro Station", fa: "ایستگاه متروی شهید فخریزاده" },
{ en: "Shahid Sepahbod Qasem Soleimani Metro Station", fa: "ایستگاه متروی شهید سپهبد قاسم سلیمانی" },
{ en: "Shahid Arman Aliverdi (Kouhsar) Metro Station", fa: "ایستگاه متروی شهید آرمان علیوردی" },
{ en: "Shohada-ye Kan Metro Station", fa: "ایستگاه متروی شهدای کن" },
{ en: "Shahran Metro Station", fa: "ایستگاه متروی شهران" },
{ en: "Shahr-e Ziba Metro Station", fa: "ایستگاه متروی شهر زیبا" },
{ en: "Ayatollah Kashani Metro Station", fa: "ایستگاه متروی آیتالله کاشانی" },
{ en: "Shahid Sattari Metro Station", fa: "ایستگاه متروی شهید ستاری" },
{ en: "Shahid Ashrafi Esfahani Metro Station", fa: "ایستگاه متروی شهید اشرفی اصفهانی" },
{ en: "Yadegar-e Emam Metro Station", fa: "ایستگاه متروی یادگار امام" },
{ en: "Marzdaran Metro Station", fa: "ایستگاه متروی مرزداران" },
{ en: "Shahrak-e Azmayesh Metro Station", fa: "ایستگاه متروی شهرک آزمایش" },
{ en: "Daneshgah-e Tarbiat Modares Metro Station", fa: "ایستگاه متروی دانشگاه تربیت مدرس" },
{ en: "Karegar Metro Station", fa: "ایستگاه متروی کارگر" },
{ en: "Boostan-e Laleh Metro Station", fa: "ایستگاه متروی بوستان لاله" },
{ en: "Meydan-e Vali Asr Metro Station", fa: "ایستگاه متروی میدان ولیعصر" },
{ en: "Shohada-ye Haftom-e Tir Metro Station", fa: "ایستگاه متروی شهدای هفتم تیر" },
{ en: "Bahar Shiraz Metro Station", fa: "ایستگاه متروی بهار شیراز" },
{ en: "Imam Hossein Metro Station", fa: "ایستگاه متروی امام حسین" },
{ en: "Meydan-e Shohada Metro Station", fa: "ایستگاه متروی میدان شهدا" },
{ en: "Amir Kabir Metro Station", fa: "ایستگاه متروی امیرکبیر" },
{ en: "Meydan-e Khorasan Metro Station", fa: "ایستگاه متروی میدان خراسان" },
{ en: "Shahid Rezaei Metro Station", fa: "ایستگاه متروی شهید رضایی" },
{ en: "Besat Metro Station", fa: "ایستگاه متروی بعثت" },
{ en: "Kiyan Shahr Metro Station", fa: "ایستگاه متروی کیانشهر" },
{ en: "Dowlat Abad Metro Station", fa: "ایستگاه متروی دولتآباد" },
{ en: "Meydan-e Ketab Metro Station", fa: "ایستگاه متروی میدان کتاب" },
{ en: "Shahid Dadman Metro Station", fa: "ایستگاه متروی شهید دادمان" },
{ en: "Meydan-e San'at Metro Station", fa: "ایستگاه متروی میدان صنعت" },
{ en: "Borj-e Milad-e Tehran Metro Station", fa: "ایستگاه متروی برج میلاد تهران" },
{ en: "Boostan-e Goftegou Metro Station", fa: "ایستگاه متروی بوستان گفتگو" },
{ en: "Modafean Salamat Metro Station", fa: "ایستگاه متروی مدافعان سلامت" },
{ en: "Towhid Metro Station", fa: "ایستگاه متروی توحید" },
{ en: "Shahid Navvab-e Safavi Metro Station", fa: "ایستگاه متروی شهید نواب صفوی" },
{ en: "Roudaki Metro Station", fa: "ایستگاه متروی رودکی" },
{ en: "Komeyl Metro Station", fa: "ایستگاه متروی کمیل" },
{ en: "Beryanak Metro Station", fa: "ایستگاه متروی بنیانک" },
{ en: "Helal-e Ahmar Metro Station", fa: "ایستگاه متروی هلال احمر" },
{ en: "Mahdiyeh Metro Station", fa: "ایستگاه متروی مهدیه" },
{ en: "Meydan-e Mohammadiyeh Metro Station", fa: "ایستگاه متروی میدان محمدیه" },
{ en: "Molavi Metro Station", fa: "ایستگاه متروی مولوی" },
{ en: "Meydan-e Ghiam Metro Station", fa: "ایستگاه متروی میدان قیام" },
{ en: "Shohada-ye Hefdah-e Shahrivar Metro Station", fa: "ایستگاه متروی شهدای هفدهم شهریور" },
{ en: "Chehel Tan-e Doolab Metro Station", fa: "ایستگاه متروی چهل تن دولاب" },
{ en: "Ahang Metro Station", fa: "ایستگاه متروی آهنگ" },
{ en: "Basij Metro Station", fa: "ایستگاه متروی بسیج" },
];
const NOMINATIM_BASE = "https://nominatim.openstreetmap.org/search";
const CACHE_KEY = "tehran_metro_cache_v2";
let cache = JSON.parse(localStorage.getItem(CACHE_KEY) || "{}");
const map = L.map("map").setView([35.6892, 51.3890], 12);
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19,
attribution: "© OpenStreetMap contributors"
}).addTo(map);
const markers = new Map();
const markerGroup = L.featureGroup().addTo(map);
async function geocode(name) {
if (cache[name]) return cache[name];
const url = `${NOMINATIM_BASE}?q=${encodeURIComponent(name.replace("ایستگاه متروی", "مترو") + ", تهران، ایران")}&format=json&limit=1`;
const res = await fetch(url);
const d = await res.json();
if (d && d[0]) {
cache[name] = { lat: +d[0].lat, lon: +d[0].lon };
localStorage.setItem(CACHE_KEY, JSON.stringify(cache));
return cache[name];
}
return null;
}
async function ensureMarker(st) {
if (markers.has(st.en)) return markers.get(st.en);
const c = await geocode(st.en) || await geocode(st.fa);
if (!c) return;
const m = L.marker([c.lat, c.lon]).addTo(markerGroup)
.bindPopup(`<b>${st.fa}</b><br>${st.en}`);
markers.set(st.en, m);
}
function normalize(str) {
return str.replace(/[آأإا]/g, "ا").replace(/[يى]/g, "ی").toLowerCase();
}
function smartMatch(s, q) {
if (!q) return true;
const en = s.en.toLowerCase();
const fa = normalize(s.fa);
const query = normalize(q);
return en.includes(query) || fa.includes(query);
}
function renderList(q = "") {
const list = document.getElementById("stationsList");
list.innerHTML = "";
STATIONS.filter(s => smartMatch(s, q)).forEach(st => {
const div = document.createElement("div");
div.className = "station-item";
div.innerHTML = `<div class="station-name">${st.fa}</div><div class="station-sub">${st.en}</div>`;
div.onclick = async () => {
await ensureMarker(st);
const m = markers.get(st.en);
if (m) {
map.setView(m.getLatLng(), 16);
m.openPopup();
}
};
list.appendChild(div);
});
}
document.getElementById("searchBtn").onclick = () => renderList(document.getElementById("q").value);
document.getElementById("q").onkeyup = e => renderList(e.target.value);
renderList();