Vikipedija
isvwiki
https://isv.wikipedia.org/wiki/Glavna_stranica
MediaWiki 1.48.0-wmf.3
first-letter
Media
Special
Besěda
Koristnik
Besěda s koristnikom
Vikipedija
Besěda Vikipedije
Fajl
Besěda o fajlu
MediaWiki
Besěda o MediaWiki
Šablon
Besěda o šablonu
Pomoč
Besěda o pomoči
Kategorija
Besěda o kategoriji
TimedText
TimedText talk
Modul
Besěda modula
Event
Event talk
Koristnik:Ilja isv/pěskovišče
2
2830
49240
49235
2026-11-11T07:43:27Z
Ilja isv
10
49240
wikitext
text/x-wiki
{{Začetok|data=July 2026}}
{{Wikidata Infobox}}
{{#invoke:Wikidata|getValue|P154}}
<code><nowiki>{{UI prěvod|data={{subst:#timel: d xg Y H:i||isv}} {{-|({{subst:#timel: T}})}}|izpraviti do = {{subst:#timel: d xg Y H:i| +2 months|isv}} {{-|({{subst:#timel: T}})}}}}}</nowiki></code>
{{Short description|Canal in Kazakhstan}}
{{Coord|51|59|38|N|76|59|27|E|region:KZ_type:waterbody|display=title}}
{{Kartka kanal
|name = Irtysh–Karaganda Canal<br /><small>Ертіс-Қарағанды каналы</small>
|image = Irtysh-Karaganda.PNG
|image_size = 280px
|image_caption =
|mapframe = yes
|mapframe-zoom = 6
|former_names =
|modern_name =
|coordinates =
|other_engineer =
|date_act =
|date_began = {{Start date and age|df=yes|1962}}
|date_use =
|date_completed = {{End date and age|df=yes|1974}}
|date_extended =
|date_closed =
|creator =
|date_restored =
|len =
|len_in =
|original_boat_length =
|original_boat_length_in =
|len_note =
|beam_m =
|original_beam =
|original_beam_in =
|beam_note =
|start_point = Near [[Aksu, Kazakhstan|Aksu]]
|original_start =
|start_note =
|end_point = [[Karaganda]]
|original_end =
|end_note =
|branch =
|branch_of =
|connects_to =
|locks =
|original_num_locks =
|lock_note =
|length_km = 451
|original_length_km =
|elev =
|elev_note =
|status =
|navigation_authority =
|max_boat_draft =
| module =
}}
'''Kanal Irtyš–Karaganda''' ({{Jezyky|kk|Ертіс-Қарағанды каналы}}, {{-|''Ertıs-Qarağandy kanaly''}}; {{Jezyky|ru|Канал Иртыш — Караганда}}) jest irigacijnym kanalom v [[Kazahstan]]u, on sjedinjaje siberijsku rěku [[Irtyš]] s [[Karaganda|Karagandoju]], glavnym promyslnym centrom sevěro-centralnogo Kazahstana. Po razpadanju [[Sovětsky Sojuz|Sovětskogo Sojuza]] kanal se oficialno dobyl ime Kanala Kanyša Satpajeva ({{jezyky|ru|Канал имени Каныша Сатпаева}}) po imenu kazahskogo geologa [[Kanyš Satpayev|Kanyša Satpajeva]]. Kanal jest jedinstvenouju realizovanoju čestju projekta "[[Povrat rěk|Povrat siberijskyh rěk]]", ktory se široko diskutoval v SSSR v {{-|XX}}. stolětju.
==Opis==
[[Fajl: Канал Иртыш-Караганда - panoramio (1).jpg|thumb|300px|left|Panorama kanala Irtyš-Karaganda]]
Kanal počinaje se v koordinatah {{coord|51|59|38|N|76|59|27|E|}}, k jugu od grada [[Aksu, Kazakhstan|Aksu]] (raněje Jermak), kde on zabiraje vodu iz jednoj odvětvy rěky Irtyš. Kanal beži 451 km<ref>[http://encyclopedia2.thefreedictionary.com/Irtysh-Karaganda+Canal Kanal Irtyš-Karaganda] v [[Velika sovětska enciklopedija|Velikoj sovětskoj enciklopediji]], 1979</ref> glavno na zapad, jugo=zapad ili jug, dosegajuči promyslovogo regiona na sevěro-iztočnyh okrajinah Karagandy v koordinatah {{coord|49|58|22|N|73|15|49|E|display=inline|type:landmark}} (lokalitet Kokpekti), kde jego voda vpolno odhodi do podzemnyh truboprovodov.
Na svojem putu kanal prohodi črez mnogočislne vodojemy (Ekibastuzsky vodojem ({{coord|51|49|00|N|75|13|00|E|display=inline|type:landmark}}, okolo 10 km na sevěr od [[Ekibastuz|Ekibastuza]]), i takože druge vodojemy v koordinatah {{coord|51|48|00|N|74|38|00|E|display=inline|type:landmark}}, {{coord|51|28|00|N|74|21|00|E|display=inline|type:landmark}}, i t.d.).
Kanal prěkryžuje [[Rěka Nura (Kazahstan)|rěku Nura]] v točkě {{coord|50|5|26|N|73|22|40|E|display=inline|type:landmark}}, kde, věrojetno, jest izdělan tunel. Čest vody kanala jest napravjena v Nuru (žlebom pod damboju v koprdinatah {{coord|50|5|30|N|73|22|37|E|display=inline|type:landmark}}), da by napolnjati tutu rěku.
Zatože Karaganda se nahodi v vysšej vyšině, než Irtyš, kanal imaje 22 nasosnyh stancij, vozdvigajučih vodu cělkovo na 475 m.<ref>{{citation
|first=M. I. |last=L'vovich
|title=World Water Resources and Their Future
|year=1979
|publisher=American Geophysical Union
|url= https://books.google.com/books?id=TxJUOqTKtAIC&pg=PA344
|page=344}}</ref><ref>{{citation
|editor-first=Yoginder K. |editor-last=Alagh|editor2-first= Ganesh |editor2-last=Pangare|editor3-first= Biksham |editor3-last=Gujja
|publisher=Academic Foundation |year=2006
|isbn=8171885209
|title=Interlinking of Rivers in India: Overview and Ken-Betwa Link
|url= https://books.google.com/books?id=cRzAKkRBok4C&pg=PA70
|page=70}}</ref>
==Historija==
The construction of the canal started in 1962. It was put to use by 1968 and fully completed by 1974.
In the early 21st century, a pipeline was built from the canal to the [[Ishim River]], to supply Kazakhstan's capital, [[Astana]] with water.
As of 2013, proposals are floated in Kazakhstan about either extending the Irtysh–Karaganda Canal all the way to the Ishim River upstream of Astana or building a new canal between the Irtysh and Astana.<ref>[http://en.tengrinews.kz/industry_infrastructure/Kazakhstan-considering-a-water-canal-to-link-the-Irtysh-River-to-the-Ishim-River-23149/ Kazakhstan considering a water canal to link the Irtysh River to the Ishim River across Astana], 2013-10-07</ref>
According to a report published in 2013, the canal presently operates at only about one-half of its full capacity.<ref>{{citation
|url=http://www.group-global.org/lecture/view/2223
|title=Adapting of fisheries management to the changing Irtysh water basin hydrological regime
|last=Kulikov
|first=Evgeny Vyacheslavovich (Куликов Евгений Вячеславович)
|date=2013-08-23
|access-date=2013-09-21
|archive-url=https://web.archive.org/web/20130925111250/http://www.group-global.org/lecture/view/2223
|archive-date=2013-09-25
|url-status=dead
}}</ref>
==Notes==
{{Reflist}}
== External links ==
*{{Commons category inline}}
{{Authority control}}
{{DEFAULTSORT:Irtysh-Karaganda Canal}}
[[Category:Irtysh basin|CIrtysh-Karaganda]]
[[Category:Canals in Kazakhstan]]
[[Category:Irrigation canals]]
[[Category:Canals opened in 1968]]
[[Category:Canals opened in 1974]]
{{KaragandaRegion-geo-stub}}
==Svezane stranicy==
*[[Alkalijne metaly]]
*[[Berilij]]
== Primětky ==
{{Small|<references group="lower-alpha"/>}}
== Iztočniky ==
{{Iztočniky}}
==Zdroje v inyh viki==
{{Prěvod|simple|Lithium}}
[[Kategorija:Hemija]]
[[Kategorija:Hemične elementy]]
[[Kategorija:Metaly]]
{{Ne zaměšivati s|Litijova baterija}}
[[Fajl:LiIon-18650-match.jpg|thumb|275px|Litij-ionovy akumulator cilindričny, tiporazměr 18650]]
[[Fajl:A battery, 7, ubt.jpeg|thumb|Litij-ionovy akumulator mobilnogo telefona {{-|Siemens}}, prizmatičny]]
'''[[Litij]][[ion|-ionovy]] akumulator''' ({{-|Li-ion}}) je tipom [[Električny akumulator|akumulatora]] [[Električnost|električnosti]], ktory priměnjaje se v [[Nizkovoltažny akumulator|nizkovoltažnyh]] i [[Tegovy akumulator|tegovyh]] akumulatornyh baterijah vozov, v [[Sistemy akumulacije energije|sistemah akumulacije energije]], takože kako zdroj energije v devajsah kako [[Mobilny telefon|mobilne telefony]], [[laptop]]y i dr.
V lětu 2019 [[Michael Stanley Whittingham|{{-|Whittingham|Уитингем}}]], [[John Goodenough|{{-|Goodenough|Гудинаф}}]] i [[Akira Yoshino|{{-|Yoshino|Јошино}}]] sut iziskali [[Nobeleva nagrada v hemiji|Nobelevu nagradu v hemiji]] s formulacijeju "Za razvoj litij-ionovyh akumulatorov".
== Historija ==
{{Citatny blok|align=center|Glavny zdroj: {{Cite magazine |url=https://www.nkj.ru/archive/articles/37454/ |author=Татьяна Кулова |title=Аккумуляторы, изменившие жизнь |year=2019 |lang=ru |magazine=[[Наука и жизнь]] |issue=12 |pages=2—7}}}}
Najprvo principialna možlivost stvorjenja [[litij|litijevyh]] akumulatorov na osnově sposobnosti [[disulfid titana|disulfida titana]] či [[disulfid molibden|disulfida molibdena]] priključati do sebe iony litija pri iznabivanju akumulatora i ekstraktovati jih pri nabivanju byla jest pokazana v lětu 1970 [[Michael Stanley Whittingham|Majklom {{-|Whittinghamom|Уитингемом}}]]. Sučstvenymi nedostatkami takyh akumulatorov javjali se nizky voltaž 2.37 V i vysoka požarna nebezpečnost vslěd stvarjanja dendritov metaličnogo litija, ktore sut zamykali elektrody.
Sučasany variant litij-ionovogo akumulatora s anodom iz [[Vuglerod|grafita]] i katodom iz kobaltita litija byl jest iznahodženy v lětu 1991 [[Akira Joshino|Akiroju {{-|Joshino|Jošino}}]]. Prvy litij-ionovy akumulator po jego patentu jest izpustila korporacija {{-|[[Sony]]}} v istom lětu.
Tutčasno vedut se izslědovanja na poiskanje materialov na osnově [[Kremnij|kremnija]] ([[Kremnij-vugoljny akumulator|kremnij-vugoljny akumulator]]) i [[Fosfor|fosfora]], zabezpečivajučih povyšenu sposobnost interkaliranja [[Ion|ionov]] litija, i takože zaměny ionov litija [[Natrij-ionovy akumulator|na iony natrija]].
Druge izslědovanja směnšajut efekt starěnja i podolžajut dobu životnosti. Napriměr, izkoristanje tvoriva {{lang|en|bis-imino-acenaphthenequinone-Paraphenylene (BP)}} dozvoli shranjati 95 procentov vměstilosti akumulatora daže po 1700 ciklah nabivanja-iznabivanja.<ref name="sb0505">{{Cite web |lang=en |url=https://pubs.acs.org/doi/10.1021/acsaem.0c02742 |title=Bis-imino-acenaphthenequinone-Paraphenylene-Type Condensation Copolymer Binder for Ultralong Cyclable Lithium-Ion Rechargeable Batteries |first=Agman |last=Gupta |website=ACS Applied Energy Materials |date=2021-03-22 |pages=2231–2240 |publisher=pubs.acs.org |access-date=2021-05-05 |archive-date=2021-04-08 |archive-url=https://web.archive.org/web/20210408172047/https://pubs.acs.org/doi/10.1021/acsaem.0c02742 |url-status=live }}</ref><ref name="sb0505-2">{{Cite web |lang=ru |url=https://3dnews.ru/1038734/yaponskie-uchyonie-pridumali-akkumulyator-sposobniy-prorabotat-5-let-pochti-bez-poteri-yomkosti |title=Японские учёные придумали аккумулятор, способный проработать 5 лет почти без потери ёмкости |website=3dnews.ru |date=2021-05-05 |publisher=3dnews.ru |access-date=2021-05-05 |archive-date=2021-05-05 |archive-url=https://web.archive.org/web/20210505110457/https://3dnews.ru/1038734/yaponskie-uchyonie-pridumali-akkumulyator-sposobniy-prorabotat-5-let-pochti-bez-poteri-yomkosti |url-status=live }}</ref>
V lětu 1991 v sumě vměstilost litij-ionovyh akumulatorov byla 130 k{{-|W|Вт}}·č, ale v lětu 2025 uže 1.59 T{{-|W|Вт}}·č<ref>[http://kvant.mccme.ru/pdf/2023/2023-04.pdf Про запас (о развитии систем накопления энергии) . С Минаев] {{Wayback|url=http://kvant.mccme.ru/pdf/2023/2023-04.pdf |date=20230616183538 }}. Квант 2023 г , 4 Номер</ref><ref>[https://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F:%D0%9B%D0%B8%D1%82%D0%B8%D0%B9-%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D0%B0%D0%BA%D0%BA%D1%83%D0%BC%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D1%8B_(%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D0%B9_%D1%80%D1%8B%D0%BD%D0%BE%D0%BA) {{-|Литий-ионные аккумуляторы (мировой рынок)}}]</ref>
== Типы литий-ионных аккумуляторов ==
В зависимости от химического состава и устройства (LMO, LCO, NCA, NMC, [[LiFePO4|LFP]], LTO,…), литий-ионные разделяются на типы, сильно различающиеся потребительскими качествами.
=== Литий-кобальтовые (ICR) ===
Эта разновидность имеет самую высокую ёмкость, но требовательны к условиям работы, имеют весьма ограниченный ресурс. Рабочий диапазон напряжений — от 3 до 4,2 В. Самая высокая удельная энергоемкость — до 250 Втч/кг, пиковый ток разряда — не более двух ёмкостей (то есть аккумулятор 2 Ач имеет разрешённый ток 4 А), длительный ток разряда — не более одной ёмкости.
Температура длительного хранения аккумуляторов — −5 °C при 40-50 % заряда{{нет АИ|17|01|2024}}. Литий-кобальтовые аккумуляторы взрывоопасны и могут воспламеняться при перегреве или вследствие глубокого разряда. По этим причинам они обычно снабжаются защитной платой и имеют маркировку Protected. Напряжение разряда — не ниже 3 В. Взрывоопасны при повреждении корпуса, быстро стареют (средний срок жизни — 3-5 лет, в циклах «заряд-разряд» — не более 500). Нежелательна зарядка большим током. Крайне токсичны при воспламенении.
=== Литий-никель-марганец-кобальт-оксидный (NMC) ===
{{Основная статья|Литий-никель-марганец-кобальт-оксидный аккумулятор}}
Аккумуляторы номинальным напряжением 3,7 вольта, диапазон от 2,6 до 4,3 вольта, плотность энергии до 200 Втч/кг, токоотдача до двух ёмкостей, ресурс при разряде до минимума более 1000 циклов, при частичном 5000 циклов и более. Взрывопожаробезопасность высокая, высокая теплостойкость<ref>{{Cite web|url=https://acums.ru/akkumulyatory/nmc-akkumulyatory|title=Li NMC аккумуляторы: литий-никель-марганец-кобальт-оксидный, характеристики, новый тип лития|lang=ru-RU|first=Акум|last=Эксперт|website=Акумы.ру|date=2022-09-27|access-date=2024-01-15|archive-url=https://web.archive.org/web/20240115211220/https://acums.ru/akkumulyatory/nmc-akkumulyatory|archive-date=2024-01-15}}</ref>.
=== Литий-никель-кобальт-алюминий-оксидный (NCA) ===
{{Основная статья|Литий-никель-кобальт-алюминий-оксидный аккумулятор}}
Удельная плотность энергии в аккумуляторах данного типа: 200—260 ([[Ватт (единица измерения)|Вт]]•[[Час|ч]]/[[Килограмм|кг]])<ref name="Ref01">{{Cite web |url=https://best-energy.com.ua/support/battery/bu-205#battery-bu-205-050 |title=Литий-никель-кобальт-алюминий-оксидный аккумулятор. |access-date=2020-09-27 |archive-date=2020-10-23 |archive-url=https://web.archive.org/web/20201023001209/https://best-energy.com.ua/support/battery/bu-205#battery-bu-205-050 |url-status=live }}</ref>. Выдерживают до 500 циклов зарядки-разрядки.
Преимуществами аккумуляторов данного типа являются высокая удельная энергоемкость, длительный срок службы и высокая удельная мощность.<ref>''Кочеров А. В., Курмакаев Д. Р., Сизов А. Ю., Туманов А. А., Федосова Л. О.'' [https://elibrary.ru/item.asp?id=35196938 Выбор типа электрохимической системы аккумулятора электромобиля LCV-сегмента] // [[Нижегородский государственный технический университет|НГТУ]], Труды НГТУ им. Р. Е. Алексеева, номер: 2(121), год: 2018, с: 156—161</ref> Они применяются в промышленности, электротранспорте, медицинской технике.
=== Литий-марганцевые (IMR или INR) ===
Более долговечны и безопасны, чем кобальтовые, допустима зарядка большим током. Рабочий диапазон напряжений — от 2,5 до 4,2 В. Удельная энергоемкость — 140—150 Втч/кг. Ресурс — порядка 5-6 лет — до 1000 циклов «заряд-разряд». Высокий ток под нагрузкой — до 5 ёмкостей. Предельная граница разряда — 2,5 В, однако возможно снижение ресурса. INR-аккумуляторы редко снабжают защитной платой, но зарядная цепь всегда имеет ограничение по напряжению. Неработоспособны ниже −10 °C. Достаточно безопасны в использовании, не взрываются и не воспламеняются. Имеют низкий саморазряд.
=== Литий железофосфатные аккумуляторы (LiFePO4, LiFe, LFP, IFR) ===
{{Основная статья|Литий-железо-фосфатный аккумулятор}}
Рабочий диапазон напряжений — от 2 до 3,65 В, номинальное напряжение — 3,2 В. Удельная энергоемкость — примерно 150 Втч/кг. Ресурс — 10-20 лет, примерно 1500-3000 циклов «заряд-разряд» (до 8000 в мягких условиях). Высокий ток под нагрузкой (до 10 ёмкостей) и стабильное напряжение разряда идеальны для электромобилей,
велосипедов, и подобных применений. Разряд вблизи нижней границы напряжения (2 В) может снижать ресурс. Допустима зарядка большим током с сохранением безопасности. При самых тяжёлых условиях эксплуатации не выделяют газа, не взрываются и не возгораются.
=== Литий-титанатные аккумуляторы (LTO) ===
{{Основная статья|Литий-титанатный аккумулятор}}
Наивысшая долговечность и широкий температурный интервал работы. Рабочий диапазон напряжений и от 1,6 до 2,7 В, номинальное напряжение — 2,3 В. Удельная энергоёмкость — примерно 100 Втч/кг. Ресурс — более 15 000 циклов «заряд-разряд». Температурный диапазон и от −60 °C до +60 °C. Имеет очень низкое сопротивление, позволяющее использовать сверхбыстрый заряд, и низкий саморазряд, примерно 0,02 % в сутки.
== Технические показатели ==
[[Fajl:Skizze Balancer.png|thumb|При использовании литий-ионных аккумуляторов в составе батарей без балансирующего устройства часть из них окажется переразряженной (B) при работе батареи или перезаряженной (C) либо не дозаряженной (D) до номинальной ёмкости во время зарядки батареи]] Основные показатели элементов, зависящие от химсостава, находятся в следующих пределах:
* [[Электрическое напряжение|напряжение]] единичного элемента:
** максимальное: 4,2 [[Вольт (единица измерения)|В]] (или 4,35/4,40 В для высоковольтных);<ref>{{Cite web |lang=ru |url=https://www.ixbt.com/live/supply/li-ion-435v-vs-420v-skolko-teryaem-test-sanyo-ur18650zta.html |title=Li-ion 4.35V vs 4.20V сколько теряем? Тест SANYO UR18650ZTA. / Зарядки, пауэрбанки, провода и переходники / iXBT Live |date=2018-08-26 |publisher=iXBT Live |access-date=2019-10-18 |archive-date=2019-10-18 |archive-url=https://web.archive.org/web/20191018063726/https://www.ixbt.com/live/supply/li-ion-435v-vs-420v-skolko-teryaem-test-sanyo-ur18650zta.html |url-status=live }}</ref>
** минимальное: 2,5 В (или 2,8/3,0 В для высоковольтных);
* удельная [[энергоёмкость]]: 110…325 [[Киловатт-час|Вт·ч]]/[[кг]];<ref>{{Cite web|url=https://www.molicel.com/newsroom/molicel-launches-inr-21700-m65a-and-inr-21700-p60b-pioneering-market-leading-power-for-e-bikes-and-light-electric-vehicles/|title=Molicel Launches INR-21700-M65A and INR-21700-P60B, Pioneering Market Leading Power for E-bikes and light electric vehicles|lang=en|date=2025-06-24|publisher=Newsroom molicell|archive-url=https://web.archive.org/web/20250629213754/https://www.molicel.com/newsroom/molicel-launches-inr-21700-m65a-and-inr-21700-p60b-pioneering-market-leading-power-for-e-bikes-and-light-electric-vehicles/|archive-date=2025-06-29|access-date=2025-07-25|url-status=live}}</ref>
* [[внутреннее сопротивление]]: 4…15 [[милли-|м]][[Ом (единица измерения)|Ом]];<ref>{{Cite web |lang=ru |url=http://www.ecigtalk.ru/forum/f33/t192678.html |title=Sony VTC6A и VTC6 с одинаковыми Matrix-кодами - результаты тестов |publisher=ecigtalk.ru |access-date=2019-10-18 |archive-date=2019-10-18 |archive-url=https://web.archive.org/web/20191018063305/http://www.ecigtalk.ru/forum/f33/t192678.html |url-status=live }}</ref>
* число циклов заряд-разряд до снижения [[Ёмкостный накопитель энергии|ёмкости]] до 80 %: 600;
* время быстрого заряда: 1 [[час]];
* [[саморазряд]] зависит от температуры хранения и степени заряда. При температуре 25 °C и заряде 100 % ≈1,6 % в [[месяц]];
* [[Сила тока|ток]] [[Нагрузка (значения)|нагрузки]] относительно ёмкости '''С,''' представленной в [[Ампер-час|А·ч]]:
** постоянный: до 5'''С''';
** импульсный: до 50'''С''';
** оптимальный: до 1'''С''';
* диапазон рабочих [[Температура|температур]]: от −20 °C до +60 °C (оптимальная +23 °C);<ref>{{Cite web |url=https://telit.co.rs/PDFDokumenti/Li-Ion/INR18650-25R.pdf |title=Samsung INR18650-25R Specification |access-date=2020-04-01 |archive-date=2020-10-30 |archive-url=https://web.archive.org/web/20201030193340/https://telit.co.rs/PDFDokumenti/Li-Ion/INR18650-25R.pdf |url-status=live }}</ref>
== Защитные устройства аккумулятора ==
[[Fajl:Lithium Ionen Akku Überwachungselektronik.jpg|thumb|left|Контроллер заряда/разряда ([[Печатная плата|плата]] защиты) цилиндрического литий-ионного аккумулятора, конструкционно припаянный к отрицательному контакту аккумулятора и обратной фольгированной стороной выполняющий его функции. На снимке частично демонтирован и отсоединён от проводника, идущего к положительному контакту аккумулятора]]
Почти всегда в корпус аккумулятора встроен [[Контроллер заряда аккумуляторов|контроллер]] (или ''{{-|PCM}}-плата'' ({{lang|en|Protection Circuit Module}})), который управляет зарядкой и защищает аккумулятор от превышения напряжения заряда, чрезмерного разряда и превышения температуры, приводящих к преждевременной деградации или разрушению. Также этот контроллер может ограничивать ток потребления, защищать от [[Короткое замыкание|короткого замыкания]]. Тем не менее, надо учитывать, что не все аккумуляторы снабжаются защитой. Производители могут не устанавливать её в целях снижения стоимости, веса, а также в устройствах, в которых встроен контроллер защиты, в аккумуляторных батареях (например, ноутбуков) используются аккумуляторы без встроенной платы защиты<ref>''Н. Бровка, О. Янченков'' [https://cyberleninka.ru/article/n/primenenie-spetsializirovannyh-mikroprotsessorov-dlya-postroeniya-shem-kontrolya-i-zaschity-litiy-ionnyh-i-litiy-polimernyh {{-|Применение специализированных микропроцессоров для построения схем контроля и защиты литий-ионных и литий-полимерных аккумуляторных батарей}}] {{Wayback|url=https://cyberleninka.ru/article/n/primenenie-spetsializirovannyh-mikroprotsessorov-dlya-postroeniya-shem-kontrolya-i-zaschity-litiy-ionnyh-i-litiy-polimernyh |date=20190828235251 }} {{-|// Журнал «Компоненты и Технологии». — № 3, 2007 г. С. 132—135. ISSN 2079-6811.}}</ref>.
Литиевые аккумуляторы имеют специальные требования при подключении нескольких ячеек [[Последовательное и параллельное соединение|последовательно]]. Зарядные устройства для таких многосоставных аккумуляторов с ячейками или сами аккумуляторные [[Батарея (электротехника)|батареи]] снабжаются схемой балансировки ячеек. Смысл балансировки в том, что электрические свойства ячеек могут немного различаться, и какая-то ячейка достигнет полного заряда/разряда раньше других. При этом необходимо прекратить заряд этой ячейки, продолжая заряжать остальные, так как перезаряд литий-ионных аккумуляторов выводит их из строя. Эту функцию выполняет специальный узел — {{iw|Балансировочная плата аккумуляторов|балансир||Battery balancing}} (или ''BMS-плата'' ({{lang-en|Battery Management System}})<ref>[https://www.youtube.com/watch?v=Si-Nm4ClEjE Обзор BMS контроллера заряда литий-ионных аккумуляторов 18650 3.7В] {{Wayback|url=https://www.youtube.com/watch?v=Si-Nm4ClEjE |date=20190916133541 }} на [[YouTube]]</ref>). Он [[шунт]]ирует заряженную ячейку так, чтобы ток заряда шёл мимо неё. Балансиры одновременно выполняют как функцию платы защиты в отношении каждого из аккумуляторов, так и батареи в целом<ref>''Сердечный Д. В., Томашевский Ю. Б.'' [https://cyberleninka.ru/article/n/upravlenie-protsessom-zaryada-mnogoelementnyh-litiy-ionnyh-akkumulyatornyh-batarey Управление процессом заряда многоэлементных литий-ионных аккумуляторных батарей] {{Wayback|url=https://cyberleninka.ru/article/n/upravlenie-protsessom-zaryada-mnogoelementnyh-litiy-ionnyh-akkumulyatornyh-batarey |date=20190828231910 }} / Научная статья // Журнал «Измерение. Мониторинг. Управление. Контроль». — № 3 (21), 2017 г. С. 115—123. УДК 621.314. DOI 10.21685/2307-5538-2017-3-16. ISSN 1999-5458.</ref><ref>''Сазонов И. Е., Лукьяненко М. В.'' [https://cyberleninka.ru/article/n/vyravnivanie-zaryada-v-litiy-ionnyh-akkumulyatornyh-batareyah Выравнивание заряда в литий-ионных аккумуляторных батареях] {{Wayback|url=https://cyberleninka.ru/article/n/vyravnivanie-zaryada-v-litiy-ionnyh-akkumulyatornyh-batareyah |date=20190828231907 }} / Научная статья // Сборник материалов IX Междунарародной научно-практической конференции, посвящённой [[День космонавтики|Дню космонавтики]]. «Актуальные проблемы авиации и космонавтики» [Электронныйресурс]. Красноярск: СибГУ им. М. Ф. Решетнева — № 9, т. 1, 2013 г. С. 204. УДК 537.22. ISSN 1999-5458.</ref>.
Зарядные устройства могут поддерживать конечное напряжение заряда в диапазоне 4,15—4,25 [[Вольт (единица измерения)|В]].
{{Внешние медиафайлы
|topic = Варианты Li-ion аккумуляторов с напряжением 1,5 В
|font-size =
|align =
|width = 230px
|image1 = [https://ae01.alicdn.com/kf/HTB1ylB2ajDuK1Rjy1zjq6zraFXaV.jpg Со встроенным контроллером и разъёмом микро-USB<ref>[https://www.youtube.com/watch?v=uM0UQRyIpsc] {{Wayback|url=https://www.youtube.com/watch?v=uM0UQRyIpsc |date=20190916133542 }}.</ref><ref>[https://www.youtube.com/watch?v=wzWlVSSL1q4] {{Wayback|url=https://www.youtube.com/watch?v=wzWlVSSL1q4 |date=20190916133530 }}.</ref>]
|image2 = [https://ae01.alicdn.com/kf/HTB1Fxi8h5FTMKJjSZFAq6AkJpXaV/Etinesan-3000mWh-AA-1-5-V.jpg С двойным преобразованием напряжения (при зарядке/разрядке) и требующие специального зарядного устройства<ref>[https://www.youtube.com/watch?v=GJmmI2WFoW8] {{Wayback|url=https://www.youtube.com/watch?v=GJmmI2WFoW8 |date=20190916133533 }}.</ref><ref>{{Cite web |url=https://www.youtube.com/watch?v=3QYn6m_Tlgw |title=LITHIUM AA 1 5 Volt BATTERIES - YouTube<!-- Заголовок добавлен ботом --> |access-date=2019-08-29 |archive-date=2019-09-16 |archive-url=https://web.archive.org/web/20190916133541/https://www.youtube.com/watch?v=3QYn6m_Tlgw&gl=US&hl=en |url-status=live }}</ref><ref>{{Cite web |url=https://ae01.alicdn.com/kf/HTB1G3CHXfc3T1VjSZLeq6zZsVXaf.jpg |title=Архивированная копия |access-date=2019-08-29 |archive-date=2019-08-29 |archive-url=https://web.archive.org/web/20190829051045/https://ae01.alicdn.com/kf/HTB1G3CHXfc3T1VjSZLeq6zZsVXaf.jpg |url-status=live }}</ref>]
|image3 = [https://ae01.alicdn.com/kf/HTB16gVkXgvGK1JjSspiq6A96FXaH/KENTLI-4-3000mWh-aa-1-5.jpg С двойным положительным контактом: 1,5 В — центральный рабочий, 3,7 В — по периферии для зарядки специальным зарядным устройством либо через переходник (желобчатый или трубчатый) зарядным устройством для Li-ion<ref>[https://www.youtube.com/watch?v=DwPfkfOxZIQ] {{Wayback|url=https://www.youtube.com/watch?v=DwPfkfOxZIQ |date=20190916133530 }}.</ref><ref>[https://www.youtube.com/watch?v=1rru1qUk9Sc] {{Wayback|url=https://www.youtube.com/watch?v=1rru1qUk9Sc |date=20190916133547 }}.</ref>]
}}
Существуют литий-ионные и литий-полимерные аккумуляторы типоразмеров АА и ААА с напряжением 1,5 В. Они имеют не только схему защиты, но также встроенный электронный [[преобразователь напряжения]] ({{lang-en|DC-DC converter}}). Отличие таких аккумуляторов — стабилизированное напряжение на контактах в 1,5 В вне зависимости от ''рабочего напряжения'' самой ячейки аккумулятора и его моментальное обнуление, когда литиевая ячейка разряжается до нижнего допустимого предела и срабатывает защита от чрезмерного разряда. Такие аккумуляторы можно спутать с похожими по размерам аккумуляторами 14500 и 10440 напряжением 3,7 В, а также с незаряжаемыми одноразовыми [[Литиевый элемент питания|литиевыми элементами питания]]. Все они различаются маркировкой.
Из-за высокой [[Пожароопасность|пожароопасности]] литиевых батарей предпринимаются попытки перехода на БМС с полностью открытым исходным кодом, например, проект «foxBMS».<ref>{{Cite web |url=https://foxbms.org/ |title=foxBMS.org |access-date=2023-07-26 |archive-date=2023-07-26 |archive-url=https://web.archive.org/web/20230726075025/https://foxbms.org/ |url-status=live }}</ref>
== Ustroj ==
[[File:Shema Litij-ionovogo akumulatora.svg|thumb|Litij-ionovy akumulator. Shema]]
Litij-ionovy akumulator skladaje se iz elektrodov (katodnogo materiala na [[Aluminij|aluminijevoj]] foliji i anodnogo materiala na [[Měd|mědnoj]] foliji), razděljenyh poronitym separatorom, orošenym elektrolitom. Paket elektrodov jest poměščen do neprodyšnogo korpusa, katody i anody sut prisjednjene k terminalam za nimanje toka. Korpus poněkogda imaje zaščitny ventil, skydyvajučim vnutrny pritisk pri avarijnyh situacijah ili narušenju uslovij eksploatacije. Litij-ionove akumulatory različajut se tipom izkoristanogo katodnogo materiala. Prěnosnikom naboja v litij-ionovom akumulatoru jest pozitivno nabity ion litija, ktory imaje sposoobnost vsadžati se (interkalirovati) v kristaličnu rešetku drugyh materialov (napriklad, [[Grafit|grafita]], [[Oksid|oksidov]] i [[Solj|soljij]] [[Metal|metalov]]) s obrazovanjem hemičnogo sveza, napriklad: v grafit s obrazovanjem {{Hem2|LiC6}}, v oksidy s obrazovanjem ({{Hem2|LiMnO2}}) i v solji metalov s obrazovanjem ({{Hem2|LiMn_{R}O_{N}|}}).
Prvonačelno kako negativne plošče jest koristal se metaličny litij, potom [[kamenovugoljny koks]]. Dalje sut počeli priměnjati grafit. Priměnjenje oksidov kobalta dozvoljaje akumulatoram rabotati pri nizšyh temperaturah, povyšaje kolikost ciklov nabivanja/iznabivanja jednogo akumulatora. Razprostanjenje litij-želězofosfatnyh akumulatorov imaje byti blagodare jihnoj odnositelno nizkoju cěně. Litij-ionove akumulatory priměnjajut jedino spoločno s sistemoju uptavjenja akumulatorom {{-|BMS (battery management system)}} I specialnym ustrojstvom nabivanja/iznabivanja.
V sučasnosti v masovom proizvodstvu litij-ionovyh akumulatorov upotrěbjajut tri klasy katodnyh materialov:
* [[kobaltit litija]] {{Hem2|LiCoO2}} i tvrde raztvory na osnově izostrukturnogo s njim nikelata litija;
* litij-manganova špinel {{Hem2|LiMn2O4}};
* ferofosfat litija {{Hem2|LiFePO4}}.
Elektrohemične shemy litij-ionovyh akumulatorov:
* litij-kobaltove {{Hem2|LiCoO2 + 6C -> Li_{1-x}CoO2 + LiC6}};
* litij-ferofosfatne {{Hem2|LiFePO4 + 6C -> Li_{1-x}FePO_{4} + LiC6|}}.
Blagodare nizkomu samoiznabivanju i velikoj kolikosti ciklov nabivanja/iznabivanja, Li-ion akumulatory sut prědpočitane za priměnjenje v alternativnoj energetikě. Pri tom, pomimo sistemy BMS, oni zabezpěčivajut se [[Invertor (elektrotehnika)|invertorami]] (prěobražateljami električnosti).
== Преимущества ==
* Низкий саморазряд.
* Высокая токоотдача.
* Большое число циклов заряд-разряд.
* Не требуют обслуживания.
== Недостатки ==
Широко применяемые литий-ионные аккумуляторы при перезаряде, несоблюдении условий заряда или при механическом повреждении часто бывают чрезвычайно огнеопасными.
* Огнеопасны
* Теряют работоспособность при переразряде
* Теряют ёмкость на холоде
* Быстро деградируют от повышенных температур и представляют повышенную пожароопасность в жару
=== Ekologične problemy ===
Dobyvanje litija, osnovnogo elementa za akumulatory, pričinjaje važne ekologične problemy zatože ekstrakcija jednoj tony litija trěbuje 2 miliony litrov vody, čto privodi k zanečiščenju počvy i razrušanju biosistem. Proizvodstvo litij-ionovyh akumulatorov elektromobilov trěbuje o 50% věčě , чем на производство двигателей внутреннего сгорания. [[Кобальт]], еще один необходимый элемент, является опасным токсическим веществом в различных соединениях, что делает сложнее и дороже как производство аккумуляторов, так и их утилизацию. Утилизация аккумуляторов, содержащих платину, литий и другие элементы, может нанести ущерб окружающей среде. Имеющиеся технологии их переработки слишком энергоемки и дают низкокачественное сырье<ref>[https://roscongress.org/news/litij-ionnaja-lihoradka-rynok-akkumuljatorov-na-poroge-revoljutsii/ Литий-ионная лихорадка: рынок аккумуляторов на пороге революции]</ref>.
=== Взрывоопасность ===
[[Fajl:Lithium-ion batteries (form factor ENEL10, Li-42B, NP-45).jpg|thumb|Вздувшийся литий-ионный аккумулятор в плоском алюминиевом корпусе типоразмера ENEL10 (Li-42B, NP-45). Бумажная этикетка снята]]
[[Fajl:Felix-car-batteries-full.jpg|thumb|Литий-ионная аккумуляторная [[Батарея (электротехника)|батарея]] [[Гибридный автомобиль|гибридного автомобиля]]]]
Аккумуляторы Li-ion первого поколения были подвержены взрывному эффекту. Это объяснялось тем, что в них использовался анод из металлического лития, на котором в процессе многократных циклов зарядки/разрядки возникали пространственные образования ([[Дендрит (кристалл)|дендриты]]), приводящие к замыканию электродов и, как следствие, возгоранию или взрыву. Этот недостаток удалось окончательно устранить заменой материала анода на графит. Подобные процессы происходили и на катодах литий-ионных аккумуляторов на основе оксида кобальта при нарушении условий эксплуатации (перезарядке). Литий-ферро-фосфатные аккумуляторы полностью лишены этих недостатков.
Литиевые аккумуляторы изредка проявляют склонность к взрывному самовозгоранию.<ref>{{Cite web |url=http://www.vestifinance.ru/articles/24666 |title=Возгорания на Dreamliner связаны с аккумуляторами |access-date=2016-11-03 |archive-date=2016-11-04 |archive-url=https://web.archive.org/web/20161104075120/http://www.vestifinance.ru/articles/24666 |url-status=live }}</ref><ref>{{Cite web |url=http://4pda.to/2016/09/02/321656/ |title=Samsung отзывает Galaxy Note 7 из-за возможности возгорания |access-date=2016-11-03 |archive-date=2016-11-04 |archive-url=https://web.archive.org/web/20161104023424/http://4pda.ru/2016/09/02/321656/ |url-status=live }}</ref><ref>{{Cite web |url=https://lenta.ru/news/2016/11/04/tesla/ |title=Находившийся за рулем Tesla бывший агент ФБР погиб в ДТП |lang=ru |access-date=2016-11-04 |archive-date=2016-11-05 |archive-url=https://web.archive.org/web/20161105033609/https://lenta.ru/news/2016/11/04/tesla/ |url-status=live }}</ref> Интенсивность горения даже от миниатюрных аккумуляторов такова, что может приводить к тяжким последствиям.<ref>{{Cite web |url=http://www.motherjones.com/environment/2014/04/e-cigarettes-explode-fda-timeline |title=Should You Be Worried About Your E-Cigarette Exploding? |access-date=2016-11-03 |archive-date=2016-11-15 |archive-url=https://web.archive.org/web/20161115084937/http://www.motherjones.com/environment/2014/04/e-cigarettes-explode-fda-timeline |url-status=live }}</ref> Авиакомпании и международные организации принимают меры к ограничению перевозок литиевых аккумуляторов и устройств с ними на авиатранспорте.<ref>{{Cite web |url=https://lenta.ru/news/2016/09/28/samsungtablet/ |title=Лайнер экстренно сел из-за загоревшегося планшета Samsung |lang=ru |access-date=2016-11-03 |archive-date=2016-11-04 |archive-url=https://web.archive.org/web/20161104075652/https://lenta.ru/news/2016/09/28/samsungtablet/ |url-status=live }}</ref><ref>{{Cite web |url=http://www.iata.org/whatwedo/cargo/dgr/Documents/lithium-battery-update.pdf |title=Lithium Batteries as Cargo in 2016 Update III |access-date=2016-07-03 |archive-date=2016-09-10 |archive-url=https://web.archive.org/web/20160910064520/http://www.iata.org/whatwedo/cargo/dgr/Documents/lithium-battery-update.pdf |url-status=live }}</ref>
Самовозгорание литиевого аккумулятора очень плохо поддаётся тушению традиционными средствами. В процессе термического разгона неисправного или повреждённого аккумулятора происходит не только выделение запасённой электрической энергии, но и ряд химических реакций, выделяющих вещества для поддержания горения, горючие газы от электролита<ref>{{cite doi|10.1149/1.3515880}}</ref>, а также, в случае не LiFePO4-электродов<ref>{{cite doi|10.1016/j.jpowsour.2012.05.018}}</ref>, выделяется кислород. Потому вспыхнувший аккумулятор способен гореть без доступа воздуха и для его тушения непригодны средства изоляции от атмосферного кислорода. Целью тушения может быть лишь снижение температуры аккумулятора и предотвращение распространения пламени<ref>{{Cite web |url=http://www.powerinfo.ru/accumulator-liion.php |title=Литий-ионные (li-ion) аккумуляторы<!-- Заголовок добавлен ботом --> |access-date=2016-10-31 |archive-date=2016-11-01 |archive-url=https://web.archive.org/web/20161101035217/http://www.powerinfo.ru/accumulator-liion.php |url-status=live }}</ref><ref>{{Cite web |url=http://www.computerra.ru/84841/model-s-fire-facts/ |title=Гореть, а не тлеть! Что на самом деле случилось с электроседаном Tesla Motors? |access-date=2016-11-04 |archive-date=2016-11-03 |archive-url=https://web.archive.org/web/20161103024604/http://www.computerra.ru/84841/model-s-fire-facts/ |url-status=live }}</ref><ref>{{Cite web |url=https://best-energy.com.ua/support/battery/bu-304-a |title=Аспекты безопасности литий-ионных аккумуляторов |access-date=2016-11-04 |archive-date=2016-11-05 |archive-url=https://web.archive.org/web/20161105033033/https://best-energy.com.ua/support/battery/bu-304-a |url-status=live }}</ref>.
=== Эффект памяти ===
Традиционно считалось, что, в отличие от [[Ni-Cd]]- и [[Ni-MH]]-аккумуляторов, Li-Ion-аккумуляторы полностью избавлены от [[Эффект памяти аккумулятора|эффекта памяти]]. По результатам исследований учёных Института Пауля Шерера (Швейцария) в 2013 году этот эффект всё-таки был обнаружен, но оказался ничтожен.<ref>{{Cite web |lang=ru |url=http://www.psi.ch/media/memory-effect-now-also-found-in-lithium-ion-batteries |title=Paul Scherrer Institut (PSI) :: Memory effect now also found in lithium-ion batteries |archive-url=https://www.webcitation.org/6GWseiW22?url=http://www.psi.ch/media/memory-effect-now-also-found-in-lithium-ion-batteries |archive-date=2013-05-11 |access-date=2013-05-02 |url-status=live}}</ref>
Причиной его является то, что основой работы батареи являются процессы высвобождения и обратного захвата ионов лития, динамика которых ухудшается в случае неполной зарядки{{нет АИ|18|04|2026}}. Во время зарядки ионы лития один за другим покидают частицы литий-феррофосфата, размер которых составляет десятки микрометров. Катодный материал начинает разделяться на частицы с разным содержанием лития. Зарядка батареи происходит на фоне возрастания электрохимического потенциала. В определённый момент он достигает предельного значения. Это приводит к ускорению высвобождения оставшихся ионов лития из катодного материала, но они уже не меняют суммарного напряжения батареи.
Если батарея не будет полностью заряжена, то на катоде останется некоторое число частиц, близких к пограничному состоянию. Они практически достигли барьера высвобождения ионов лития, но не успели его преодолеть. При разряде свободные ионы лития стремятся вернуться на место и рекомбинировать с ионами феррофосфата. Однако на поверхности катода их также встречают частицы в пограничном состоянии, уже содержащие литий. Обратный захват затрудняется, и нарушается микроструктура электрода.
В настоящее время просматриваются два пути решения проблемы: внесение изменений в алгоритмы работы системы управления батареями и разработка катодов с увеличенной площадью поверхности.
=== Требования к режимам заряда/разряда ===
Глубокий разряд полностью выводит из строя литий-ионный аккумулятор. Также на жизненный цикл аккумуляторов влияет глубина его разряда перед очередной зарядкой<!-- но ведь выше указано, что у него практически нет эффекта памяти? --> и зарядка токами выше установленных производителем. Из-за низкого внутреннего сопротивления аккумулятора зарядный ток сильно зависит от напряжения на его клеммах во время зарядки. Ток зарядки зависит от разницы напряжений между аккумулятором и зарядным устройством и от сопротивления как самого аккумулятора, так и подводимых к нему проводов. Увеличение напряжения зарядки на 4 % может приводить к увеличению тока зарядки в 10 раз, что отрицательно сказывается на аккумуляторе, при недостаточном отводе тепла он перегревается и деградирует. В результате, если напряжение на аккумуляторе превысить всего на 4 %, он будет вдвое быстрее терять ёмкость от цикла к циклу<ref>{{публикация
|1=статья
|автор=Мельничук
|автор имя=О. В.
|автор2=Фетисов
|автор2 имя=В. С.
|заглавие=Особенности заряда и разряда литиевых аккумуляторных батарей и современные технические средства управления этими процессами
|тип=журн
|издание=Электротехнические и информационные комплексы и системы
|issn=1999-5458
|год=2016
|номер=2
|том=12
|страницы=41–48
|удк=621.355.9
|ссылка=https://cyberleninka.ru/article/n/osobennosti-zaryada-i-razryada-litievyh-akkumulyatornyh-batarey-i-sovremennye-tehnicheskie-sredstva-upravleniya-etimi-protsessami
|архив дата=2019-08-28
|архив=https://web.archive.org/web/20190828231845/https://cyberleninka.ru/article/n/osobennosti-zaryada-i-razryada-litievyh-akkumulyatornyh-batarey-i-sovremennye-tehnicheskie-sredstva-upravleniya-etimi-protsessami
}}</ref>.
=== Старение ===
Литиевые аккумуляторы стареют, даже если не используются. Соответственно, нет смысла покупать аккумулятор «про запас» или чрезмерно увлекаться «экономией» его ресурса.
Оптимальные условия хранения Li-ion-аккумуляторов достигаются при 40-процентном заряде от ёмкости аккумулятора и температуре 0…10 [[Градус Цельсия|°C]]<ref name="htplbb">{{публикация
|1=статья
|автор=Дмитрий
|заглавие=5 практических советов по эксплуатации литий-ионных аккумуляторов
|издание=Блог компании Mugen Power Batteries
|год=2013
|месяц=02
|день=06
|ссылка=https://habrahabr.ru/company/mugenpower/blog/168483/
|архив дата=2016-12-22
|архив=https://web.archive.org/web/20161222073941/https://habrahabr.ru/company/mugenpower/blog/168483/
}}</ref>.
{| class="standard"
!Температура, ⁰C
!С 40%-м зарядом, % за год
!Со 100%-м зарядом, % за год
|-
|0
|2
|6
|-
|25
|4
|20
|-
|40
|15
|35
|-
|60
|25
|60 (40 % за ''три месяца'')
|}
=== Снижение ёмкости при низких температурах ===
Как и в других типах аккумуляторов, разрядка в условиях низких температур приводит к снижению отдаваемой энергии, в особенности при температурах ниже 0 ⁰C. Так, снижение запаса отдаваемой энергии при понижении температуры от +20 ⁰C до +4 ⁰C приводит к уменьшению отдаваемой энергии на ~5-7 %, дальнейшее понижение температуры разрядки ниже 0 ⁰C приводит к потере отдаваемой энергии на десятки процентов. Разряд аккумулятора при температуре, не ниже указанной производителем аккумуляторов, не приводит к их деградации (преждевременному исчерпанию ресурса).
Как и для других типов аккумуляторов, одним из вариантов решения проблемы являются [[Аккумулятор с внутренним электроподогревом|аккумуляторы с внутренним подогревом]]<ref>{{публикация
|1=статья
|автор=Комов С.
|соавторы=Сергей Комов
|заглавие=Созданы литий-ионные аккумуляторы с подогревом
|издание=Новый взгляд
|год=2016
|месяц=01
|день=22
|ссылка=http://newvz.ru/info/68833.html
|архив дата=2016-02-17
|архив=https://web.archive.org/web/20160217030453/http://newvz.ru/info/68833.html
}}</ref>.
== Производители ==
Производство литий-ионных аккумуляторов в мире в основном сосредоточено в [[Китай|Китае]], [[Южная Корея|Южной Корее]] и [[Япония|Японии]]. Крупнейшими их производителями являются [[CATL]], [[LG Chem]], [[Samsung SDI]] и [[Panasonic]]<ref>[https://1economic.ru/lib/119994 Аналитический обзор рынка производителей литий-ионных аккумуляторов]</ref>. В [[Россия|России]] есть несколько компаний, производящих литий-ионные аккумуляторы, но работают они на импортном сырье, в основном китайском<ref>[https://www.techinsider.ru/technologies/1601067-akkumulyatornaya-nezavisimost-kak-v-rossii-razvivaetsya-proizvodstvo-litiy-ionnyh-nakopiteley-energii/ Аккумуляторная независимость: как в России развивается производство литий-ионных накопителей энергии]</ref>.
== См. также ==
* [[Типоразмеры гальванических элементов#Элементы номинальным напряжением 3—3,7 В|Типоразмеры цилиндрических литий-ионных аккумуляторов]]
* [[Литий-полимерный аккумулятор]]
* [[Литий-железо-фосфатный аккумулятор]]
* [[Литий-титанатный аккумулятор]]
* [[Нанопроводниковый аккумулятор]]
* [[Зарядное устройство]]
* [[Никель-металл-гидридный аккумулятор|Никель-металл-гидридный аккумулятор (NiMH)]]
* [[Никель-кадмиевый аккумулятор|Никель-кадмиевый аккумулятор (NiCd)]]
* [[Батарея (электротехника)|Батарея]]
* [[Элемент AA]]
* [[Элемент AAA]]
* [[Эффект памяти аккумулятора]]
* [[Натрий-ионный аккумулятор]]
* [[Система накопления электрической энергии|Системы накопления электрической энергии]]
== Примечания ==
{{Примечания}}
== Литература ==
* {{публикация|книга |автор=Хрусталёв |автор имя=Д. А. |заглавие=Аккумуляторы |место=М. |издательство=Изумруд |год=2003 |ref=Хрусталёв }}
* {{публикация|статья
|автор=Филипповский Ю. |соавторы=Юрий Филипповский
|заглавие=Мобильное питание |подзаголовок=Ч. 2
|издание=Компьютерра-онлайн
|год=2009
|месяц=05
|день=26
|ссылка= https://old.computerra.ru/terralab/platform/428707/
|архив= https://web.archive.org/web/20090529231525/http://www.computerra.ru/terralab/platform/428707
|архив дата= 2009-05-29
|ref=Филипповский
}}
* {{публикация|книга
|автор=Скундин
|автор имя=А. М.
|автор2=Брылев
|автор2 имя=О. А.
|заглавие=Наноматериалы в современных химических источниках тока
|подзаголовок=методическая разработка к программам повышения квалификации
|ответственный=Фак-т наук о материалах МГУ
|место=М.
|издательство=[[МГУ]]
|год=2011
|страниц=56
|ссылка=http://www.nanometer.ru/2009/10/27/12565955237306/PROP_FILE_files_1/hit1.pdf
|ref=Скундин и Брылев
}}
* {{публикация|статья|язык=en
|авторScrosati |автор имя=Bruno |автор2=Garche |автор2 имя=Jürgen
|заглавие=Lithium batteries |подзаголовок=Status, prospects and future
|издание=Journal of Power Sources |issn=0378-7753
|год=2010 |месяц=05 |volume=195 |issue=9
|pages=2419—2430
|doi=10.1016/j.jpowsour.2009.11.048
|ref=Scrosati & Garche
}}
* {{публикация|статья|язык=en
|автор имя=Tsuyoshi |автор=Sasaki |автор2 имя=Yoshio |автор2=Ukyo |автор3 имя=Petr |автор3=Novák
|заглавие=Memory effect in a lithium-ion battery
|тип=журн |издание=Nature Materials
|год=2013 |volume=12 |pages=569–575
|ссылка=http://www.nature.com/nmat/journal/v12/n6/full/nmat3623.html
|doi=10.1038/nmat3623
|ref=Sasaki et al.
}}
== Ссылки ==
* {{публикация|статья
|автор=Васильев В. |соавторы=Владимир Васильев
|заглавие=Литий-ионные и литий-полимерные аккумуляторы
|издание=iXBT
|год=2001 |месяц=11 |день=26
|ссылка=http://www.ixbt.com/mobile/review/lipol.shtml
|ref=Васильев
}}
* {{публикация|статья
|заглавие=Литий-ионные (Li-ion) аккумуляторы
|издание=Аккумуляторы, батарейки и другие источники питания
|ссылка=http://www.powerinfo.ru/accumulator-liion.php
}}
{{Гальванические элементы}}
[[Категория:Литиевые аккумуляторы]]
[[Категория:Появились в 1991 году]]
[[Категория:Изобретения Японии]]
[[Категория:Ионы]]
== Vněšnje linky ==
== Primětky ==
{{Small|<references group="lower-alpha"/>}}
== Iztočniky ==
{{Iztočniky}}
[[Kategorija:Nikola Tesla]]
[[Kategorija:Elektromagnetizm]]
<gallery>
Margay tiger cat (side profile).jpg|Kot imenom {{-|Tigriño}}, prědstavitelj vida {{-|Leopardus tilcayo}}, v rezervaciji {{-|La Senda Verde|Сенда-Верде}} v 2026
Leopardus tilcayo (5x3 cropped).jpg|
</gallery>
== Čitati dalje ==
== Izvor ==
{{Prěvod|en|Japanese language|}}
[[Kategorija:Zvěri]]
[[Kategorija:Kotovi]]
== Vněšnje linky ==
{{DEFAULTSORT:Seleznjova, Alisa}}
{{Pravopis}}
{{Poslanje
| type = informative
| file = EU-LABEL AI black transparent.svg
| title = UI prěvod
| description = Tutoj članok imaje priznaky koristanja [[Umětna inteligencija|umětnoj inteligencije]] zaradi prěvoda na medžuslovjansky jezyk iz drugyh iztočnikov i zato potrěbuje prověrku pravopisa. Medžuslovjanska Vikipedija ne imaje ničto protiv izkoristanja umětnoj inteligencije za prěvodženje, ale kvalita prěvoda musi byti dobra i odpovědati standardam. Iztvoritelju tutogo članka prěporučajemo prověriti pravopis i sdělati nužne izpravjenja do '''{{{izpraviti do}}}''' i oddaliti tuty šablon. ''Hvala za spolurabotu!''
| comment = ''Data i čas vključenja poslanja: {{{data}}}.''
}}<includeonly>{{#if:{{{nocat|}}}||[[Kategorija:Poddržka:Članky, prěvedene s pomočju UI]][[Kategorija:Šablon:Poslanja]]}}</includeonly><noinclude>
{{Dokumentacija}}
</noinclude>
{{Citatny blok
|border = 2px
|align = center
|bgcolor = Cornsilk
|title =
|halign = left
|quote =
Vikipedija jest svobodna enciklopedija, ktoru každy može tvoriti
{{skryto odsud}}
{{-|Wikipedija is a free encyclopedia that anyone can edit}}
{{skryto dotud}}
|salign = right
|author =
|source = Originalny tekst (angl.)
}}
Vikipedija jest svobodna enciklopedija, ktoru každy može tvoriti
{{Collapse|1={{-|Wikipedija is a free encyclopedia that anyone can edit}}|2=Originalny tekst (angl.)|padding=20px}}
Tekst članka.{{sfn |''Popular Magazine''|1996|p=29}}<ref>{{cite magazine
| magazine = Popular Magazine
| title = An Article by an Anonymous Author
| date = 1996
| ref = {{sfnref|Popular Magazine|1996}}
}}</ref>
Tuto jest peskovišče.
[[File:Nihongo.svg|thumb|right|100px| 日本語 (Japonsky jezyk)]]
'''Japonsky jezyk''' ({{Jezyky|ja|日本語 {{!}} にほんご}} | {{-|''Nihongo'' [nʲiho̞ŋːo̞]}})
<span class="ext-gadget-alphabet-disable">
</span>
== Referencije ==
<div class="ext-gadget-alphabet-disable">
<references group="lower-alpha"/>
{{Iztočniky}}
</div>
{{Pravopis prověrjeny}}
8gufqtjlflyra9y7sr29zu89ma7uu01
Kanal Irtyš-Karaganda
0
6557
49239
49234
2026-11-10T17:09:08Z
Ilja isv
10
/* Opis */
49239
wikitext
text/x-wiki
'''Kanal Irtyš–Karaganda''' ({{Jezyky|kk|Ертіс-Қарағанды каналы}}, {{-|''Ertıs-Qarağandy kanaly''}}; {{Jezyky|ru|Канал Иртыш — Караганда}}) jest irigacijnym kanalom v [[Kazahstan]]u, on sjedinjaje siberijsku rěku [[Irtyš]] s [[Karaganda|Karagandoju]], glavnym promyslnym centrom sevěro-centralnogo Kazahstana. Po razpadanju [[Sovětsky Sojuz|Sovětskogo Sojuza]] kanal se oficialno dobyl ime Kanala Kanyša Satpajeva ({{jezyky|ru|Канал имени Каныша Сатпаева}}) po imenu kazahskogo geologa [[Kanyš Satpayev|Kanyša Satpajeva]]. Kanal jest jedinstvenouju realizovanoju čestju projekta "[[Povrat rěk|Povrat siberijskyh rěk]]", ktory se široko diskutoval v SSSR v {{-|XX}}. stolětju.
==Opis==
[[Fajl: Канал Иртыш-Караганда - panoramio (1).jpg|thumb|300px|left|Panorama kanala Irtyš-Karaganda]]
Kanal počinaje se v koordinatah {{coord|51|59|38|N|76|59|27|E|}}, k jugu od grada [[Aksu, Kazakhstan|Aksu]] (raněje Jermak), kde on zabiraje vodu iz jednoj odvětvy rěky Irtyš. Kanal beži 451 km<ref>[http://encyclopedia2.thefreedictionary.com/Irtysh-Karaganda+Canal Kanal Irtyš-Karaganda] v [[Velika sovětska enciklopedija|Velikoj sovětskoj enciklopediji]], 1979</ref> glavno na zapad, jugo=zapad ili jug, dosegajuči promyslovogo regiona na sevěro-iztočnyh okrajinah Karagandy v koordinatah {{coord|49|58|22|N|73|15|49|E|display=inline|type:landmark}} (lokalitet Kokpekti), kde jego voda vpolno odhodi do podzemnyh truboprovodov.
Na svojem putu kanal prohodi črez mnogočislne vodojemy (Ekibastuzsky vodojem ({{coord|51|49|00|N|75|13|00|E|display=inline|type:landmark}}, okolo 10 km na sevěr od [[Ekibastuz|Ekibastuza]]), i takože druge vodojemy v koordinatah {{coord|51|48|00|N|74|38|00|E|display=inline|type:landmark}}, {{coord|51|28|00|N|74|21|00|E|display=inline|type:landmark}}, i t.d.).
Kanal prěkryžuje [[Rěka Nura (Kazahstan)|rěku Nura]] v točkě {{coord|50|5|26|N|73|22|40|E|display=inline|type:landmark}}, kde, věrojetno, jest izdělan tunel. Čest vody kanala jest napravjena v Nuru (žlebom pod damboju v koprdinatah {{coord|50|5|30|N|73|22|37|E|display=inline|type:landmark}}), da by napolnjati tutu rěku.
Zatože Karaganda se nahodi vyše, než Irtyš, kanal imaje 22 nasosnyh stancij, vozdvigajučih vodu cělkovo na 475 m.<ref>{{citation
|first=M. I. |last=L'vovich
|title=World Water Resources and Their Future
|year=1979
|publisher=American Geophysical Union
|url= https://books.google.com/books?id=TxJUOqTKtAIC&pg=PA344
|page=344}}</ref><ref>{{citation
|editor-first=Yoginder K. |editor-last=Alagh|editor2-first= Ganesh |editor2-last=Pangare|editor3-first= Biksham |editor3-last=Gujja
|publisher=Academic Foundation |year=2006
|isbn=8171885209
|title=Interlinking of Rivers in India: Overview and Ken-Betwa Link
|url= https://books.google.com/books?id=cRzAKkRBok4C&pg=PA70
|page=70}}</ref>
== Iztočniky ==
{{Iztočniky}}
==Zdroje v inyh viki==
{{Prěvod|en|Irtysh–Karaganda Canal}}
p8sd2xdkuzuzztevrvi75fowsxhk24w
Šablon:Kartka kanal/Dokumentacija
10
6559
49241
2026-11-11T07:47:28Z
Ilja isv
10
Stvorjena nova stranica s tekstom: «<code><nowiki>{{Kartka kanal| ignoreblank| mapframe_args| pushpin_map_args| alt | beam_ft | beam_in | beam_m | beam_note | begin_coord | branch | branch_of | canal_length | connects_to | coordinates | country | current_num_lifts | current_num_locks | date_act | date_approved | date_began | date_closed | date_completed | date_extended | date_restored | date_use | direction | elev_ft | elev_m | elev_note | end_coord | end_note | end_point | engineer | fo...»
49241
wikitext
text/x-wiki
<code><nowiki>{{Kartka kanal| ignoreblank| mapframe_args| pushpin_map_args| alt | beam_ft | beam_in | beam_m | beam_note | begin_coord | branch | branch_of | canal_length | connects_to | coordinates | country | current_num_lifts | current_num_locks | date_act | date_approved | date_began | date_closed | date_completed | date_extended | date_restored | date_use | direction | elev_ft | elev_m | elev_note | end_coord | end_note | end_point | engineer | former_names | image | image_caption | image_size | len_ft | len_in | len_m | len_note | length_km | length_mi | length_note | location | lock_length | lock_length_km | lock_length_mi | lock_length_note | lock_note | lock_width | lock_width_ft | lock_width_m | lock_width_note | locks | map | map_alt | map_caption | map_size | max_boat_air_draft | max_boat_beam | max_boat_draft | max_boat_length | max_elev | min_boat_air_draft | min_boat_draft | min_elev | min_elev_ft | min_elev_m | min_elev_note | modern_name | module | name | navigation_authority | original_beam_ft | original_beam_in | original_beam_m | original_boat_length_ft | original_boat_length_in | original_boat_length_m | original_end | original_length_km | original_length_mi | original_lock_length_km | original_lock_length_mi | original_lock_width_ft | original_lock_width_m | original_num_locks | original_owner | original_start | other_engineer | present_owner | routemap | routemap_name | routemap_state | start_note | start_point | status | total_rise | xfield1 | xfield2 | xfield3 | xvalue1 | xvalue2 | xvalue3}}</nowiki></code>
onw5vxxr9potriegbb54l6zfjy06hym
49248
49241
2026-11-11T08:18:19Z
Ilja isv
10
49248
wikitext
text/x-wiki
<code><nowiki>{{Kartka kanal| pushpin_map_args| alt | beam_ft | beam_in | beam_m | beam_note | begin_coord | branch | branch_of | canal_length | connects_to | coordinates | country | current_num_lifts | current_num_locks | date_act | date_approved | date_began | date_closed | date_completed | date_extended | date_restored | date_use | direction | elev_ft | elev_m | elev_note | end_coord | end_note | end_point | engineer | former_names | image | image_caption | image_size | len_ft | len_in | len_m | len_note | length_km | length_mi | length_note | location | lock_length | lock_length_km | lock_length_mi | lock_length_note | lock_note | lock_width | lock_width_ft | lock_width_m | lock_width_note | locks | map | map_alt | map_caption | map_size | max_boat_air_draft | max_boat_beam | max_boat_draft | max_boat_length | max_elev | min_boat_air_draft | min_boat_draft | min_elev | min_elev_ft | min_elev_m | min_elev_note | modern_name | module | name | navigation_authority | original_beam_ft | original_beam_in | original_beam_m | original_boat_length_ft | original_boat_length_in | original_boat_length_m | original_end | original_length_km | original_length_mi | original_lock_length_km | original_lock_length_mi | original_lock_width_ft | original_lock_width_m | original_num_locks | original_owner | original_start | other_engineer | present_owner | routemap | routemap_name | routemap_state | start_note | start_point | status | total_rise | xfield1 | xfield2 | xfield3 | xvalue1 | xvalue2 | xvalue3}}</nowiki></code>
e2d4zgsd6f613uerrx2e3lm4leqa0cm
Šablon:Kartka kanal
10
6560
49242
2026-11-11T07:48:18Z
Ilja isv
10
Stvorjena nova stranica s tekstom: «<includeonly>{{Kartka | bodyclass = vcard | aboveclass = fn org | abovestyle = font-size: larger; background-color: #CEDEFF; color:inherit; | autoheaders = yes | headerstyle = background-color: #CEDEFF; color:inherit; | above = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}} | image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|sizedefault=288px|alt={{{alt|}}}}} | caption = {{{image_caption|}}} | image2 = {{#...»
49242
wikitext
text/x-wiki
<includeonly>{{Kartka
| bodyclass = vcard
| aboveclass = fn org
| abovestyle = font-size: larger; background-color: #CEDEFF; color:inherit;
| autoheaders = yes
| headerstyle = background-color: #CEDEFF; color:inherit;
| above = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|sizedefault=288px|alt={{{alt|}}}}}
| caption = {{{image_caption|}}}
| image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{map|}}}|size={{{map_size|}}}|sizedefault=frameless|alt={{{map_alt|}}}}}
| caption2 = {{{map_caption|}}}
| image3 = {{#invoke:Location map|infobox_pushpin_map}}
| image4 = {{#invoke:Infobox mapframe
| autoWithCaption
| onByDefault = {{#if:{{{map|}}}{{{pushpin_map|}}}|no|yes}}
| mapframe-length_km = {{{length_km|}}}
| mapframe-length_mi = {{{length_mi|}}}
| mapframe-stroke-color = #0000ff
| mapframe-caption = Interactive map of {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| label1 = Location
| data1 = {{{location|}}}
| label2 = Country
| data2 = {{{country|}}}
| label3 = Coordinates
| data3 = {{{coordinates|}}}
| header4 = Specifications
| label5 = Length
| data5 = {{#if: {{{length_mi|}}}{{{length_km|}}}
|{{br separated entries
|1 = {{#if:{{{length_km|}}}
| {{convert|{{{length_km}}}|km|mi|abbr=in}}
| {{convert|{{{length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_length_km|}}}
|(originally {{convert|{{{original_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_length_mi|}}}
|(originally {{convert|{{{original_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{length_note|}}}|({{{length_note}}})}}
}}
|{{{canal_length|}}}
}}
| label6 = Lock length
| data6 = {{#if: {{{lock_length_mi|}}}{{{lock_length_km|}}}
|{{br separated entries
|1 = {{#if:{{{lock_length_km|}}}
| {{convert|{{{lock_length_km}}}|km|mi|abbr=in}}
| {{convert|{{{lock_length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_lock_length_km|}}}
|(originally {{convert|{{{original_lock_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_lock_length_mi|}}}
|(originally {{convert|{{{original_lock_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_length_note|}}}|({{{lock_length_note}}})}}
}}
|{{{lock_length|}}}
}}
| label7 = Lock width
| data7 = {{#if: {{{lock_width_m|}}}{{{lock_width_ft|}}}
|{{br separated entries
|1 = {{#if:{{{lock_width_m|}}}
| {{convert|{{{lock_width_m}}}|m|ft|abbr=on}}
| {{convert|{{{lock_width_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{original_lock_width_m|}}}
|(originally {{convert|{{{original_lock_width_m}}}|m|ft|abbr=on|disp=or}})
|{{#if: {{{original_lock_width_ft|}}}
|(originally {{convert|{{{original_lock_width_ft}}}|ft|m|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_width_note|}}}|({{{lock_width_note}}})}}
}}
|{{{lock_width|}}}
}}
| label8 = {{longitem|Maximum [[Length overall|boat length]]}}
| data8 = {{#if: {{{len_ft|}}}{{{len_m|}}}
|{{br separated entries
|1 = {{#if:{{{len_m|}}}
|{{convert|{{{len_m}}}|m|ftin|abbr=on|sigfig=4}}
|{{convert|{{{len_ft|}}}|ft|{{{len_in|0}}}|in|m|abbr=on|sigfig=4}}
}}
|2 = {{#if: {{{original_boat_length_m|}}}
|(originally {{convert|{{{original_boat_length_m}}}|m|ftin|abbr=on|disp=or|sigfig=4}})
|{{#if: {{{original_boat_length_ft|}}}
|(originally {{convert|{{{original_boat_length_ft|}}}|ft|{{{original_boat_length_in|0}}}|in|m|abbr=on|disp=or|sigfig=4}})
}} }}
|3 = {{#if: {{{len_note|}}}|({{{len_note}}})}}
}}
| {{{max_boat_length|}}}
}}
| label9 = {{longitem|Maximum [[Beam (nautical)|boat beam]]}}
| data9 = {{#if: {{{beam_ft|}}}{{{beam_m|}}}
|{{br separated entries
|1 = {{#if:{{{beam_m|}}}
|{{convert|{{{beam_m}}}|m|ftin|abbr=on|sigfig=3}}
|{{convert|{{{beam_ft|}}}|ft|{{{beam_in|0}}}|in|m|abbr=on|sigfig=3}}
}}
|2 = {{#if: {{{original_beam_m|}}}
|(originally {{convert|{{{original_beam_m}}}|m|ftin|abbr=on|disp=or|sigfig=3}})
|{{#if: {{{original_beam_ft|}}}
|(originally {{convert|{{{original_beam_ft|}}}|ft|{{{original_beam_in|0}}}|in|m|abbr=on|disp=or|sigfig=3}})
}} }}
|3 = {{#if: {{{beam_note|}}}|({{{beam_note}}})}}
}}
| {{{max_boat_beam|}}}
}}
| label10 = {{longitem|Maximum [[Draft (hull)|boat draft]]}}
| data10 = {{{max_boat_draft|}}}
| label11 = {{longitem|Minimum boat draft}}
| data11 = {{{min_boat_draft|}}}
| label12 = {{longitem|Maximum [[air draft|boat air draft]]}}
| data12 = {{{max_boat_air_draft|}}}
| label13 = {{longitem|Minimum boat air draft}}
| data13 = {{{min_boat_air_draft|}}}
| label14 = Locks
| data14 = {{#if: {{{locks|}}}
|{{br separated entries
|1 = {{{locks}}}
|2 = {{#if: {{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
|3 = {{#if: {{{lock_note|}}}|({{{lock_note}}})}}
}}
|{{#if:{{{current_num_locks|}}}
|{{{current_num_locks|}}} {{#if:{{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
}}
}}
| label15 = {{longitem|Original number of locks}}<!-- suppressed if merged with field above -->
| data15 = {{#if:{{{current_num_locks|}}}{{{locks|}}}||{{{original_num_locks|}}}}}
| label16 = {{longitem|Number of lifts}}
| data16 = {{#if:{{{current_num_lifts|}}}|{{{current_num_lifts|}}}}}
| label17 = {{longitem|Maximum height [[AMSL]]}}
| data17 = {{#if: {{{elev_ft|}}}{{{elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{elev_m|}}}
| {{convert|{{{elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{elev_ft|}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{elev_note|}}}|({{{elev_note}}})}}
}}
| {{{max_elev|}}}
}}
| label18 = {{longitem|Minimum height [[AMSL]]}}
| data18 = {{#if: {{{min_elev_ft|}}}{{{min_elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{min_elev_m|}}}
| {{convert|{{{min_elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{min_elev_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{min_elev_note|}}}|({{{min_elev_note}}})}}
}}
| {{{min_elev|}}}
}}
| label19 = {{longitem|Total [[Lock (water navigation)#Rise|rise]]}}
| data19 = {{{total_rise|}}}
| label20 = Status
| data20 = {{{status|}}}
| label21 = {{longitem|Navigation authority}}
| data21 = {{{navigation_authority|}}}
| label22 = {{longitem|{{{xfield1}}}}}
| data22 = {{{xvalue1|}}}
| header23 = History
| label24 = Former names
| data24 = {{{former_names|}}}
| label25 = Modern name
| data25 = {{{modern_name|}}}
| label26 = Current owner
| data26 = {{{present_owner|}}}
| label27 = Original owner
| data27 = {{{original_owner|}}}
| label28 = {{longitem|Principal engineer}}
| data28 = {{{engineer|}}}
| label29 = Other engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}}
| data29 = {{{other_engineer|}}}
| label30 = Date approved
| data30 = {{{date_approved|}}}
| label31 = Date of act
| data31 = {{{date_act|}}}
| label32 = Construction began
| data32 = {{{date_began|}}}
| label33 = {{longitem|Date of first use}}
| data33 = {{{date_use|}}}
| label34 = Date completed
| data34 = {{{date_completed|}}}
| label35 = Date extended
| data35 = {{{date_extended|}}}
| label36 = Date closed
| data36 = {{{date_closed|}}}
| label37 = Date restored
| data37 = {{{date_restored|}}}
| label38 = {{longitem|{{{xfield2}}}}}
| data38 = {{{xvalue2|}}}
| header39 = Geography
| label40 = Direction
| data40 = {{{direction|}}}
| label41 = Start point
| data41 = {{#if: {{{start_point|}}}
|{{br separated entries
|1 = {{{start_point}}}
|2 = {{#if: {{{original_start|}}}|(originally {{{original_start}}})}}
|3 = {{#if: {{{start_note|}}}|({{{start_note}}})}}
}}
}}
| label42 = End point
| data42 = {{#if: {{{end_point|}}}
|{{br separated entries
|1 = {{{end_point}}}
|2 = {{#if: {{{original_end|}}}|(originally {{{original_end}}})}}
|3 = {{#if: {{{end_note|}}}|({{{end_note}}})}}
}}
}}
| label43 = {{longitem|Beginning coordinates}}
| data43 = {{{begin_coord|}}}
| label44 = {{longitem|Ending coordinates}}
| data44 = {{{end_coord|}}}
| label45 = Branch{{pluralize from text|{{{branch|}}}|plural=es}}
| data45 = {{{branch|}}}
| label46 = Branch of
| data46 = {{{branch_of|}}}
| label47 = Connects to
| data47 = {{{connects_to|}}}
| label48 = {{longitem|{{{xfield3}}}}}
| data48 = {{{xvalue3|}}}
| below = {{#if:{{{routemap|}}}|{{infobox
| bodystyle = {{Subinfobox bodystyle}}
| bodyclass = collapsible {{{routemap_state|}}}
| headerstyle = background-color: #CEDEFF; color:inherit;
| header1 = {{#if:{{{routemap_name|}}}|{{{routemap_name}}}|Route map}}
| data2 = {{{routemap}}}
}}
}}
| header49 = _BLANK_
| data50 = {{{module|}}}
}}</includeonly><noinclude>
{{Dokumentacija}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
6v3v9jq8kj4k2a0nsar5wb6jlt1mdc9
49245
49242
2026-11-11T08:02:58Z
Ilja isv
10
49245
wikitext
text/x-wiki
<includeonly>{{Kartka
| bodyclass = vcard
| aboveclass = fn org
| abovestyle = font-size: larger; background-color: #CEDEFF; color:inherit;
| autoheaders = yes
| headerstyle = background-color: #CEDEFF; color:inherit;
| above = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|sizedefault=288px|alt={{{alt|}}}}}
| caption = {{{image_caption|}}}
| image2 = <!--{{#invoke:InfoboxImage|InfoboxImage|image={{{map|}}}|size={{{map_size|}}}|sizedefault=frameless|alt={{{map_alt|}}}}}-->
| caption2 = <!--{{{map_caption|}}}-->
| image3 = {{#invoke:Location map|infobox_pushpin_map}}
| image4 = {{#invoke:Infobox mapframe
| autoWithCaption
| onByDefault = {{#if:{{{map|}}}{{{pushpin_map|}}}|no|yes}}
| mapframe-length_km = {{{length_km|}}}
| mapframe-length_mi = {{{length_mi|}}}
| mapframe-stroke-color = #0000ff
| mapframe-caption = Interactive map of {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| label1 = Location
| data1 = {{{location|}}}
| label2 = Country
| data2 = {{{country|}}}
| label3 = Coordinates
| data3 = {{{coordinates|}}}
| header4 = Specifications
| label5 = Length
| data5 = {{#if: {{{length_mi|}}}{{{length_km|}}}
|{{br separated entries
|1 = {{#if:{{{length_km|}}}
| {{convert|{{{length_km}}}|km|mi|abbr=in}}
| {{convert|{{{length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_length_km|}}}
|(originally {{convert|{{{original_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_length_mi|}}}
|(originally {{convert|{{{original_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{length_note|}}}|({{{length_note}}})}}
}}
|{{{canal_length|}}}
}}
| label6 = Lock length
| data6 = {{#if: {{{lock_length_mi|}}}{{{lock_length_km|}}}
|{{br separated entries
|1 = {{#if:{{{lock_length_km|}}}
| {{convert|{{{lock_length_km}}}|km|mi|abbr=in}}
| {{convert|{{{lock_length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_lock_length_km|}}}
|(originally {{convert|{{{original_lock_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_lock_length_mi|}}}
|(originally {{convert|{{{original_lock_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_length_note|}}}|({{{lock_length_note}}})}}
}}
|{{{lock_length|}}}
}}
| label7 = Lock width
| data7 = {{#if: {{{lock_width_m|}}}{{{lock_width_ft|}}}
|{{br separated entries
|1 = {{#if:{{{lock_width_m|}}}
| {{convert|{{{lock_width_m}}}|m|ft|abbr=on}}
| {{convert|{{{lock_width_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{original_lock_width_m|}}}
|(originally {{convert|{{{original_lock_width_m}}}|m|ft|abbr=on|disp=or}})
|{{#if: {{{original_lock_width_ft|}}}
|(originally {{convert|{{{original_lock_width_ft}}}|ft|m|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_width_note|}}}|({{{lock_width_note}}})}}
}}
|{{{lock_width|}}}
}}
| label8 = {{longitem|Maximum [[Length overall|boat length]]}}
| data8 = {{#if: {{{len_ft|}}}{{{len_m|}}}
|{{br separated entries
|1 = {{#if:{{{len_m|}}}
|{{convert|{{{len_m}}}|m|ftin|abbr=on|sigfig=4}}
|{{convert|{{{len_ft|}}}|ft|{{{len_in|0}}}|in|m|abbr=on|sigfig=4}}
}}
|2 = {{#if: {{{original_boat_length_m|}}}
|(originally {{convert|{{{original_boat_length_m}}}|m|ftin|abbr=on|disp=or|sigfig=4}})
|{{#if: {{{original_boat_length_ft|}}}
|(originally {{convert|{{{original_boat_length_ft|}}}|ft|{{{original_boat_length_in|0}}}|in|m|abbr=on|disp=or|sigfig=4}})
}} }}
|3 = {{#if: {{{len_note|}}}|({{{len_note}}})}}
}}
| {{{max_boat_length|}}}
}}
| label9 = {{longitem|Maximum [[Beam (nautical)|boat beam]]}}
| data9 = {{#if: {{{beam_ft|}}}{{{beam_m|}}}
|{{br separated entries
|1 = {{#if:{{{beam_m|}}}
|{{convert|{{{beam_m}}}|m|ftin|abbr=on|sigfig=3}}
|{{convert|{{{beam_ft|}}}|ft|{{{beam_in|0}}}|in|m|abbr=on|sigfig=3}}
}}
|2 = {{#if: {{{original_beam_m|}}}
|(originally {{convert|{{{original_beam_m}}}|m|ftin|abbr=on|disp=or|sigfig=3}})
|{{#if: {{{original_beam_ft|}}}
|(originally {{convert|{{{original_beam_ft|}}}|ft|{{{original_beam_in|0}}}|in|m|abbr=on|disp=or|sigfig=3}})
}} }}
|3 = {{#if: {{{beam_note|}}}|({{{beam_note}}})}}
}}
| {{{max_boat_beam|}}}
}}
| label10 = {{longitem|Maximum [[Draft (hull)|boat draft]]}}
| data10 = {{{max_boat_draft|}}}
| label11 = {{longitem|Minimum boat draft}}
| data11 = {{{min_boat_draft|}}}
| label12 = {{longitem|Maximum [[air draft|boat air draft]]}}
| data12 = {{{max_boat_air_draft|}}}
| label13 = {{longitem|Minimum boat air draft}}
| data13 = {{{min_boat_air_draft|}}}
| label14 = Locks
| data14 = {{#if: {{{locks|}}}
|{{br separated entries
|1 = {{{locks}}}
|2 = {{#if: {{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
|3 = {{#if: {{{lock_note|}}}|({{{lock_note}}})}}
}}
|{{#if:{{{current_num_locks|}}}
|{{{current_num_locks|}}} {{#if:{{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
}}
}}
| label15 = {{longitem|Original number of locks}}<!-- suppressed if merged with field above -->
| data15 = {{#if:{{{current_num_locks|}}}{{{locks|}}}||{{{original_num_locks|}}}}}
| label16 = {{longitem|Number of lifts}}
| data16 = {{#if:{{{current_num_lifts|}}}|{{{current_num_lifts|}}}}}
| label17 = {{longitem|Maximum height [[AMSL]]}}
| data17 = {{#if: {{{elev_ft|}}}{{{elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{elev_m|}}}
| {{convert|{{{elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{elev_ft|}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{elev_note|}}}|({{{elev_note}}})}}
}}
| {{{max_elev|}}}
}}
| label18 = {{longitem|Minimum height [[AMSL]]}}
| data18 = {{#if: {{{min_elev_ft|}}}{{{min_elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{min_elev_m|}}}
| {{convert|{{{min_elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{min_elev_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{min_elev_note|}}}|({{{min_elev_note}}})}}
}}
| {{{min_elev|}}}
}}
| label19 = {{longitem|Total [[Lock (water navigation)#Rise|rise]]}}
| data19 = {{{total_rise|}}}
| label20 = Status
| data20 = {{{status|}}}
| label21 = {{longitem|Navigation authority}}
| data21 = {{{navigation_authority|}}}
| label22 = {{longitem|{{{xfield1}}}}}
| data22 = {{{xvalue1|}}}
| header23 = History
| label24 = Former names
| data24 = {{{former_names|}}}
| label25 = Modern name
| data25 = {{{modern_name|}}}
| label26 = Current owner
| data26 = {{{present_owner|}}}
| label27 = Original owner
| data27 = {{{original_owner|}}}
| label28 = {{longitem|Principal engineer}}
| data28 = {{{engineer|}}}
| label29 = Other engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}}
| data29 = {{{other_engineer|}}}
| label30 = Date approved
| data30 = {{{date_approved|}}}
| label31 = Date of act
| data31 = {{{date_act|}}}
| label32 = Construction began
| data32 = {{{date_began|}}}
| label33 = {{longitem|Date of first use}}
| data33 = {{{date_use|}}}
| label34 = Date completed
| data34 = {{{date_completed|}}}
| label35 = Date extended
| data35 = {{{date_extended|}}}
| label36 = Date closed
| data36 = {{{date_closed|}}}
| label37 = Date restored
| data37 = {{{date_restored|}}}
| label38 = {{longitem|{{{xfield2}}}}}
| data38 = {{{xvalue2|}}}
| header39 = Geography
| label40 = Direction
| data40 = {{{direction|}}}
| label41 = Start point
| data41 = {{#if: {{{start_point|}}}
|{{br separated entries
|1 = {{{start_point}}}
|2 = {{#if: {{{original_start|}}}|(originally {{{original_start}}})}}
|3 = {{#if: {{{start_note|}}}|({{{start_note}}})}}
}}
}}
| label42 = End point
| data42 = {{#if: {{{end_point|}}}
|{{br separated entries
|1 = {{{end_point}}}
|2 = {{#if: {{{original_end|}}}|(originally {{{original_end}}})}}
|3 = {{#if: {{{end_note|}}}|({{{end_note}}})}}
}}
}}
| label43 = {{longitem|Beginning coordinates}}
| data43 = {{{begin_coord|}}}
| label44 = {{longitem|Ending coordinates}}
| data44 = {{{end_coord|}}}
| label45 = Branch{{pluralize from text|{{{branch|}}}|plural=es}}
| data45 = {{{branch|}}}
| label46 = Branch of
| data46 = {{{branch_of|}}}
| label47 = Connects to
| data47 = {{{connects_to|}}}
| label48 = {{longitem|{{{xfield3}}}}}
| data48 = {{{xvalue3|}}}
| below = {{#if:{{{routemap|}}}|{{infobox
| bodystyle = {{Subinfobox bodystyle}}
| bodyclass = collapsible {{{routemap_state|}}}
| headerstyle = background-color: #CEDEFF; color:inherit;
| header1 = {{#if:{{{routemap_name|}}}|{{{routemap_name}}}|Route map}}
| data2 = {{{routemap}}}
}}
}}
| header49 = _BLANK_
| data50 = {{{module|}}}
}}</includeonly><noinclude>
{{Dokumentacija}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
q4kogeyogn8gs8clutujo06cgrcozdv
49246
49245
2026-11-11T08:04:10Z
Ilja isv
10
49246
wikitext
text/x-wiki
<includeonly>{{Kartka
| bodyclass = vcard
| aboveclass = fn org
| abovestyle = font-size: larger; background-color: #CEDEFF; color:inherit;
| autoheaders = yes
| headerstyle = background-color: #CEDEFF; color:inherit;
| above = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|sizedefault=288px|alt={{{alt|}}}}}
| caption = {{{image_caption|}}}
| image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{map|}}}|size={{{map_size|}}}|sizedefault=frameless|alt={{{map_alt|}}}}}
| caption2 = {{{map_caption|}}}
| image3 = {{#invoke:Location map|infobox_pushpin_map}}
| image4 = {{#invoke:Infobox mapframe
| autoWithCaption
| onByDefault = {{#if:{{{map|}}}{{{pushpin_map|}}}|no|yes}}
| mapframe-length_km = {{{length_km|}}}
| mapframe-length_mi = {{{length_mi|}}}
| mapframe-stroke-color = #0000ff
| mapframe-caption = Interactive map of {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| label1 = Location
| data1 = {{{location|}}}
| label2 = Country
| data2 = {{{country|}}}
| label3 = Coordinates
| data3 = {{{coordinates|}}}
| header4 = Specifications
| label5 = Length
| data5 = {{#if: {{{length_mi|}}}{{{length_km|}}}
|{{br separated entries
|1 = {{#if:{{{length_km|}}}
| {{convert|{{{length_km}}}|km|mi|abbr=in}}
| {{convert|{{{length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_length_km|}}}
|(originally {{convert|{{{original_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_length_mi|}}}
|(originally {{convert|{{{original_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{length_note|}}}|({{{length_note}}})}}
}}
|{{{canal_length|}}}
}}
| label6 = Lock length
| data6 = {{#if: {{{lock_length_mi|}}}{{{lock_length_km|}}}
|{{br separated entries
|1 = {{#if:{{{lock_length_km|}}}
| {{convert|{{{lock_length_km}}}|km|mi|abbr=in}}
| {{convert|{{{lock_length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_lock_length_km|}}}
|(originally {{convert|{{{original_lock_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_lock_length_mi|}}}
|(originally {{convert|{{{original_lock_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_length_note|}}}|({{{lock_length_note}}})}}
}}
|{{{lock_length|}}}
}}
| label7 = Lock width
| data7 = {{#if: {{{lock_width_m|}}}{{{lock_width_ft|}}}
|{{br separated entries
|1 = {{#if:{{{lock_width_m|}}}
| {{convert|{{{lock_width_m}}}|m|ft|abbr=on}}
| {{convert|{{{lock_width_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{original_lock_width_m|}}}
|(originally {{convert|{{{original_lock_width_m}}}|m|ft|abbr=on|disp=or}})
|{{#if: {{{original_lock_width_ft|}}}
|(originally {{convert|{{{original_lock_width_ft}}}|ft|m|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_width_note|}}}|({{{lock_width_note}}})}}
}}
|{{{lock_width|}}}
}}
| label8 = {{longitem|Maximum [[Length overall|boat length]]}}
| data8 = {{#if: {{{len_ft|}}}{{{len_m|}}}
|{{br separated entries
|1 = {{#if:{{{len_m|}}}
|{{convert|{{{len_m}}}|m|ftin|abbr=on|sigfig=4}}
|{{convert|{{{len_ft|}}}|ft|{{{len_in|0}}}|in|m|abbr=on|sigfig=4}}
}}
|2 = {{#if: {{{original_boat_length_m|}}}
|(originally {{convert|{{{original_boat_length_m}}}|m|ftin|abbr=on|disp=or|sigfig=4}})
|{{#if: {{{original_boat_length_ft|}}}
|(originally {{convert|{{{original_boat_length_ft|}}}|ft|{{{original_boat_length_in|0}}}|in|m|abbr=on|disp=or|sigfig=4}})
}} }}
|3 = {{#if: {{{len_note|}}}|({{{len_note}}})}}
}}
| {{{max_boat_length|}}}
}}
| label9 = {{longitem|Maximum [[Beam (nautical)|boat beam]]}}
| data9 = {{#if: {{{beam_ft|}}}{{{beam_m|}}}
|{{br separated entries
|1 = {{#if:{{{beam_m|}}}
|{{convert|{{{beam_m}}}|m|ftin|abbr=on|sigfig=3}}
|{{convert|{{{beam_ft|}}}|ft|{{{beam_in|0}}}|in|m|abbr=on|sigfig=3}}
}}
|2 = {{#if: {{{original_beam_m|}}}
|(originally {{convert|{{{original_beam_m}}}|m|ftin|abbr=on|disp=or|sigfig=3}})
|{{#if: {{{original_beam_ft|}}}
|(originally {{convert|{{{original_beam_ft|}}}|ft|{{{original_beam_in|0}}}|in|m|abbr=on|disp=or|sigfig=3}})
}} }}
|3 = {{#if: {{{beam_note|}}}|({{{beam_note}}})}}
}}
| {{{max_boat_beam|}}}
}}
| label10 = {{longitem|Maximum [[Draft (hull)|boat draft]]}}
| data10 = {{{max_boat_draft|}}}
| label11 = {{longitem|Minimum boat draft}}
| data11 = {{{min_boat_draft|}}}
| label12 = {{longitem|Maximum [[air draft|boat air draft]]}}
| data12 = {{{max_boat_air_draft|}}}
| label13 = {{longitem|Minimum boat air draft}}
| data13 = {{{min_boat_air_draft|}}}
| label14 = Locks
| data14 = {{#if: {{{locks|}}}
|{{br separated entries
|1 = {{{locks}}}
|2 = {{#if: {{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
|3 = {{#if: {{{lock_note|}}}|({{{lock_note}}})}}
}}
|{{#if:{{{current_num_locks|}}}
|{{{current_num_locks|}}} {{#if:{{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
}}
}}
| label15 = {{longitem|Original number of locks}}<!-- suppressed if merged with field above -->
| data15 = {{#if:{{{current_num_locks|}}}{{{locks|}}}||{{{original_num_locks|}}}}}
| label16 = {{longitem|Number of lifts}}
| data16 = {{#if:{{{current_num_lifts|}}}|{{{current_num_lifts|}}}}}
| label17 = {{longitem|Maximum height [[AMSL]]}}
| data17 = {{#if: {{{elev_ft|}}}{{{elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{elev_m|}}}
| {{convert|{{{elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{elev_ft|}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{elev_note|}}}|({{{elev_note}}})}}
}}
| {{{max_elev|}}}
}}
| label18 = {{longitem|Minimum height [[AMSL]]}}
| data18 = {{#if: {{{min_elev_ft|}}}{{{min_elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{min_elev_m|}}}
| {{convert|{{{min_elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{min_elev_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{min_elev_note|}}}|({{{min_elev_note}}})}}
}}
| {{{min_elev|}}}
}}
| label19 = {{longitem|Total [[Lock (water navigation)#Rise|rise]]}}
| data19 = {{{total_rise|}}}
| label20 = Status
| data20 = {{{status|}}}
| label21 = {{longitem|Navigation authority}}
| data21 = {{{navigation_authority|}}}
| label22 = {{longitem|{{{xfield1}}}}}
| data22 = {{{xvalue1|}}}
| header23 = History
| label24 = Former names
| data24 = {{{former_names|}}}
| label25 = Modern name
| data25 = {{{modern_name|}}}
| label26 = Current owner
| data26 = {{{present_owner|}}}
| label27 = Original owner
| data27 = {{{original_owner|}}}
| label28 = {{longitem|Principal engineer}}
| data28 = {{{engineer|}}}
| label29 = Other engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}}
| data29 = {{{other_engineer|}}}
| label30 = Date approved
| data30 = {{{date_approved|}}}
| label31 = Date of act
| data31 = {{{date_act|}}}
| label32 = Construction began
| data32 = {{{date_began|}}}
| label33 = {{longitem|Date of first use}}
| data33 = {{{date_use|}}}
| label34 = Date completed
| data34 = {{{date_completed|}}}
| label35 = Date extended
| data35 = {{{date_extended|}}}
| label36 = Date closed
| data36 = {{{date_closed|}}}
| label37 = Date restored
| data37 = {{{date_restored|}}}
| label38 = {{longitem|{{{xfield2}}}}}
| data38 = {{{xvalue2|}}}
| header39 = Geography
| label40 = Direction
| data40 = {{{direction|}}}
| label41 = Start point
| data41 = {{#if: {{{start_point|}}}
|{{br separated entries
|1 = {{{start_point}}}
|2 = {{#if: {{{original_start|}}}|(originally {{{original_start}}})}}
|3 = {{#if: {{{start_note|}}}|({{{start_note}}})}}
}}
}}
| label42 = End point
| data42 = {{#if: {{{end_point|}}}
|{{br separated entries
|1 = {{{end_point}}}
|2 = {{#if: {{{original_end|}}}|(originally {{{original_end}}})}}
|3 = {{#if: {{{end_note|}}}|({{{end_note}}})}}
}}
}}
| label43 = {{longitem|Beginning coordinates}}
| data43 = {{{begin_coord|}}}
| label44 = {{longitem|Ending coordinates}}
| data44 = {{{end_coord|}}}
| label45 = Branch{{pluralize from text|{{{branch|}}}|plural=es}}
| data45 = {{{branch|}}}
| label46 = Branch of
| data46 = {{{branch_of|}}}
| label47 = Connects to
| data47 = {{{connects_to|}}}
| label48 = {{longitem|{{{xfield3}}}}}
| data48 = {{{xvalue3|}}}
| below = {{#if:{{{routemap|}}}|{{infobox
| bodystyle = {{Subinfobox bodystyle}}
| bodyclass = collapsible {{{routemap_state|}}}
| headerstyle = background-color: #CEDEFF; color:inherit;
| header1 = {{#if:{{{routemap_name|}}}|{{{routemap_name}}}|Route map}}
| data2 = {{{routemap}}}
}}
}}
| header49 = _BLANK_
| data50 = {{{module|}}}
}}</includeonly><noinclude>
{{Dokumentacija}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
6v3v9jq8kj4k2a0nsar5wb6jlt1mdc9
49247
49246
2026-11-11T08:17:49Z
Ilja isv
10
49247
wikitext
text/x-wiki
<includeonly>{{Kartka
| bodyclass = vcard
| aboveclass = fn org
| abovestyle = font-size: larger; background-color: #CEDEFF; color:inherit;
| autoheaders = yes
| headerstyle = background-color: #CEDEFF; color:inherit;
| above = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|sizedefault=288px|alt={{{alt|}}}}}
| caption = {{{image_caption|}}}
| image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{map|}}}|size={{{map_size|}}}|sizedefault=frameless|alt={{{map_alt|}}}}}
| caption2 = {{{map_caption|}}}
| image3 = {{#invoke:Location map|infobox_pushpin_map}}
| image4 = {{#invoke:Infobox mapframe
| autoWithCaption
| onByDefault = {{#if:{{{map|}}}{{{pushpin_map|}}}|no|yes}}
| mapframe-length_km = {{{length_km|}}}
| mapframe-length_mi = {{{length_mi|}}}
| mapframe-stroke-color = #0000ff
| mapframe-caption = Interactive map of {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| label1 = Městopoloženje
| data1 = {{{location|}}}
| label2 = Država
| data2 = {{{country|}}}
| label3 = Koordinaty
| data3 = {{{coordinates|}}}
| header4 = Parametry
| label5 = Dolžina
| data5 = {{#if: {{{length_mi|}}}{{{length_km|}}}
|{{br separated entries
|1 = {{#if:{{{length_km|}}}
| {{convert|{{{length_km}}}|km|mi|abbr=in}}
| {{convert|{{{length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_length_km|}}}
|(originally {{convert|{{{original_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_length_mi|}}}
|(originally {{convert|{{{original_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{length_note|}}}|({{{length_note}}})}}
}}
|{{{canal_length|}}}
}}
| label6 = Dolžina [[Šljuz|šljuzov]]
| data6 = {{#if: {{{lock_length_mi|}}}{{{lock_length_km|}}}
|{{br separated entries
|1 = {{#if:{{{lock_length_km|}}}
| {{convert|{{{lock_length_km}}}|km|mi|abbr=in}}
| {{convert|{{{lock_length_mi|}}}|mi|km}}
}}
|2 = {{#if: {{{original_lock_length_km|}}}
|(originally {{convert|{{{original_lock_length_km}}}|km|mi|abbr=on|disp=or}})
|{{#if: {{{original_lock_length_mi|}}}
|(originally {{convert|{{{original_lock_length_mi}}}|mi|km|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_length_note|}}}|({{{lock_length_note}}})}}
}}
|{{{lock_length|}}}
}}
| label7 = Širina [[Šljuz|šljuzov]]
| data7 = {{#if: {{{lock_width_m|}}}{{{lock_width_ft|}}}
|{{br separated entries
|1 = {{#if:{{{lock_width_m|}}}
| {{convert|{{{lock_width_m}}}|m|ft|abbr=on}}
| {{convert|{{{lock_width_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{original_lock_width_m|}}}
|(originally {{convert|{{{original_lock_width_m}}}|m|ft|abbr=on|disp=or}})
|{{#if: {{{original_lock_width_ft|}}}
|(originally {{convert|{{{original_lock_width_ft}}}|ft|m|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_width_note|}}}|({{{lock_width_note}}})}}
}}
|{{{lock_width|}}}
}}
| label8 = {{longitem|Najboljša [[dolžina lodi]]}}
| data8 = {{#if: {{{len_ft|}}}{{{len_m|}}}
|{{br separated entries
|1 = {{#if:{{{len_m|}}}
|{{convert|{{{len_m}}}|m|ftin|abbr=on|sigfig=4}}
|{{convert|{{{len_ft|}}}|ft|{{{len_in|0}}}|in|m|abbr=on|sigfig=4}}
}}
|2 = {{#if: {{{original_boat_length_m|}}}
|(originally {{convert|{{{original_boat_length_m}}}|m|ftin|abbr=on|disp=or|sigfig=4}})
|{{#if: {{{original_boat_length_ft|}}}
|(originally {{convert|{{{original_boat_length_ft|}}}|ft|{{{original_boat_length_in|0}}}|in|m|abbr=on|disp=or|sigfig=4}})
}} }}
|3 = {{#if: {{{len_note|}}}|({{{len_note}}})}}
}}
| {{{max_boat_length|}}}
}}
| label9 = {{longitem|Najboljša [[cělkova širina lodi]]}}
| data9 = {{#if: {{{beam_ft|}}}{{{beam_m|}}}
|{{br separated entries
|1 = {{#if:{{{beam_m|}}}
|{{convert|{{{beam_m}}}|m|ftin|abbr=on|sigfig=3}}
|{{convert|{{{beam_ft|}}}|ft|{{{beam_in|0}}}|in|m|abbr=on|sigfig=3}}
}}
|2 = {{#if: {{{original_beam_m|}}}
|(originally {{convert|{{{original_beam_m}}}|m|ftin|abbr=on|disp=or|sigfig=3}})
|{{#if: {{{original_beam_ft|}}}
|(originally {{convert|{{{original_beam_ft|}}}|ft|{{{original_beam_in|0}}}|in|m|abbr=on|disp=or|sigfig=3}})
}} }}
|3 = {{#if: {{{beam_note|}}}|({{{beam_note}}})}}
}}
| {{{max_boat_beam|}}}
}}
| label10 = {{longitem|Najboljša [[osadka lodi]]]]}}
| data10 = {{{max_boat_draft|}}}
| label11 = {{longitem|Najmenša [[osadka lodi]]}}
| data11 = {{{min_boat_draft|}}}
| label12 = {{longitem|Najboljša [[vyšina lodi nad vaterlinijeju]]}}
| data12 = {{{max_boat_air_draft|}}}
| label13 = {{longitem|Najmenša [[vyšina lodi nad vaterlinijeju]]}}
| data13 = {{{min_boat_air_draft|}}}
| label14 = Šljuzy
| data14 = {{#if: {{{locks|}}}
|{{br separated entries
|1 = {{{locks}}}
|2 = {{#if: {{{original_num_locks|}}}|(prvonačelno {{{original_num_locks}}})}}
|3 = {{#if: {{{lock_note|}}}|({{{lock_note}}})}}
}}
|{{#if:{{{current_num_locks|}}}
|{{{current_num_locks|}}} {{#if:{{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
}}
}}
| label15 = {{longitem|Original number of locks}}<!-- suppressed if merged with field above -->
| data15 = {{#if:{{{current_num_locks|}}}{{{locks|}}}||{{{original_num_locks|}}}}}
| label16 = {{longitem|Number of lifts}}
| data16 = {{#if:{{{current_num_lifts|}}}|{{{current_num_lifts|}}}}}
| label17 = {{longitem|Maximum height [[AMSL]]}}
| data17 = {{#if: {{{elev_ft|}}}{{{elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{elev_m|}}}
| {{convert|{{{elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{elev_ft|}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{elev_note|}}}|({{{elev_note}}})}}
}}
| {{{max_elev|}}}
}}
| label18 = {{longitem|Minimum height [[AMSL]]}}
| data18 = {{#if: {{{min_elev_ft|}}}{{{min_elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{min_elev_m|}}}
| {{convert|{{{min_elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{min_elev_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{min_elev_note|}}}|({{{min_elev_note}}})}}
}}
| {{{min_elev|}}}
}}
| label19 = {{longitem|Total [[Lock (water navigation)#Rise|rise]]}}
| data19 = {{{total_rise|}}}
| label20 = Status
| data20 = {{{status|}}}
| label21 = {{longitem|Navigation authority}}
| data21 = {{{navigation_authority|}}}
| label22 = {{longitem|{{{xfield1}}}}}
| data22 = {{{xvalue1|}}}
| header23 = History
| label24 = Former names
| data24 = {{{former_names|}}}
| label25 = Modern name
| data25 = {{{modern_name|}}}
| label26 = Current owner
| data26 = {{{present_owner|}}}
| label27 = Original owner
| data27 = {{{original_owner|}}}
| label28 = {{longitem|Principal engineer}}
| data28 = {{{engineer|}}}
| label29 = Other engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}}
| data29 = {{{other_engineer|}}}
| label30 = Date approved
| data30 = {{{date_approved|}}}
| label31 = Date of act
| data31 = {{{date_act|}}}
| label32 = Construction began
| data32 = {{{date_began|}}}
| label33 = {{longitem|Date of first use}}
| data33 = {{{date_use|}}}
| label34 = Date completed
| data34 = {{{date_completed|}}}
| label35 = Date extended
| data35 = {{{date_extended|}}}
| label36 = Date closed
| data36 = {{{date_closed|}}}
| label37 = Date restored
| data37 = {{{date_restored|}}}
| label38 = {{longitem|{{{xfield2}}}}}
| data38 = {{{xvalue2|}}}
| header39 = Geography
| label40 = Direction
| data40 = {{{direction|}}}
| label41 = Start point
| data41 = {{#if: {{{start_point|}}}
|{{br separated entries
|1 = {{{start_point}}}
|2 = {{#if: {{{original_start|}}}|(originally {{{original_start}}})}}
|3 = {{#if: {{{start_note|}}}|({{{start_note}}})}}
}}
}}
| label42 = End point
| data42 = {{#if: {{{end_point|}}}
|{{br separated entries
|1 = {{{end_point}}}
|2 = {{#if: {{{original_end|}}}|(originally {{{original_end}}})}}
|3 = {{#if: {{{end_note|}}}|({{{end_note}}})}}
}}
}}
| label43 = {{longitem|Beginning coordinates}}
| data43 = {{{begin_coord|}}}
| label44 = {{longitem|Ending coordinates}}
| data44 = {{{end_coord|}}}
| label45 = Branch{{pluralize from text|{{{branch|}}}|plural=es}}
| data45 = {{{branch|}}}
| label46 = Branch of
| data46 = {{{branch_of|}}}
| label47 = Connects to
| data47 = {{{connects_to|}}}
| label48 = {{longitem|{{{xfield3}}}}}
| data48 = {{{xvalue3|}}}
| below = {{#if:{{{routemap|}}}|{{infobox
| bodystyle = {{Subinfobox bodystyle}}
| bodyclass = collapsible {{{routemap_state|}}}
| headerstyle = background-color: #CEDEFF; color:inherit;
| header1 = {{#if:{{{routemap_name|}}}|{{{routemap_name}}}|Route map}}
| data2 = {{{routemap}}}
}}
}}
| header49 = _BLANK_
| data50 = {{{module|}}}
}}</includeonly><noinclude>
{{Dokumentacija}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
b4wunt9gioohokwdtg53xcyosatd5ad
49249
49247
2026-11-11T08:22:44Z
Ilja isv
10
49249
wikitext
text/x-wiki
<includeonly>{{Kartka
| bodyclass = vcard
| aboveclass = fn org
| abovestyle = font-size: larger; background-color: #CEDEFF; color:inherit;
| autoheaders = yes
| headerstyle = background-color: #CEDEFF; color:inherit;
| above = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|sizedefault=288px|alt={{{alt|}}}}}
| caption = {{{image_caption|}}}
| image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{map|}}}|size={{{map_size|}}}|sizedefault=frameless|alt={{{map_alt|}}}}}
| caption2 = {{{map_caption|}}}
| image3 = {{#invoke:Location map|infobox_pushpin_map}}
| image4 = {{#invoke:Infobox mapframe
| autoWithCaption
| onByDefault = {{#if:{{{map|}}}{{{pushpin_map|}}}|no|yes}}
| mapframe-length_km = {{{length_km|}}}
| mapframe-length_mi = {{{length_mi|}}}
| mapframe-stroke-color = #0000ff
| mapframe-caption = Interaktivna mapa
}}
| label1 = Městopoloženje
| data1 = {{{location|}}}
| label2 = Država
| data2 = {{{country|}}}
| label3 = Koordinaty
| data3 = {{{coordinates|}}}
| header4 = Parametry
| label5 = Dolžina
| data5 = {{#if: {{{length_mi|}}}{{{length_km|}}}
|{{br separated entries
|1 = {{#if:{{{length_km|}}}
| {{{length_km}}} km
| {{{length_mi|}}} km
}}
|2 = {{#if: {{{original_length_km|}}}
|(prvonačelno {{{original_length_km}}} km)
|{{#if: {{{original_length_mi|}}}
|(prvonačelno {{{original_length_mi}}} km)
}} }}
|3 = {{#if: {{{length_note|}}}|({{{length_note}}})}}
}}
|{{{canal_length|}}}
}}
| label6 = Dolžina [[Šljuz|šljuzov]]
| data6 = {{#if: {{{lock_length_mi|}}}{{{lock_length_km|}}}
|{{br separated entries
|1 = {{#if:{{{lock_length_km|}}}
| {{{lock_length_km}}} km
| {{{lock_length_mi|}}} km
}}
|2 = {{#if: {{{original_lock_length_km|}}}
|(originally {{{original_lock_length_km}}} km
|{{#if: {{{original_lock_length_mi|}}}
|(originally {{{original_lock_length_mi}}} km
}} }}
|3 = {{#if: {{{lock_length_note|}}}|({{{lock_length_note}}})}}
}}
|{{{lock_length|}}}
}}
| label7 = Širina [[Šljuz|šljuzov]]
| data7 = {{#if: {{{lock_width_m|}}}{{{lock_width_ft|}}}
|{{br separated entries
|1 = {{#if:{{{lock_width_m|}}}
| {{convert|{{{lock_width_m}}}|m|ft|abbr=on}}
| {{convert|{{{lock_width_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{original_lock_width_m|}}}
|(originally {{convert|{{{original_lock_width_m}}}|m|ft|abbr=on|disp=or}})
|{{#if: {{{original_lock_width_ft|}}}
|(originally {{convert|{{{original_lock_width_ft}}}|ft|m|abbr=on|disp=or}})
}} }}
|3 = {{#if: {{{lock_width_note|}}}|({{{lock_width_note}}})}}
}}
|{{{lock_width|}}}
}}
| label8 = {{longitem|Najboljša [[dolžina lodi]]}}
| data8 = {{#if: {{{len_ft|}}}{{{len_m|}}}
|{{br separated entries
|1 = {{#if:{{{len_m|}}}
|{{convert|{{{len_m}}}|m|ftin|abbr=on|sigfig=4}}
|{{convert|{{{len_ft|}}}|ft|{{{len_in|0}}}|in|m|abbr=on|sigfig=4}}
}}
|2 = {{#if: {{{original_boat_length_m|}}}
|(originally {{convert|{{{original_boat_length_m}}}|m|ftin|abbr=on|disp=or|sigfig=4}})
|{{#if: {{{original_boat_length_ft|}}}
|(originally {{convert|{{{original_boat_length_ft|}}}|ft|{{{original_boat_length_in|0}}}|in|m|abbr=on|disp=or|sigfig=4}})
}} }}
|3 = {{#if: {{{len_note|}}}|({{{len_note}}})}}
}}
| {{{max_boat_length|}}}
}}
| label9 = {{longitem|Najboljša [[cělkova širina lodi]]}}
| data9 = {{#if: {{{beam_ft|}}}{{{beam_m|}}}
|{{br separated entries
|1 = {{#if:{{{beam_m|}}}
|{{convert|{{{beam_m}}}|m|ftin|abbr=on|sigfig=3}}
|{{convert|{{{beam_ft|}}}|ft|{{{beam_in|0}}}|in|m|abbr=on|sigfig=3}}
}}
|2 = {{#if: {{{original_beam_m|}}}
|(originally {{convert|{{{original_beam_m}}}|m|ftin|abbr=on|disp=or|sigfig=3}})
|{{#if: {{{original_beam_ft|}}}
|(originally {{convert|{{{original_beam_ft|}}}|ft|{{{original_beam_in|0}}}|in|m|abbr=on|disp=or|sigfig=3}})
}} }}
|3 = {{#if: {{{beam_note|}}}|({{{beam_note}}})}}
}}
| {{{max_boat_beam|}}}
}}
| label10 = {{longitem|Najboljša [[osadka lodi]]]]}}
| data10 = {{{max_boat_draft|}}}
| label11 = {{longitem|Najmenša [[osadka lodi]]}}
| data11 = {{{min_boat_draft|}}}
| label12 = {{longitem|Najboljša [[vyšina lodi nad vaterlinijeju]]}}
| data12 = {{{max_boat_air_draft|}}}
| label13 = {{longitem|Najmenša [[vyšina lodi nad vaterlinijeju]]}}
| data13 = {{{min_boat_air_draft|}}}
| label14 = Šljuzy
| data14 = {{#if: {{{locks|}}}
|{{br separated entries
|1 = {{{locks}}}
|2 = {{#if: {{{original_num_locks|}}}|(prvonačelno {{{original_num_locks}}})}}
|3 = {{#if: {{{lock_note|}}}|({{{lock_note}}})}}
}}
|{{#if:{{{current_num_locks|}}}
|{{{current_num_locks|}}} {{#if:{{{original_num_locks|}}}|(originally {{{original_num_locks}}})}}
}}
}}
| label15 = {{longitem|Original number of locks}}<!-- suppressed if merged with field above -->
| data15 = {{#if:{{{current_num_locks|}}}{{{locks|}}}||{{{original_num_locks|}}}}}
| label16 = {{longitem|Number of lifts}}
| data16 = {{#if:{{{current_num_lifts|}}}|{{{current_num_lifts|}}}}}
| label17 = {{longitem|Maximum height [[AMSL]]}}
| data17 = {{#if: {{{elev_ft|}}}{{{elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{elev_m|}}}
| {{convert|{{{elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{elev_ft|}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{elev_note|}}}|({{{elev_note}}})}}
}}
| {{{max_elev|}}}
}}
| label18 = {{longitem|Minimum height [[AMSL]]}}
| data18 = {{#if: {{{min_elev_ft|}}}{{{min_elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{min_elev_m|}}}
| {{convert|{{{min_elev_m}}}|m|ft|abbr=on}}
| {{convert|{{{min_elev_ft}}}|ft|m|abbr=on}}
}}
|2 = {{#if: {{{min_elev_note|}}}|({{{min_elev_note}}})}}
}}
| {{{min_elev|}}}
}}
| label19 = {{longitem|Total [[Lock (water navigation)#Rise|rise]]}}
| data19 = {{{total_rise|}}}
| label20 = Status
| data20 = {{{status|}}}
| label21 = {{longitem|Navigation authority}}
| data21 = {{{navigation_authority|}}}
| label22 = {{longitem|{{{xfield1}}}}}
| data22 = {{{xvalue1|}}}
| header23 = History
| label24 = Former names
| data24 = {{{former_names|}}}
| label25 = Modern name
| data25 = {{{modern_name|}}}
| label26 = Current owner
| data26 = {{{present_owner|}}}
| label27 = Original owner
| data27 = {{{original_owner|}}}
| label28 = {{longitem|Principal engineer}}
| data28 = {{{engineer|}}}
| label29 = Other engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}}
| data29 = {{{other_engineer|}}}
| label30 = Date approved
| data30 = {{{date_approved|}}}
| label31 = Date of act
| data31 = {{{date_act|}}}
| label32 = Construction began
| data32 = {{{date_began|}}}
| label33 = {{longitem|Date of first use}}
| data33 = {{{date_use|}}}
| label34 = Date completed
| data34 = {{{date_completed|}}}
| label35 = Date extended
| data35 = {{{date_extended|}}}
| label36 = Date closed
| data36 = {{{date_closed|}}}
| label37 = Date restored
| data37 = {{{date_restored|}}}
| label38 = {{longitem|{{{xfield2}}}}}
| data38 = {{{xvalue2|}}}
| header39 = Geography
| label40 = Direction
| data40 = {{{direction|}}}
| label41 = Start point
| data41 = {{#if: {{{start_point|}}}
|{{br separated entries
|1 = {{{start_point}}}
|2 = {{#if: {{{original_start|}}}|(originally {{{original_start}}})}}
|3 = {{#if: {{{start_note|}}}|({{{start_note}}})}}
}}
}}
| label42 = End point
| data42 = {{#if: {{{end_point|}}}
|{{br separated entries
|1 = {{{end_point}}}
|2 = {{#if: {{{original_end|}}}|(originally {{{original_end}}})}}
|3 = {{#if: {{{end_note|}}}|({{{end_note}}})}}
}}
}}
| label43 = {{longitem|Beginning coordinates}}
| data43 = {{{begin_coord|}}}
| label44 = {{longitem|Ending coordinates}}
| data44 = {{{end_coord|}}}
| label45 = Branch{{pluralize from text|{{{branch|}}}|plural=es}}
| data45 = {{{branch|}}}
| label46 = Branch of
| data46 = {{{branch_of|}}}
| label47 = Connects to
| data47 = {{{connects_to|}}}
| label48 = {{longitem|{{{xfield3}}}}}
| data48 = {{{xvalue3|}}}
| below = {{#if:{{{routemap|}}}|{{infobox
| bodystyle = {{Subinfobox bodystyle}}
| bodyclass = collapsible {{{routemap_state|}}}
| headerstyle = background-color: #CEDEFF; color:inherit;
| header1 = {{#if:{{{routemap_name|}}}|{{{routemap_name}}}|Route map}}
| data2 = {{{routemap}}}
}}
}}
| header49 = _BLANK_
| data50 = {{{module|}}}
}}</includeonly><noinclude>
{{Dokumentacija}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
o0y7vooiqhofyj890y9wygn6ni9kr5e
49250
49249
2026-11-11T08:34:27Z
Ilja isv
10
49250
wikitext
text/x-wiki
<includeonly>{{Kartka
| bodyclass = vcard
| aboveclass = fn org
| abovestyle = font-size: larger; background-color: #CEDEFF; color:inherit;
| autoheaders = yes
| headerstyle = background-color: #CEDEFF; color:inherit;
| above = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|sizedefault=288px|alt={{{alt|}}}}}
| caption = {{{image_caption|}}}
| image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{map|}}}|size={{{map_size|}}}|sizedefault=frameless|alt={{{map_alt|}}}}}
| caption2 = {{{map_caption|}}}
| image3 = {{#invoke:Location map|infobox_pushpin_map}}
| image4 = {{#invoke:Infobox mapframe
| autoWithCaption
| onByDefault = {{#if:{{{map|}}}{{{pushpin_map|}}}|no|yes}}
| mapframe-length_km = {{{length_km|}}}
| mapframe-length_mi = {{{length_mi|}}}
| mapframe-stroke-color = #0000ff
| mapframe-caption = Interaktivna mapa
}}
| label1 = Městopoloženje
| data1 = {{{location|}}}
| label2 = Država
| data2 = {{{country|}}}
| label3 = Koordinaty
| data3 = {{{coordinates|}}}
| header4 = Parametry
| label5 = Dolžina
| data5 = {{#if: {{{length_mi|}}}{{{length_km|}}}
|{{br separated entries
|1 = {{#if:{{{length_km|}}}
| {{{length_km}}} km
| {{{length_mi|}}} mil
}}
|2 = {{#if: {{{original_length_km|}}}
|(prvonačelno {{{original_length_km}}} km)
|{{#if: {{{original_length_mi|}}}
|(prvonačelno {{{original_length_mi}}} mil)
}} }}
|3 = {{#if: {{{length_note|}}}|({{{length_note}}})}}
}}
|{{{canal_length|}}}
}}
| label6 = Dolžina [[Šljuz|šljuzov]]
| data6 = {{#if: {{{lock_length_mi|}}}{{{lock_length_km|}}}
|{{br separated entries
|1 = {{#if:{{{lock_length_km|}}}
| {{{lock_length_km}}} km
| {{{lock_length_mi|}}} mi
}}
|2 = {{#if: {{{original_lock_length_km|}}}
|(prvonačelno {{{original_lock_length_km}}} km
|{{#if: {{{original_lock_length_mi|}}}
|(prvonačelno {{{original_lock_length_mi}}} mi
}} }}
|3 = {{#if: {{{lock_length_note|}}}|({{{lock_length_note}}})}}
}}
|{{{lock_length|}}}
}}
| label7 = Širina [[Šljuz|šljuzov]]
| data7 = {{#if: {{{lock_width_m|}}}{{{lock_width_ft|}}}
|{{br separated entries
|1 = {{#if:{{{lock_width_m|}}}
| {{{lock_width_m}}} m
| {{{lock_width_ft}}} ft
}}
|2 = {{#if: {{{original_lock_width_m|}}}
|(prvonačelno {{{original_lock_width_m}}} m)
|{{#if: {{{original_lock_width_ft|}}}
|(prvonačelno {{original_lock_width_ft}}} ft)
}} }}
|3 = {{#if: {{{lock_width_note|}}}|({{{lock_width_note}}})}}
}}
|{{{lock_width|}}}
}}
| label8 = {{longitem|Najboljša [[dolžina lodi]]}}
| data8 = {{#if: {{{len_ft|}}}{{{len_m|}}}
|{{br separated entries
|1 = {{#if:{{{len_m|}}}
|{{{len_m}}} m
|{{{len_ft|}}} ft
}}
|2 = {{#if: {{{original_boat_length_m|}}}
|(prvonačelno {{{original_boat_length_m}}} m)
|{{#if: {{{original_boat_length_ft|}}}
|(prvonačelno {{{original_boat_length_ft|}}} ft {{{original_boat_length_in|0}}} in)
}} }}
|3 = {{#if: {{{len_note|}}}|({{{len_note}}})}}
}}
| {{{max_boat_length|}}}
}}
| label9 = {{longitem|Najboljša [[cělkova širina lodi]]}}
| data9 = {{#if: {{{beam_ft|}}}{{{beam_m|}}}
|{{br separated entries
|1 = {{#if:{{{beam_m|}}}
|{{{beam_m}}} m
|{{{beam_ft|}}} ft
}}
|2 = {{#if: {{{original_beam_m|}}}
|(prvonačelno {{{original_beam_m}}} m)
|{{#if: {{{original_beam_ft|}}}
|(prvonačelno {{{original_beam_ft|}}} ft {{{original_beam_in|0}}} in)
}} }}
|3 = {{#if: {{{beam_note|}}}|({{{beam_note}}})}}
}}
| {{{max_boat_beam|}}}
}}
| label10 = {{longitem|Najboljša [[osadka lodi]]]]}}
| data10 = {{{max_boat_draft|}}}
| label11 = {{longitem|Najmenša [[osadka lodi]]}}
| data11 = {{{min_boat_draft|}}}
| label12 = {{longitem|Najboljša [[vyšina lodi nad vaterlinijeju]]}}
| data12 = {{{max_boat_air_draft|}}}
| label13 = {{longitem|Najmenša [[vyšina lodi nad vaterlinijeju]]}}
| data13 = {{{min_boat_air_draft|}}}
| label14 = Šljuzy
| data14 = {{#if: {{{locks|}}}
|{{br separated entries
|1 = {{{locks}}}
|2 = {{#if: {{{original_num_locks|}}}|(prvonačelno {{{original_num_locks}}})}}
|3 = {{#if: {{{lock_note|}}}|({{{lock_note}}})}}
}}
|{{#if:{{{current_num_locks|}}}
|{{{current_num_locks|}}} {{#if:{{{original_num_locks|}}}|(prvonačelno {{{original_num_locks}}})}}
}}
}}
| label15 = {{longitem|Original number of locks}}<!-- suppressed if merged with field above -->
| data15 = {{#if:{{{current_num_locks|}}}{{{locks|}}}||{{{original_num_locks|}}}}}
| label16 = {{longitem|Number of lifts}}
| data16 = {{#if:{{{current_num_lifts|}}}|{{{current_num_lifts|}}}}}
| label17 = {{longitem|Maximum height [[AMSL]]}}
| data17 = {{#if: {{{elev_ft|}}}{{{elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{elev_m|}}}
| {{{elev_m}}} m
| {{{elev_ft|}}} ft
}}
|2 = {{#if: {{{elev_note|}}}|({{{elev_note}}})}}
}}
| {{{max_elev|}}}
}}
| label18 = {{longitem|Minimum height [[AMSL]]}}
| data18 = {{#if: {{{min_elev_ft|}}}{{{min_elev_m|}}}
|{{br separated entries
|1 = {{#if:{{{min_elev_m|}}}
| {{{min_elev_m}}} m
| {{{min_elev_ft}}} ft
}}
|2 = {{#if: {{{min_elev_note|}}}|({{{min_elev_note}}})}}
}}
| {{{min_elev|}}}
}}
| label19 = {{longitem|Total [[Lock (water navigation)#Rise|rise]]}}
| data19 = {{{total_rise|}}}
| label20 = Status
| data20 = {{{status|}}}
| label21 = {{longitem|Navigation authority}}
| data21 = {{{navigation_authority|}}}
| label22 = {{longitem|{{{xfield1}}}}}
| data22 = {{{xvalue1|}}}
| header23 = History
| label24 = Former names
| data24 = {{{former_names|}}}
| label25 = Modern name
| data25 = {{{modern_name|}}}
| label26 = Current owner
| data26 = {{{present_owner|}}}
| label27 = Original owner
| data27 = {{{original_owner|}}}
| label28 = {{longitem|Principal engineer}}
| data28 = {{{engineer|}}}
| label29 = Other engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}}
| data29 = {{{other_engineer|}}}
| label30 = Date approved
| data30 = {{{date_approved|}}}
| label31 = Date of act
| data31 = {{{date_act|}}}
| label32 = Construction began
| data32 = {{{date_began|}}}
| label33 = {{longitem|Date of first use}}
| data33 = {{{date_use|}}}
| label34 = Date completed
| data34 = {{{date_completed|}}}
| label35 = Date extended
| data35 = {{{date_extended|}}}
| label36 = Date closed
| data36 = {{{date_closed|}}}
| label37 = Date restored
| data37 = {{{date_restored|}}}
| label38 = {{longitem|{{{xfield2}}}}}
| data38 = {{{xvalue2|}}}
| header39 = Geography
| label40 = Direction
| data40 = {{{direction|}}}
| label41 = Start point
| data41 = {{#if: {{{start_point|}}}
|{{br separated entries
|1 = {{{start_point}}}
|2 = {{#if: {{{original_start|}}}|(prvonačelno {{{original_start}}})}}
|3 = {{#if: {{{start_note|}}}|({{{start_note}}})}}
}}
}}
| label42 = End point
| data42 = {{#if: {{{end_point|}}}
|{{br separated entries
|1 = {{{end_point}}}
|2 = {{#if: {{{original_end|}}}|(prvonačelno {{{original_end}}})}}
|3 = {{#if: {{{end_note|}}}|({{{end_note}}})}}
}}
}}
| label43 = {{longitem|Beginning coordinates}}
| data43 = {{{begin_coord|}}}
| label44 = {{longitem|Ending coordinates}}
| data44 = {{{end_coord|}}}
| label45 = Branch{{pluralize from text|{{{branch|}}}|plural=es}}
| data45 = {{{branch|}}}
| label46 = Branch of
| data46 = {{{branch_of|}}}
| label47 = Connects to
| data47 = {{{connects_to|}}}
| label48 = {{longitem|{{{xfield3}}}}}
| data48 = {{{xvalue3|}}}
| below = {{#if:{{{routemap|}}}|{{infobox
| bodystyle = {{Subinfobox bodystyle}}
| bodyclass = collapsible {{{routemap_state|}}}
| headerstyle = background-color: #CEDEFF; color:inherit;
| header1 = {{#if:{{{routemap_name|}}}|{{{routemap_name}}}|Route map}}
| data2 = {{{routemap}}}
}}
}}
| header49 = _BLANK_
| data50 = {{{module|}}}
}}</includeonly><noinclude>
{{Dokumentacija}}<!-- Add categories to the /doc subpage, interwikis to Wikidata, not here -->
</noinclude>
10tghtvywkenthsgubx1qxg0v7mtl48
Modul:Infobox mapframe
828
6561
49243
2026-11-11T07:50:49Z
Ilja isv
10
Stvorjena nova stranica s tekstom: «local mf = require('Module:Mapframe') local getArgs = require('Module:Arguments').getArgs local yesno = require('Module:Yesno') local infoboxImage = require('Module:InfoboxImage').InfoboxImage -- Defaults local DEFAULT_FRAME_WIDTH = "270" local DEFAULT_FRAME_HEIGHT = "200" local DEFAULT_ZOOM = 10 local DEFAULT_GEOMASK_STROKE_WIDTH = "1" local DEFAULT_GEOMASK_STROKE_COLOR = "#777777" local DEFAULT_GEOMASK_FILL = "#888888" local DEFAULT_GEOMASK_FILL_OPA...»
49243
Scribunto
text/plain
local mf = require('Module:Mapframe')
local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local infoboxImage = require('Module:InfoboxImage').InfoboxImage
-- Defaults
local DEFAULT_FRAME_WIDTH = "270"
local DEFAULT_FRAME_HEIGHT = "200"
local DEFAULT_ZOOM = 10
local DEFAULT_GEOMASK_STROKE_WIDTH = "1"
local DEFAULT_GEOMASK_STROKE_COLOR = "#777777"
local DEFAULT_GEOMASK_FILL = "#888888"
local DEFAULT_GEOMASK_FILL_OPACITY = "0.25"
local DEFAULT_SHAPE_STROKE_WIDTH = "2"
local DEFAULT_SHAPE_STROKE_COLOR = "#FF0000"
local DEFAULT_SHAPE_FILL = "#606060"
local DEFAULT_SHAPE_FILL_OPACITY = "0.1"
local DEFAULT_LINE_STROKE_WIDTH = "5"
local DEFAULT_LINE_STROKE_COLOR = "#FF0000"
local DEFAULT_MARKER_COLOR = "#5E74F3"
local util = {}
function util.noop(info)
local DEFAULT_NOOP_OUTPUT = ""
-- uncomment this when debugging
-- DEFAULT_NOOP_OUTPUT = "debug: mapframe no-op: " .. info
-- mw.log(DEFAULT_NOOP_OUTPUT)
return DEFAULT_NOOP_OUTPUT
end
-- Trim whitespace from args, and remove empty args
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
cleanArgs[key] = val
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
function util.getBestStatement(item_id, property_id)
if not(item_id) or not(mw.wikibase.isValidEntityId(item_id)) or not(mw.wikibase.entityExists(item_id)) then
return false
end
local statements = mw.wikibase.getBestStatements(item_id, property_id)
if not statements or #statements == 0 then
return false
end
local hasNoValue = ( statements[1].mainsnak and statements[1].mainsnak.snaktype == 'novalue' )
if hasNoValue then
return false
end
return statements[1]
end
function util.hasWikidataProperty(item_id, property_id)
return util.getBestStatement(item_id, property_id) and true or false
end
function util.getStatementValue(statement)
return statement and statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value or nil
end
function util.relatedEntity(item_id, property_id)
local value = util.getStatementValue( util.getBestStatement(item_id, property_id) )
return value and value.id or false
end
function util.idType(id)
if not id then
return nil
elseif mw.ustring.match(id, "[Pp]%d+") then
return "property"
elseif mw.ustring.match(id, "[Qq]%d+") then
return "item"
else
return nil
end
end
function util.shouldAutoRun(frame)
-- Check if should be running
local pargs = frame.getParent(frame).args
local explicitlyOn = yesno(mw.text.trim(pargs.mapframe or "")) -- true of false or nil
if pargs.coordinates == "{{{coordinates}}}" then explicitlyOn = false end
if type(pargs.coordinates) == 'string' and string.match(pargs.coordinates, 'coord.missing') then explicitlyOn = false end
local onByDefault = (explicitlyOn == nil) and yesno(mw.text.trim(frame.args.onByDefault or ""), false) -- true or false
return explicitlyOn or onByDefault
end
function util.argsFromAuto(frame)
-- Get args from the frame (invoke call) and the parent (template call).
-- Frame arguments are default values which are overridden by parent values
-- when both are present
local args = getArgs(frame, {parentFirst = true})
-- Discard args not prefixed with "mapframe-", remove that prefix from those that remain
local fixedArgs = {}
for name, val in pairs(args) do
local fixedName = string.match(name, "^mapframe%-(.+)$" )
if fixedName then
fixedArgs[fixedName] = val
-- allow coord, coordinates, etc to be unprefixed
elseif name == "coordinates" or name == "coordinate" and not fixedArgs.coord then
fixedArgs.coord = val
-- allow id, qid to be unprefixed, map to id (if not already present)
elseif name == "id" or name == "qid" and not fixedArgs.id then
fixedArgs.id = val
-- allow captionstyle to be unprefixed, for compatibility with [[Module:Infobox]]
elseif name == "captionstyle" and not fixedArgs.captionstyle then
fixedArgs.captionstyle = val
end
end
return fixedArgs
end
function util.parseCustomWikitext(customWikitext)
-- infoboxImage will format an image if given wikitext containing an
-- image, or else pass through the wikitext unmodified
return infoboxImage({
args = {
image = customWikitext
}
})
end
function util.trackAndWarn(trackingCat, warning)
local title = mw.title.getCurrentTitle()
local results = title and title.namespace == 0 and trackingCat and '[[Category:'..trackingCat..']]' or ''
if warning then
local warn = require('Module:If preview')._warning
results = results..warn({warning})
end
return results
end
function util.ternary(flag, other)
other = other or 'other'
flag = flag == 'none' and 'no' or flag
local yesNoOut = yesno(flag,other)
local yes = (yesNoOut == true)
local no = (yesNoOut == false)
return yes, no
end
local p = {}
p._caption = function(args)
if args.caption then
return args.caption
elseif args.switcher then
return util.noop("no caption or switcher")
end
local maskItem
local maskType = util.idType(args.geomask)
if maskType == 'item' then
maskItem = args.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(args.id or mw.wikibase.getEntityIdForCurrentPage(), args.geomask)
end
local maskItemLabel = maskItem and mw.wikibase.getLabel( maskItem )
return maskItemLabel and "Location in "..maskItemLabel
or util.noop("missing maskItemLabel with type " .. (maskType or "nil") .. " and item " .. (maskItem or "nil"))
end
--A list of types for objects that are too small to allow Kartographer to take over zoom
local tinyType = {
landmark=true,
railwaystation=true,
edu=true,
pass=true,
camera=true
}
p._main = function(_config)
-- accumulate tracking cats
local tracking = ''
-- `config` is the args passed to this module
local config = util.trimArgs(_config)
-- allow alias for config.coord
config.coord = config.coord or config.coordinates
-- Require wikidata item, or specified coords
local wikidataId = config.id or mw.wikibase.getEntityIdForCurrentPage()
if not(wikidataId) and not(config.coord) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- Require coords (specified or from wikidata), so that map will be centred somewhere
-- (P625 = coordinate location)
local wdCoordinates = util.getStatementValue(util.getBestStatement(wikidataId, 'P625'))
if not (config.coord or wdCoordinates) then
return false, util.trackAndWarn('Pages using infobox mapframe with missing coordinates')
end
-- `args` is the arguments which will be passed to the mapframe module
local args = {}
-- Some defaults/overrides for infobox presentation
args.display = "inline"
args.frame = "yes"
args.plain = "yes"
args["frame-width"] = config["frame-width"] or config.width or DEFAULT_FRAME_WIDTH
args["frame-height"] = config["frame-height"] or config.height or DEFAULT_FRAME_HEIGHT
args["frame-align"] = "center"
args["frame-coord"] = config["frame-coordinates"] or config["frame-coord"]
-- Note: config["coordinates"] or config["coord"] should not be used for the alignment of the frame;
-- see talk page ( https://en.wikipedia.org/wiki/Special:Diff/876492931 )
-- deprecated lat and long parameters
args["frame-lat"] = config["frame-lat"] or config["frame-latitude"]
args["frame-long"] = config["frame-long"] or config["frame-longitude"]
-- if zoom isn't specified from config, first check wikidata
local zoom = config.zoom or util.getStatementValue(util.getBestStatement(wikidataId, 'P6592'))
if not zoom then
-- Calculate zoom from length or area (converted to km or km2)
-- Zoom so that length or area is completely included in mapframe
local getZoom = require('Module:Infobox dim')._zoom
zoom = getZoom({length_km=config.length_km, length_mi=config.length_mi,
width_km=config.width_km, width_mi=config.width_mi,
area_km2=config.area_km2, area_mi2=config.area_mi2,
area_ha=config.area_ha, area_acre=config.area_acre,
type=config.type, population=config.population,
viewport_px=math.min(args["frame-width"],args["frame-height"]),
latitude=wdCoordinates and wdCoordinates.latitude})
end
args.zoom = zoom or DEFAULT_ZOOM
-- Use OSM relation ID if available; otherwise use geoshape if that is available
-- (geoshape is required for defunct entities, which are outside OSM's scope)
local hasOsmRelationId = util.hasWikidataProperty(wikidataId, 'P402') -- P402 is OSM relation ID
local hasGeoshape = util.hasWikidataProperty(wikidataId, 'P3896') -- P3896 is geoshape
local wikidataProvidesGeo = hasOsmRelationId or hasGeoshape
-- determine marker argument value, determine whether to show marker
local forcePoint, suppressPoint = util.ternary(config.point)
local forceMarker, suppressMarker = util.ternary(config.marker,true)
forcePoint = forcePoint or forceMarker
suppressPoint = suppressPoint or suppressMarker
local showMarker = not suppressPoint and (forcePoint or not wikidataProvidesGeo or config.coord)
-- wikidata = "yes" turns on both shape and line
-- wikidata = "no" turns off both shape and line
-- otherwise show both if wikidata provides geo
local forceWikidata, suppressWikidata = util.ternary(config.wikidata)
local showShape = not suppressWikidata and (forceWikidata or wikidataProvidesGeo or not config.coord)
local showLine = showShape
-- determine shape parameter value, determine whether to show or suppress shape
-- also determine whether to invert shape
local forceShape, suppressShape = util.ternary(config.shape)
showShape = wikidataId and not suppressShape and (forceShape or showShape)
local shapeType = config.shape == 'inverse' and 'shape-inverse' or 'shape'
-- determine line parameter value, determine whether to show or suppress line
local forceLine, suppressLine = util.ternary(config.line)
showLine = wikidataId and not suppressLine and (forceLine or showLine)
local maskItem
-- Switcher
if config.switcher == "zooms" then
-- switching between zoom levels
local maxZoom = math.max(tonumber(args.zoom), 3) -- what zoom would have otherwise been (if 3 or more, otherwise 3)
local minZoom = 1 -- completely zoomed out
local midZoom = math.floor((maxZoom + minZoom)/2) -- midway between maxn and min
args.switch = "zoomed in, zoomed midway, zoomed out"
args.zoom = string.format("SWITCH:%d,%d,%d", maxZoom, midZoom, minZoom)
elseif config.switcher == "auto" then
-- switching between P276 and P131 areas with recursive lookup, e.g. item's city,
-- that city's state, and that state's country
args.zoom = nil -- let kartographer determine the zoom
local maskLabels = {}
local maskItems = {}
local maskItemId = util.relatedEntity(wikidataId, "P276") or util.relatedEntity(wikidataId, "P131")
local maskLabel = mw.wikibase.getLabel(maskItemId)
while maskItemId and maskLabel and mw.text.trim(maskLabel) ~= "" do
table.insert(maskLabels, maskLabel)
table.insert(maskItems, maskItemId)
maskItemId = maskItemId and util.relatedEntity(maskItemId, "P131")
maskLabel = maskItemId and mw.wikibase.getLabel(maskItemId)
end
if #maskLabels > 1 then
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
elseif #maskLabels == 1 then
maskItem = maskItemId[1]
end
elseif config.switcher == "geomasks" and config.geomask then
-- switching between items in geomask parameter
args.zoom = nil -- let kartographer determine the zoom
local separator = (mw.ustring.find(config.geomask, "###", 0, true ) and "###") or
(mw.ustring.find(config.geomask, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
local maskItems = mw.text.split(mw.ustring.gsub(config.geomask, "SWITCH:", ""), pattern)
local maskLabels = {}
if #maskItems > 1 then
for i, item in ipairs(maskItems) do
table.insert(maskLabels, mw.wikibase.getLabel(item))
end
args.switch = table.concat(maskLabels, "###")
maskItem = "SWITCH:" .. table.concat(maskItems, ",")
end
end
-- resolve geomask item id (if not using geomask switcher)
if not maskItem then --
local maskType = util.idType(config.geomask)
if maskType == 'item' then
maskItem = config.geomask
elseif maskType == "property" then
maskItem = util.relatedEntity(wikidataId, config.geomask)
end
end
-- if asking for shape or line from Wikidata
-- and if Wikidata actually has shape/line data (wikidataProvidesGeo=true)
-- and if no geomask
-- and if zoom not explicitly set
-- and if the object size inferred from its type is not too small
-- then let Kartographer "take over" zoom
if (showLine or showShape) and wikidataProvidesGeo and not maskItem
and not config.zoom and not (config.type and tinyType[config.type]) then
args.zoom = nil
end
if not maskItem and not showShape and not showLine and not showMarker then
return false, util.trackAndWarn('Pages using infobox mapframe with no geometry','No geometry specified for mapframe')
end
-- Keep track of arg numbering
local argNumber = ''
local function incrementArgNumber()
if argNumber == '' then
argNumber = 2
else
argNumber = argNumber + 1
end
end
-- Geomask
if maskItem then
args["type"..argNumber] = "shape-inverse"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = config["geomask-stroke-width"] or DEFAULT_GEOMASK_STROKE_WIDTH
args["stroke-color"..argNumber] = config["geomask-stroke-color"] or config["geomask-stroke-colour"] or DEFAULT_GEOMASK_STROKE_COLOR
args["fill"..argNumber] = config["geomask-fill"] or DEFAULT_GEOMASK_FILL
args["fill-opacity"..argNumber] = config["geomask-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
-- Let kartographer determine zoom and position, unless it is explicitly set in config
if not config.zoom and not config.switcher then
args.zoom = nil
args["frame-coord"] = nil
args["frame-lat"] = nil
args["frame-long"] = nil
local maskArea = util.getStatementValue( util.getBestStatement(maskItem, 'P2046') )
end
incrementArgNumber()
-- Hack to fix phab:T255932
if not args.zoom then
args["type"..argNumber] = "line"
args["id"..argNumber] = maskItem
args["stroke-width"..argNumber] = 0
incrementArgNumber()
end
end
-- Shape (or shape-inverse)
if showShape then
args["type"..argNumber] = shapeType
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["shape-stroke-width"] or config["stroke-width"] or DEFAULT_SHAPE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["shape-stroke-color"] or config["shape-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_SHAPE_STROKE_COLOR
args["fill"..argNumber] = config["shape-fill"] or DEFAULT_SHAPE_FILL
args["fill-opacity"..argNumber] = config["shape-fill-opacity"] or DEFAULT_SHAPE_FILL_OPACITY
incrementArgNumber()
end
-- Line
if showLine then
args["type"..argNumber] = "line"
if hasGeoshape and not hasOsmRelationId then
args["from"..argNumber] = string.sub( util.getStatementValue( util.getBestStatement(wikidataId, 'P3896') ), 6)
elseif config.id then
args["id"..argNumber] = config.id
end
args["stroke-width"..argNumber] = config["line-stroke-width"] or config["stroke-width"] or DEFAULT_LINE_STROKE_WIDTH
args["stroke-color"..argNumber] = config["line-stroke-color"] or config["line-stroke-colour"] or config["stroke-color"] or config["stroke-colour"] or DEFAULT_LINE_STROKE_COLOR
incrementArgNumber()
end
-- Point marker
if showMarker then
args["type"..argNumber] = "point"
if config.id then args["id"..argNumber] = config.id end
if config.coord then args["coord"..argNumber] = config.coord end
if config.marker then args["marker"..argNumber] = config.marker end
args["marker-color"..argNumber] = config["marker-color"] or config["marker-colour"] or DEFAULT_MARKER_COLOR
incrementArgNumber()
end
-- if Wikidata doesn't link to OSM and the map has no mask or point,
-- then center the map on the coordinates either from the infobox or from wikidata
if not maskItem and not showMarker and not wikidataProvidesGeo then
if config.coord then
args["frame-coord"] = args["frame-coord"] or config.coord
else
args["frame-lat"] = args["frame-lat"] or wdCoordinates.latitude
args["frame-long"] = args["frame-long"] or wdCoordinates.longitude
end
tracking = tracking..util.trackAndWarn('Pages using infobox mapframe with forced centering')
end
-- protect against nil frame arguments
args["frame-coord"] = args["frame-coord"] or ""
args["frame-lat"] = args["frame-lat"] or ""
args["frame-long"] = args["frame-long"] or ""
local mapframe = args.switch and mf.multi(args) or mf._main(args)
tracking = tracking..((showLine or showShape) and not wikidataProvidesGeo
and util.trackAndWarn('Pages using infobox mapframe without shape links in Wikidata')
or '')
return true, mapframe.. tracking
end
-- Entry points
p.main = function(frame)
local parent = frame.getParent(frame)
local parentArgs = parent.args
local _, mapframe = p._main(parentArgs)
return frame:preprocess(mapframe)
end
p.auto = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("auto should not autorun")
end
local args = util.argsFromAuto(frame)
if args.custom then
return frame:preprocess(util.parseCustomWikitext(args.custom))
end
local _, mapframe = p._main(args)
return frame:preprocess(mapframe)
end
p.autocaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autocaption should not autorun")
end
local args = util.argsFromAuto(frame)
local caption = p._caption(args)
return caption
end
p.autoWithCaption = function(frame)
if not util.shouldAutoRun(frame) then
return util.noop("autoWithCaption should not autorun")
end
local args = util.argsFromAuto(frame)
local wikitext
local caption
local ok
if args.custom then
ok = true
wikitext = util.parseCustomWikitext(args.custom)
else
ok, wikitext = p._main(args)
end
if not ok then return wikitext end
wikitext = frame:preprocess(wikitext)
caption = p._caption(args)
local data = mw.html.create():wikitext(wikitext)
data:tag('div')
:addClass('infobox-caption')
:cssText(args.captionstyle)
:wikitext(caption)
return tostring(data)
end
return p
875oxmrlaiy3xr3n98jl2ndg6rcmzou
Modul:Mapframe
828
6562
49244
2026-11-11T07:52:56Z
Ilja isv
10
Stvorjena nova stranica s tekstom: «-- Note: Originally written on English Wikipedia at https://en.wikipedia.org/wiki/Module:Mapframe --[[---------------------------------------------------------------------------- ##### Localisation (L10n) settings ##### Replace values in quotes ("") with localised values ----------------------------------------------------------------------------]]-- local L10n = {} local wb = mw.wikibase -- Modue dependencies local parser -- local copy of https://...»
49244
Scribunto
text/plain
-- Note: Originally written on English Wikipedia at https://en.wikipedia.org/wiki/Module:Mapframe
--[[----------------------------------------------------------------------------
##### Localisation (L10n) settings #####
Replace values in quotes ("") with localised values
----------------------------------------------------------------------------]]--
local L10n = {}
local wb = mw.wikibase
-- Modue dependencies
local parser -- local copy of https://www.mediawiki.org/wiki/Module:WikitextParser loaded lazily
-- "strict" should not be used, at least until all other modules which require this module are not using globals.
-- Template parameter names (unnumbered versions only)
-- Specify each as either a single string, or a table of strings (aliases)
-- Aliases are checked left-to-right, i.e. `{ "one", "two" }` is equivalent to using `{{{one| {{{two|}}} }}}` in a template
L10n.para = {
display = "display",
type = "type",
id = { "id", "ids" },
from = "from",
raw = "raw",
title = "title",
description = "description",
strokeColor = { "stroke-color", "stroke-colour" },
strokeWidth = "stroke-width",
strokeOpacity = "stroke-opacity",
fill = "fill",
fillOpacity = "fill-opacity",
coord = { "coordinates", "coord" },
marker = "marker",
markerColor = { "marker-color", "marker-colour" },
markerSize = "marker-size",
radius = { "radius", "radius_m" },
radiusKm = "radius_km",
radiusFt = "radius_ft",
radiusMi = "radius_mi",
edges = "edges",
text = "text",
icon = "icon",
zoom = "zoom",
frame = "frame",
plain = "plain",
frameWidth = "frame-width",
frameHeight = "frame-height",
frameCoordinates= { "frame-coordinates", "frame-coord" },
frameLatitude = { "frame-lat", "frame-latitude" },
frameLongitude = { "frame-long", "frame-longitude" },
frameAlign = "frame-align",
switch = "switch",
overlay = "overlay",
overlayBorder = "overlay-border",
overlayHorizontalAlignment = "overlay-horizontal-alignment",
overlayVerticalAlignment = "overlay-vertical-alignment",
overlayHorizontalOffset = "overlay-horizontal-offset",
overlayVerticalOffset = "overlay-vertical-offset"
}
-- Names of other templates this module can extract coordinates from
L10n.template = {
templates = { -- The coord template, as well as templates with output that contains {{coord}}
"Coord", "Coord/sandbox",
"NRHP row", "NRHP row/sandbox",
"WikidataCoord", "WikidataCoord/sandbox", "Wikidatacoord", "Wikidata coord"
},
modules = { -- The coordinates module, as well as modules with output that contains {{coord}}
"Coordinates", "Coordinates/sandbox",
"WikidataCoord", "WikidataCoord/sandbox"
}
}
-- Error messages
L10n.error = {
badDisplayPara = "Invalid display parameter",
noCoords = "Coordinates must be specified on Wikidata or in |" .. ( type(L10n.para.coord)== 'table' and L10n.para.coord[1] or L10n.para.coord ) .. "=",
wikidataCoords = "Coordinates not found on Wikidata",
noCircleCoords = "Circle centre coordinates must be specified, or available via Wikidata",
negativeRadius = "Circle radius must be a positive number",
noRadius = "Circle radius must be specified",
negativeEdges = "Circle edges must be a positive number",
noSwitchPara = "Found only one switch value in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
oneSwitchLabel = "Found only one label in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noSwitchLists = "At least one parameter must have a SWITCH: list",
switchMismatches = "All SWITCH: lists must have the same number of values",
-- "%s" and "%d" tokens will be replaced with strings and numbers when used
oneSwitchValue = "Found only one switch value in |%s=",
fewerSwitchLabels = "Found %d switch values but only %d labels in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noNamedCoords = "No named coordinates found in %s"
}
-- Other strings
L10n.str = {
-- valid values for display parameter, e.g. (|display=inline) or (|display=title) or (|display=inline,title) or (|display=title,inline)
inline = "inline",
title = "title",
dsep = ",", -- separator between inline and title (comma in the example above)
-- valid values for type parameter
line = "line", -- geoline feature (e.g. a road)
shape = "shape", -- geoshape feature (e.g. a state or province)
shapeInverse = "shape-inverse", -- geomask feature (the inverse of a geoshape)
data = "data", -- geoJSON data page on Commons
point = "point", -- single point feature (coordinates)
circle = "circle", -- circular area around a point
named = "named", -- all named coordinates in an article or section
-- Keyword to indicate a switch list. Must NOT use the special characters ^$()%.[]*+-?
switch = "SWITCH",
-- valid values for icon, frame, and plain parameters
affirmedWords = ' '..table.concat({
"add",
"added",
"affirm",
"affirmed",
"include",
"included",
"on",
"true",
"yes",
"y"
}, ' ')..' ',
declinedWords = ' '..table.concat({
"decline",
"declined",
"exclude",
"excluded",
"false",
"none",
"not",
"no",
"n",
"off",
"omit",
"omitted",
"remove",
"removed"
}, ' ')..' '
}
-- Default values for parameters
L10n.defaults = {
display = L10n.str.inline,
text = "Map",
frameWidth = "300",
frameHeight = "200",
frameAlign = "right",
markerColor = "5E74F3",
markerSize = nil,
strokeColor = "#ff0000",
strokeWidth = 6,
edges = 32, -- number of edges used to approximate a circle
overlayBorder = "1px solid white",
overlayHorizontalAlignment = "right",
overlayHorizontalOffset = "0",
overlayVerticalAlignment = "bottom",
overlayVerticalOffset = "0"
}
-- #### End of L10n settings ####
--[[----------------------------------------------------------------------------
Utility methods
----------------------------------------------------------------------------]]--
local util = {}
--[[
Looks up a parameter value based on the id (a key from the L10n.para table) and
optionally a suffix, for parameters that can be suffixed (e.g. type2 is type
with suffix 2).
@param {table} args key-value pairs of parameter names and their values
@param {string} param_id id for parameter name (key from the L10n.para table)
@param {string} [suffix] suffix for parameter name
@returns {string|nil} parameter value if found, or nil if not found
]]--
function util.getParameterValue(args, param_id, suffix)
suffix = suffix or ''
if type( L10n.para[param_id] ) ~= 'table' then
return args[L10n.para[param_id]..suffix]
end
for _i, paramAlias in ipairs(L10n.para[param_id]) do
if args[paramAlias..suffix] then
return args[paramAlias..suffix]
end
end
return nil
end
--[[
Trim whitespace from args, and remove empty args. Also fix control characters.
@param {table} argsTable
@returns {table} trimmed args table
]]--
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(key) == 'string' and type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
-- control characters inside json need to be escaped, but stripping them is simpler
-- See also T214984
-- However, *don't* strip control characters from wikitext (text or description parameters) or you'll break strip markers
-- Alternatively it might be better to only strip control char from raw parameter content
if util.matchesParam('text', key) or util.matchesParam('description', key, key:gsub('^%D+(%d+)$', '%1') ) then
cleanArgs[key] = val
else
cleanArgs[key] = val:gsub('%c',' ')
end
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
--[[
Check if a parameter name matches an unlocalized parameter key
@param {string} key - the unlocalized parameter name to search through
@param {string} name - the localized parameter name to check
@param {string|nil} - an optional suffix to apply to the value(s) from the localization key
@returns {boolean} true if the name matches the parameter, false otherwise
]]--
function util.matchesParam(key, name, suffix)
local param = L10n.para[key]
suffix = suffix or ''
if type(param) == 'table' then
for _, v in pairs(param) do
if (v .. suffix) == name then return true end
end
return false
end
return ((param .. suffix) == name)
end
--[[
Check if a value is affirmed (one of the values in L10n.str.affirmedWords)
@param {string} val Value to be checked
@returns {boolean} true if affirmed, false otherwise
]]--
function util.isAffirmed(val)
if not(val) then return false end
return string.find(L10n.str.affirmedWords, ' '..val..' ', 1, true ) and true or false
end
--[[
Check if a value is declined (one of the values in L10n.str.declinedWords)
@param {string} val Value to be checked
@returns {boolean} true if declined, false otherwise
]]--
function util.isDeclined(val)
if not(val) then return false end
return string.find(L10n.str.declinedWords , ' '..val..' ', 1, true ) and true or false
end
--[[
Check if the name of a template matches the known coord templates or wrappers
(in L10n.template.templates and L10n.template.modules). The name is normalised
when checked, so e.g. the names "Coord", "coord", and " Coord" all return true.
@param {string} name
@returns {boolean} true if it is a coord template or wrapper, false otherwise
]]--
function util.isCoordTemplateOrWrapper(name)
name = mw.text.trim(name)
local modName = mw.ustring.gsub(name, '#invoke:', '')
local inputTitle = mw.title.new(modName, (name ~= modName) and 'Module' or 'Template')
if not inputTitle then
return false
end
-- Create (or reuse) mw.title objects for each known coord template/wrapper.
-- Stored in L10n.template.title so that they don't need to be recreated
-- each time this function is called
if not L10n.template.titles then
L10n.template.titles = {}
for _, v in pairs(L10n.template.templates) do
table.insert(L10n.template.titles, mw.title.new(v, 'Template'))
end
for _, v in pairs(L10n.template.modules) do
table.insert(L10n.template.titles, mw.title.new(v, 'Module'))
end
end
for _, templateTitle in pairs(L10n.template.titles) do
if mw.title.equals(inputTitle, templateTitle) then
return true
end
end
return false
end
--[[
Recursively extract coord templates which have a name parameter.
@param {string} wikitext
@returns {table} table sequence of coord templates
]]--
function util.extractCoordTemplates(wikitext)
local output = {}
local templates = mw.ustring.gmatch(wikitext, '{%b{}}')
for template in templates do
local templateName = mw.ustring.match(template, '{{([^}|]+)')
local nameParam = mw.ustring.match(template, "|%s*name%s*=%s*[^}|]+")
if util.isCoordTemplateOrWrapper(templateName) then
if nameParam then table.insert(output, template) end
elseif mw.ustring.find(mw.ustring.sub(template, 2), "{{") then
local subOutput = util.extractCoordTemplates(mw.ustring.sub(template, 2))
for _, t in pairs(subOutput) do
table.insert(output, t)
end
end
end
-- ensure coords are not using title display
for k, v in pairs(output) do
output[k] = mw.ustring.gsub(v, "|%s*display%s*=[^|}]+", "|display=inline")
end
return output
end
--[[
Gets all named coordinates from a page or a section of a page.
@param {string|nil} page Page name, or name#section, to get named coordinates
from. If the name is omitted, i.e. #section or nil or empty string, then
the current page will be used.
@returns {table} sequence of {coord, name, description} tables where coord is
the coordinates in a format suitable for #util.parseCoords, name is a string,
and description is a string (coordinates in a format suitable for displaying
to the reader). If for some reason the name can't be found, the description
is nil and the name contains display-format coordinates.
@throws {L10n.error.noNamedCoords} if no named coordinates are found.
]]--
function util.getNamedCoords(page)
local parts = mw.text.split(page or "", "#", true)
local name = parts[1] == "" and mw.title.getCurrentTitle().prefixedText or parts[1]
local section = parts[2]
local title = mw.title.new(name)
if title.isRedirect then
title = title.redirectTarget
end
local pageWikitext = title:getContent()
if section then
if parser == nil then
-- load [[Module:WikitextParser]] lazily so it is only transcluded on pages that use it
parser = require("Module:WikitextParser")
end
pageWikitext = parser.getSection(pageWikitext, section) or ''
end
local coordTemplates = util.extractCoordTemplates(pageWikitext)
if #coordTemplates == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
local frame = mw.getCurrentFrame()
local sep = "________"
local expandedContent = frame:preprocess(table.concat(coordTemplates, sep))
local expandedTemplates = mw.text.split(expandedContent, sep)
local namedCoords = {}
for _, expandedTemplate in pairs(expandedTemplates) do
local coord = mw.ustring.match(expandedTemplate, "<span class=\"geo%-dec\".->(.-)</span>")
if coord then
local coordname = (
-- name specified by a wrapper template, e.g [[Article|Name]]
mw.ustring.match(expandedTemplate, "<span class=\"mapframe%-coord%-name\">(.-)</span>") or
-- name passed into coord template
mw.ustring.match(expandedTemplate, "<span class=\"fn org\">(.-)</span>") or
-- default to the coordinates if the name can't be retrieved
coord
)
local description = coordname ~= coord and coord
table.insert(namedCoords, {
coord=mw.ustring.gsub(coord, "[° ]", "_"),
name=coordname, description=description
})
end
end
if #namedCoords == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
return namedCoords
end
--[[
Parse coordinate values from the params passed in a GeoHack url (such as
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1_2_N_3_4_W_ or
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1.23_S_4.56_E_ )
or non-url string in the same format (such as `1_2_N_3_4_W_` or `1.23_S_4.56_E_`)
@param {string} coords string containing coordinates
@returns {number, number} latitude, longitude
]]--
function util.parseCoords(coords)
local coordsPatt
if mw.ustring.find(coords, "params=", 1, true) then
-- prevent false matches from page name, e.g. ?pagename=Lorem_S._Ipsum
coordsPatt = 'params=([_%.%d]+[NS][_%.%d]+[EW])'
else
-- not actually a geohack url, just the same format
coordsPatt = '[_%.%d]+[NS][_%.%d]+[EW]'
end
local parts = mw.text.split((mw.ustring.match(coords, coordsPatt) or ''), '_')
local lat_d = tonumber(parts[1])
assert(lat_d, "Unable to get latitude from input '"..coords.."'.")
local lat_m = tonumber(parts[2]) -- nil if coords are in decimal format
local lat_s = lat_m and tonumber(parts[3]) -- nil if coords are either in decimal format or degrees and minutes only
local lat = lat_d + (lat_m or 0)/60 + (lat_s or 0)/3600
if parts[#parts/2] == 'S' then
lat = lat * -1
end
local long_d = tonumber(parts[1+#parts/2])
assert(long_d, "Unable to get longitude from input '"..coords.."'.")
local long_m = tonumber(parts[2+#parts/2]) -- nil if coords are in decimal format
local long_s = long_m and tonumber(parts[3+#parts/2]) -- nil if coords are either in decimal format or degrees and minutes only
local long = long_d + (long_m or 0)/60 + (long_s or 0)/3600
if parts[#parts] == 'W' then
long = long * -1
end
return lat, long
end
--[[
Get coordinates from a Wikidata item
@param {string} item_id Wikidata item id (Q number)
@returns {number, number} latitude, longitude
@throws {L10n.error.noCoords} if item_id is invalid or the item does not exist
@throws {L10n.error.wikidataCoords} if the the item does not have a P625
statement (coordinates), or it is set to "no value"
]]--
function util.wikidataCoords(item_id)
if not (item_id and wb.isValidEntityId(item_id) and wb.entityExists(item_id)) then
error(L10n.error.noCoords, 0)
end
local coordStatements = wb.getBestStatements(item_id, 'P625')
if not coordStatements or #coordStatements == 0 then
error(L10n.error.wikidataCoords, 0)
end
local hasNoValue = ( coordStatements[1].mainsnak and (coordStatements[1].mainsnak.snaktype == 'novalue' or coordStatements[1].mainsnak.snaktype == 'somevalue') )
if hasNoValue then
error(L10n.error.wikidataCoords, 0)
end
local wdCoords = coordStatements[1]['mainsnak']['datavalue']['value']
return tonumber(wdCoords['latitude']), tonumber(wdCoords['longitude'])
end
--[[
Creates a polygon that approximates a circle
@param {number} lat Latitude
@param {number} long Longitude
@param {number} radius Radius in metres
@param {number} n Number of edges for the polygon
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
]]--
function util.circleToPolygon(lat, long, radius, n) -- n is number of edges
-- Based on https://github.com/gabzim/circle-to-polygon, ISC licence
local function offset(cLat, cLon, distance, bearing)
local lat1 = math.rad(cLat)
local lon1 = math.rad(cLon)
local dByR = distance / 6378137 -- distance divided by 6378137 (radius of the earth) wgs84
local offet_lat = math.asin(
math.sin(lat1) * math.cos(dByR) +
math.cos(lat1) * math.sin(dByR) * math.cos(bearing)
)
local offet_lon = lon1 + math.atan2(
math.sin(bearing) * math.sin(dByR) * math.cos(lat1),
math.cos(dByR) - math.sin(lat1) * math.sin(offet_lat)
)
return {math.deg(offet_lon), math.deg(offet_lat)}
end
local coordinates = {};
local i = 0;
while i < n do
table.insert(coordinates,
offset(lat, long, radius, (2*math.pi*i*-1)/n)
)
i = i + 1
end
table.insert(coordinates, offset(lat, long, radius, 0))
return coordinates
end
--[[
Get the number of key-value pairs in a table, which might not be a sequence.
@param {table} t
@returns {number} count of key-value pairs
]]--
function util.tableCount(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
--[[
For a table where the values are all tables, returns either the util.tableCount
of the subtables if they are all the same, or nil if they are not all the same.
@param {table} t
@returns {number|nil} count of key-value pairs of subtable, or nil if subtables
have different counts
]]--
function util.subTablesCount(t)
local count = nil
for k, v in pairs(t) do
if count == nil then
count = util.tableCount(v)
elseif count ~= util.tableCount(v) then
return nil
end
end
return count
end
--[[
Splits a list into a table sequence. The items in the list may be separated by
commas, or by semicolons (if items may contain commas), or by "###" (if items
may contain semicolons).
@param {string} listString
@returns {table} sequence of list items
]]--
function util.tableFromList(listString)
if type(listString) ~= "string" or listString == "" then return nil end
local separator = (mw.ustring.find(listString, "###", 0, true ) and "###") or
(mw.ustring.find(listString, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
return mw.text.split(listString, pattern)
end
-- Boolean in outer scope indicating if Kartographer should be able to
-- automatically calculate coordinates (see phab:T227402)
local coordsDerivedFromFeatures = false;
--[[----------------------------------------------------------------------------
Make methods: These take in a table of arguments, and return either a string
or a table to be used in the eventual output.
----------------------------------------------------------------------------]]--
local make = {}
--[[
Makes content to go inside the maplink or mapframe tag.
@param {table} args
@returns {string} tag content
]]--
function make.content(args)
if util.getParameterValue(args, 'raw') then
coordsDerivedFromFeatures = true -- Kartographer should be able to automatically calculate coords from raw geoJSON
return util.getParameterValue(args, 'raw')
end
local content = {}
local argsExpanded = {}
for k, v in pairs(args) do
local index = string.match( k, '^[^0-9]+([0-9]*)$' )
if index ~= nil then
local indexNumber
if index ~= '' then
indexNumber = tonumber(index)
else
indexNumber = 1
end
if argsExpanded[indexNumber] == nil then
argsExpanded[indexNumber] = {}
end
argsExpanded[indexNumber][ string.gsub(k, index, '') ] = v
end
end
for contentIndex, contentArgs in pairs(argsExpanded) do
local argType = util.getParameterValue(contentArgs, "type")
-- Kartographer automatically calculates coords if geolines/shapes are used (T227402)
if not coordsDerivedFromFeatures then
coordsDerivedFromFeatures = ( argType == L10n.str.line or argType == L10n.str.shape ) and true or false
end
if argType == L10n.str.named then
local namedCoords = util.getNamedCoords(util.getParameterValue(contentArgs, "from"))
local typeKey = type(L10n.para.type) == "table" and L10n.para.type[1] or L10n.para.type
local coordKey = type(L10n.para.coord) == "table" and L10n.para.coord[1] or L10n.para.coord
local titleKey = type(L10n.para.title) == "table" and L10n.para.title[1] or L10n.para.title
local descKey = type(L10n.para.description) == "table" and L10n.para.description[1] or L10n.para.description
for _, namedCoord in pairs(namedCoords) do
contentArgs[typeKey] = "point"
contentArgs[coordKey] = namedCoord.coord
contentArgs[titleKey] = namedCoord.name
contentArgs[descKey] = namedCoord.description
content[#content+1] = make.contentJson(contentArgs)
end
else
content[#content + 1] = make.contentJson(contentArgs)
end
end
--Single item, no array needed
if #content==1 then return content[1] end
--Multiple items get placed in a FeatureCollection
local contentArray = '[\n' .. table.concat( content, ',\n') .. '\n]'
return contentArray
end
--[[
Make coordinates from the coord arg, or the id arg, or the current page's
Wikidata item.
@param {table} args
@param {boolean} [plainOutput]
@returns {Mixed} Either:
{number, number} latitude, longitude if plainOutput is true; or
{table} table sequence of longitude, then latitude (gives the required format
for GeoJSON when encoded)
]]--
function make.coords(args, plainOutput)
local coords, lat, long
local frame = mw.getCurrentFrame()
if util.getParameterValue(args, 'coord') then
coords = frame:preprocess( util.getParameterValue(args, 'coord') )
lat, long = util.parseCoords(coords)
else
lat, long = util.wikidataCoords(util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
end
if plainOutput then
return lat, long
end
return {[0] = long, [1] = lat}
end
--[[
Makes a table of coordinates that approximate a circle.
@param {table} args
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
@throws {L10n.error.noCircleCoords} if centre coordinates are not specified
@throws {L10n.error.noRadius} if radius is not specified
@throws {L10n.error.negativeRadius} if radius is negative or zero
@throws {L10n.error.negativeEdges} if edges is negative or zero
]]--
function make.circleCoords(args)
local lat, long = make.coords(args, true)
local radius = util.getParameterValue(args, 'radius')
if not radius then
radius = util.getParameterValue(args, 'radiusKm') and tonumber(util.getParameterValue(args, 'radiusKm'))*1000
if not radius then
radius = util.getParameterValue(args, 'radiusMi') and tonumber(util.getParameterValue(args, 'radiusMi'))*1609.344
if not radius then
radius = util.getParameterValue(args, 'radiusFt') and tonumber(util.getParameterValue(args, 'radiusFt'))*0.3048
end
end
end
local edges = util.getParameterValue(args, 'edges') or L10n.defaults.edges
if not lat or not long then
error(L10n.error.noCircleCoords, 0)
elseif not radius then
error(L10n.error.noRadius, 0)
elseif tonumber(radius) <= 0 then
error(L10n.error.negativeRadius, 0)
elseif tonumber(edges) <= 0 then
error(L10n.error.negativeEdges, 0)
end
return util.circleToPolygon(lat, long, radius, tonumber(edges))
end
--[[
Makes JSON data for a feature
@param contentArgs args for this feature. Keys must be the non-suffixed version
of the parameter names, i.e. use type, stroke, fill,... rather than type3,
stroke3, fill3,...
@returns {string} JSON encoded data
]]--
function make.contentJson(contentArgs)
local data = {}
if util.getParameterValue(contentArgs, 'type') == L10n.str.point or util.getParameterValue(contentArgs, 'type') == L10n.str.circle then
local isCircle = util.getParameterValue(contentArgs, 'type') == L10n.str.circle
data.type = "Feature"
data.geometry = {
type = isCircle and "LineString" or "Point",
coordinates = isCircle and make.circleCoords(contentArgs) or make.coords(contentArgs)
}
data.properties = {
title = util.getParameterValue(contentArgs, 'title') or mw.getCurrentFrame():getParent():getTitle()
}
if isCircle then
-- TODO: This is very similar to below, should be extracted into a function
data.properties.stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor
data.properties["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
data.properties['fill-opacity'] = fillOpacity and tonumber(fillOpacity) or 0.6
end
else -- is a point
local markerSymbol = util.getParameterValue(contentArgs, 'marker') or L10n.defaults.marker
-- allow blank to be explicitly specified, for overriding infoboxes or other templates with a default value
if markerSymbol ~= "blank" then
data.properties["marker-symbol"] = markerSymbol
end
data.properties["marker-color"] = util.getParameterValue(contentArgs, 'markerColor') or L10n.defaults.markerColor
data.properties["marker-size"] = util.getParameterValue(contentArgs, 'markerSize') or L10n.defaults.markerSize
end
else
data.type = "ExternalData"
if util.getParameterValue(contentArgs, 'type') == L10n.str.data or util.getParameterValue(contentArgs, 'from') then
data.service = "page"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.line then
data.service = "geoline"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shape then
data.service = "geoshape"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shapeInverse then
data.service = "geomask"
end
if util.getParameterValue(contentArgs, 'id') or (not (util.getParameterValue(contentArgs, 'from')) and wb.getEntityIdForCurrentPage()) then
data.ids = util.getParameterValue(contentArgs, 'id') or wb.getEntityIdForCurrentPage()
else
data.title = util.getParameterValue(contentArgs, 'from')
end
data.properties = {
stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor,
["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
}
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill and (data.service == "geoshape" or data.service == "geomask") then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
if fillOpacity then
data.properties['fill-opacity'] = tonumber(fillOpacity)
end
end
end
data.properties.title = util.getParameterValue(contentArgs, 'title') or mw.title.getCurrentTitle().text
if util.getParameterValue(contentArgs, 'description') then
data.properties.description = util.getParameterValue(contentArgs, 'description')
end
return mw.text.jsonEncode(data)
end
--[[
Makes attributes for the maplink or mapframe tag.
@param {table} args
@param {boolean} [isTitle] Tag is to be displayed in the title of page rather
than inline
@returns {table<string,string>} key-value pairs of attribute names and values
]]--
function make.tagAttribs(args, isTitle)
local attribs = {}
if util.getParameterValue(args, 'zoom') then
attribs.zoom = util.getParameterValue(args, 'zoom')
end
if util.isDeclined(util.getParameterValue(args, 'icon')) then
attribs.class = "no-icon"
end
if util.getParameterValue(args, 'type') == L10n.str.point and not coordsDerivedFromFeatures then
local lat, long = make.coords(args, 'plainOutput')
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
if util.isAffirmed(util.getParameterValue(args, 'frame')) and not(isTitle) then
attribs.width = util.getParameterValue(args, 'frameWidth') or L10n.defaults.frameWidth
attribs.height = util.getParameterValue(args, 'frameHeight') or L10n.defaults.frameHeight
if util.getParameterValue(args, 'frameCoordinates') then
local frameLat, frameLong = util.parseCoords(util.getParameterValue(args, 'frameCoordinates'))
attribs.latitude = frameLat
attribs.longitude = frameLong
else
if util.getParameterValue(args, 'frameLatitude') then
attribs.latitude = util.getParameterValue(args, 'frameLatitude')
end
if util.getParameterValue(args, 'frameLongitude') then
attribs.longitude = util.getParameterValue(args, 'frameLongitude')
end
end
if not attribs.latitude and not attribs.longitude and not coordsDerivedFromFeatures then
local success, lat, long = pcall(util.wikidataCoords, util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
if success then
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
end
if util.getParameterValue(args, 'frameAlign') then
attribs.align = util.getParameterValue(args, 'frameAlign')
end
if util.isAffirmed(util.getParameterValue(args, 'plain')) then
attribs.frameless = "1"
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
return attribs
end
--[[
Makes maplink wikitext that will be located in the top-right of the title of the
page (the same place where coords with |display=title are positioned).
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.titleOutput(args, tagContent)
local titleTag = mw.text.tag('maplink', make.tagAttribs(args, true), tagContent)
local spanAttribs = {
style = "font-size: small;",
id = "mapframe-coordinates"
}
local indicatorContent = mw.text.tag('span', spanAttribs, titleTag)
return mw.getCurrentFrame():extensionTag {
name = "indicator",
content = indicatorContent,
args = {
name = "zzz-mapframe" --zzz: show as last indicator
}
}
end
--[[
Makes maplink or mapframe wikitext that will be located inline.
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.inlineOutput(args, tagContent)
local tagName = 'maplink'
if util.getParameterValue(args, 'frame') then
tagName = 'mapframe'
end
return mw.text.tag(tagName, make.tagAttribs(args), tagContent)
end
--[[
Makes the HTML required for the swicther to work, including the templatestyles
tag.
@param {table} params table sequence of {map, label} tables
@param {string} params{}.map Wikitext for mapframe map
@param {string} params{}.label Label text for swicther option
@param {table} options
@param {string} options.alignment "left" or "center" or "right"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} options.width Width of frame, e.g. "200"
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} swicther HTML
]]--
function make.switcherHtml(params, options)
options = options or {}
local frame = mw.getCurrentFrame()
local styles = frame:extensionTag{
name = "templatestyles",
args = {src = "Template:Maplink/styles-multi.css"}
}
local container = mw.html.create("div")
:addClass("switcher-container")
:addClass("mapframe-multi-container")
if options.alignment == "left" or options.alignment == "right" then
container:addClass("float"..options.alignment)
else -- alignment is "center"
container:addClass("center")
end
for i = 1, #params do
container
:tag("div")
:wikitext(params[i].map)
:tag("span")
:addClass("switcher-label")
:css("display", "none")
:wikitext(mw.text.trim(params[i].label))
end
if not options.isThumbnail then
return styles .. tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.alignment, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-multi-outer-container")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.alignment == "left" or options.alignment == "right" then
outerCountainer:addClass("float"..options.alignment)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return styles .. tostring(outerCountainer)
end
--[[
Makes the HTML required for an overlay map to work
tag.
@param {string} overlayMap wikitext for the overlay map
@param {string} baseMap wikitext for the base map
@param {table} options various styling/display options
@param {string} options.align "left" or "center" or "right"
@param {string|number} options.width Width of the base map, e.g. "300"
@param {string|number} options.width Height of the base map, e.g. "200"
@param {string} options.border Border style for the overlayed map, e.g. "1px solid white"
@param {string} options.horizontalAlignment Horizontal alignment for overlay map, "left" or "right"
@param {string|number} options.horizontalOffset Horizontal offset in pixels from the alignment edge, e.g "10"
@param {string} options.verticalAlignment Vertical alignment for overlay map, "top" or "bottom"
@param {string|number} options.verticalOffset Vertical offset in pixels from the alignment edge, e.g. is "10"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} HTML for basemap with overlay
]]--
function make.overlayHtml(overlayMap, baseMap, options)
options = options or {}
local containerFloatClass = "float"..(options.align or "none")
if options.align == "center" then
containerFloatClass = "center"
end
local containerStyle = {
position = "relative",
width = options.width .. "px",
height = options.height .. "px",
overflow = "hidden" -- mobile/minerva tends to add scrollbars for a couple of pixels
}
if options.align == "center" then
containerStyle["margin-left"] = "auto"
containerStyle["margin-right"] = "auto"
end
local container = mw.html.create("div")
:addClass("mapframe-withOverlay-container")
:addClass(containerFloatClass)
:addClass("noresize")
:css(containerStyle)
local overlayStyle = {
position = "absolute",
["z-index"] = "1",
border = options.border or "1px solid white"
}
if options.horizontalAlignment == "right" then
overlayStyle.right = options.horizontalOffset .. "px"
else
overlayStyle.left = options.horizontalOffset .. "px"
end
if options.verticalAlignment == "bottom" then
overlayStyle.bottom = options.verticalOffset .. "px"
else
overlayStyle.top = options.verticalOffset .. "px"
end
local overlayDiv = mw.html.create("div")
:css(overlayStyle)
:wikitext(overlayMap)
container
:node(overlayDiv)
:wikitext(baseMap)
if not options.isThumbnail then
return tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.align, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-withOverlay-outerContainer")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.align == "left" or options.align == "right" then
outerCountainer:addClass("t"..options.align)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return tostring(outerCountainer)
end
--[[----------------------------------------------------------------------------
Package to be exported, i.e. methods which will available to templates and
other modules.
----------------------------------------------------------------------------]]--
local p = {}
-- Entry point for templates
function p.main(frame)
local parent = frame.getParent(frame)
-- Check for overlay option
local overlay = util.getParameterValue(parent.args, 'overlay')
local hasOverlay = overlay and mw.text.trim(overlay) ~= ""
-- Check for switch option
local switch = util.getParameterValue(parent.args, 'switch')
local isMulti = switch and mw.text.trim(switch) ~= ""
-- Create output by choosing method to suit options
local output
if hasOverlay then
output = p.withOverlay(parent.args)
elseif isMulti then
output = p.multi(parent.args)
else
output = p._main(parent.args)
end
-- Preprocess output before returning it
return frame:preprocess(output)
end
-- Entry points for modules
function p._main(_args)
local args = util.trimArgs(_args)
local tagContent = make.content(args)
local display = mw.text.split(util.getParameterValue(args, 'display') or L10n.defaults.display, '%s*' .. L10n.str.dsep .. '%s*')
local displayInTitle = display[1] == L10n.str.title or display[2] == L10n.str.title
local displayInline = display[1] == L10n.str.inline or display[2] == L10n.str.inline
local output
if displayInTitle and displayInline then
output = make.titleOutput(args, tagContent) .. make.inlineOutput(args, tagContent)
elseif displayInTitle then
output = make.titleOutput(args, tagContent)
elseif displayInline then
output = make.inlineOutput(args, tagContent)
else
error(L10n.error.badDisplayPara)
end
return output
end
function p.multi(_args)
local args = util.trimArgs(_args)
if not args[L10n.para.switch] then error(L10n.error.noSwitchPara, 0) end
local switchParamValue = util.getParameterValue(args, 'switch')
local switchLabels = util.tableFromList(switchParamValue)
if #switchLabels == 1 then error(L10n.error.oneSwitchLabel, 0) end
local mapframeArgs = {}
local switchParams = {}
for name, val in pairs(args) do
-- Copy to mapframeArgs, if not the switch labels or a switch parameter
if val ~= switchParamValue and not string.match(val, "^"..L10n.str.switch..":") then
mapframeArgs[name] = val
end
-- Check if this is a param to switch. If so, store the name and switch
-- values in switchParams table.
local switchList = string.match(val, "^"..L10n.str.switch..":(.+)")
if switchList ~= nil then
local values = util.tableFromList(switchList)
if #values == 1 then
error(string.format(L10n.error.oneSwitchValue, name), 0)
end
switchParams[name] = values
end
end
if util.tableCount(switchParams) == 0 then
error(L10n.error.noSwitchLists, 0)
end
local switchCount = util.subTablesCount(switchParams)
if not switchCount then
error(L10n.error.switchMismatches, 0)
elseif switchCount > #switchLabels then
error(string.format(L10n.error.fewerSwitchLabels, switchCount, #switchLabels), 0)
end
-- Ensure a plain frame will be used (thumbnail will be built by the
-- make.switcherHtml function if required, so that switcher options are
-- inside the thumnail)
mapframeArgs.plain = "yes"
local switcher = {}
for i = 1, switchCount do
local label = switchLabels[i]
for name, values in pairs(switchParams) do
mapframeArgs[name] = values[i]
end
table.insert(switcher, {
map = p._main(mapframeArgs),
label = "Show "..label
})
end
return make.switcherHtml(switcher, {
alignment = args["frame-align"] or "right",
isThumbnail = (args.frame and not args.plain) and true or false,
width = args["frame-width"] or L10n.defaults.frameWidth,
caption = args.text
})
end
function p.withOverlay(_args)
-- Get and trim wikitext for overlay map
local overlayMap = _args.overlay
if type(overlayMap) == 'string' then
overlayMap = overlayMap:match('^%s*(.-)%s*$')
end
local isThumbnail = (util.getParameterValue(_args, "frame") and not util.getParameterValue(_args, "plain")) and true or false
-- Get base map using the _main function, as a plain map
local args = util.trimArgs(_args)
args.plain = "yes"
local basemap = p._main(args)
-- Extract overlay options from args
local overlayOptions = {
width = util.getParameterValue(args, "frameWidth") or L10n.defaults.frameWidth,
height = util.getParameterValue(args, "frameHeight") or L10n.defaults.frameHeight,
align = util.getParameterValue(args, "frameAlign") or L10n.defaults.frameAlign,
border = util.getParameterValue(args, "overlayBorder") or L10n.defaults.overlayBorder,
horizontalAlignment = util.getParameterValue(args, "overlayHorizontalAlignment") or L10n.defaults.overlayHorizontalAlignment,
horizontalOffset = util.getParameterValue(args, "overlayHorizontalOffset") or L10n.defaults.overlayHorizontalOffset,
verticalAlignment = util.getParameterValue(args, "overlayVerticalAlignment") or L10n.defaults.overlayVerticalAlignment,
verticalOffset = util.getParameterValue(args, "overlayVerticalOffset") or L10n.defaults.overlayVerticalOffset,
isThumbnail = isThumbnail,
caption = util.getParameterValue(args, "text") or L10n.defaults.text
}
-- Make the HTML for the overlaying maps
return make.overlayHtml(overlayMap, basemap, overlayOptions)
end
-- Entry point for testcase tests
p.test = util
return p
cbg20zhedgvi7tds8motk323r37gona