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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;names | data24 = {{{former_names|}}} | label25 = Modern&nbsp;name | data25 = {{{modern_name|}}} | label26 = Current&nbsp;owner | data26 = {{{present_owner|}}} | label27 = Original&nbsp;owner | data27 = {{{original_owner|}}} | label28 = {{longitem|Principal engineer}} | data28 = {{{engineer|}}} | label29 = Other&nbsp;engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}} | data29 = {{{other_engineer|}}} | label30 = Date&nbsp;approved | data30 = {{{date_approved|}}} | label31 = Date&nbsp;of&nbsp;act | data31 = {{{date_act|}}} | label32 = Construction&nbsp;began | data32 = {{{date_began|}}} | label33 = {{longitem|Date of first use}} | data33 = {{{date_use|}}} | label34 = Date&nbsp;completed | data34 = {{{date_completed|}}} | label35 = Date&nbsp;extended | data35 = {{{date_extended|}}} | label36 = Date&nbsp;closed | data36 = {{{date_closed|}}} | label37 = Date&nbsp;restored | data37 = {{{date_restored|}}} | label38 = {{longitem|{{{xfield2}}}}} | data38 = {{{xvalue2|}}} | header39 = Geography | label40 = Direction | data40 = {{{direction|}}} | label41 = Start&nbsp;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&nbsp;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&nbsp;of | data46 = {{{branch_of|}}} | label47 = Connects&nbsp;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&nbsp;names | data24 = {{{former_names|}}} | label25 = Modern&nbsp;name | data25 = {{{modern_name|}}} | label26 = Current&nbsp;owner | data26 = {{{present_owner|}}} | label27 = Original&nbsp;owner | data27 = {{{original_owner|}}} | label28 = {{longitem|Principal engineer}} | data28 = {{{engineer|}}} | label29 = Other&nbsp;engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}} | data29 = {{{other_engineer|}}} | label30 = Date&nbsp;approved | data30 = {{{date_approved|}}} | label31 = Date&nbsp;of&nbsp;act | data31 = {{{date_act|}}} | label32 = Construction&nbsp;began | data32 = {{{date_began|}}} | label33 = {{longitem|Date of first use}} | data33 = {{{date_use|}}} | label34 = Date&nbsp;completed | data34 = {{{date_completed|}}} | label35 = Date&nbsp;extended | data35 = {{{date_extended|}}} | label36 = Date&nbsp;closed | data36 = {{{date_closed|}}} | label37 = Date&nbsp;restored | data37 = {{{date_restored|}}} | label38 = {{longitem|{{{xfield2}}}}} | data38 = {{{xvalue2|}}} | header39 = Geography | label40 = Direction | data40 = {{{direction|}}} | label41 = Start&nbsp;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&nbsp;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&nbsp;of | data46 = {{{branch_of|}}} | label47 = Connects&nbsp;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&nbsp;names | data24 = {{{former_names|}}} | label25 = Modern&nbsp;name | data25 = {{{modern_name|}}} | label26 = Current&nbsp;owner | data26 = {{{present_owner|}}} | label27 = Original&nbsp;owner | data27 = {{{original_owner|}}} | label28 = {{longitem|Principal engineer}} | data28 = {{{engineer|}}} | label29 = Other&nbsp;engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}} | data29 = {{{other_engineer|}}} | label30 = Date&nbsp;approved | data30 = {{{date_approved|}}} | label31 = Date&nbsp;of&nbsp;act | data31 = {{{date_act|}}} | label32 = Construction&nbsp;began | data32 = {{{date_began|}}} | label33 = {{longitem|Date of first use}} | data33 = {{{date_use|}}} | label34 = Date&nbsp;completed | data34 = {{{date_completed|}}} | label35 = Date&nbsp;extended | data35 = {{{date_extended|}}} | label36 = Date&nbsp;closed | data36 = {{{date_closed|}}} | label37 = Date&nbsp;restored | data37 = {{{date_restored|}}} | label38 = {{longitem|{{{xfield2}}}}} | data38 = {{{xvalue2|}}} | header39 = Geography | label40 = Direction | data40 = {{{direction|}}} | label41 = Start&nbsp;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&nbsp;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&nbsp;of | data46 = {{{branch_of|}}} | label47 = Connects&nbsp;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&nbsp;names | data24 = {{{former_names|}}} | label25 = Modern&nbsp;name | data25 = {{{modern_name|}}} | label26 = Current&nbsp;owner | data26 = {{{present_owner|}}} | label27 = Original&nbsp;owner | data27 = {{{original_owner|}}} | label28 = {{longitem|Principal engineer}} | data28 = {{{engineer|}}} | label29 = Other&nbsp;engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}} | data29 = {{{other_engineer|}}} | label30 = Date&nbsp;approved | data30 = {{{date_approved|}}} | label31 = Date&nbsp;of&nbsp;act | data31 = {{{date_act|}}} | label32 = Construction&nbsp;began | data32 = {{{date_began|}}} | label33 = {{longitem|Date of first use}} | data33 = {{{date_use|}}} | label34 = Date&nbsp;completed | data34 = {{{date_completed|}}} | label35 = Date&nbsp;extended | data35 = {{{date_extended|}}} | label36 = Date&nbsp;closed | data36 = {{{date_closed|}}} | label37 = Date&nbsp;restored | data37 = {{{date_restored|}}} | label38 = {{longitem|{{{xfield2}}}}} | data38 = {{{xvalue2|}}} | header39 = Geography | label40 = Direction | data40 = {{{direction|}}} | label41 = Start&nbsp;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&nbsp;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&nbsp;of | data46 = {{{branch_of|}}} | label47 = Connects&nbsp;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&nbsp;names | data24 = {{{former_names|}}} | label25 = Modern&nbsp;name | data25 = {{{modern_name|}}} | label26 = Current&nbsp;owner | data26 = {{{present_owner|}}} | label27 = Original&nbsp;owner | data27 = {{{original_owner|}}} | label28 = {{longitem|Principal engineer}} | data28 = {{{engineer|}}} | label29 = Other&nbsp;engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}} | data29 = {{{other_engineer|}}} | label30 = Date&nbsp;approved | data30 = {{{date_approved|}}} | label31 = Date&nbsp;of&nbsp;act | data31 = {{{date_act|}}} | label32 = Construction&nbsp;began | data32 = {{{date_began|}}} | label33 = {{longitem|Date of first use}} | data33 = {{{date_use|}}} | label34 = Date&nbsp;completed | data34 = {{{date_completed|}}} | label35 = Date&nbsp;extended | data35 = {{{date_extended|}}} | label36 = Date&nbsp;closed | data36 = {{{date_closed|}}} | label37 = Date&nbsp;restored | data37 = {{{date_restored|}}} | label38 = {{longitem|{{{xfield2}}}}} | data38 = {{{xvalue2|}}} | header39 = Geography | label40 = Direction | data40 = {{{direction|}}} | label41 = Start&nbsp;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&nbsp;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&nbsp;of | data46 = {{{branch_of|}}} | label47 = Connects&nbsp;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&nbsp;names | data24 = {{{former_names|}}} | label25 = Modern&nbsp;name | data25 = {{{modern_name|}}} | label26 = Current&nbsp;owner | data26 = {{{present_owner|}}} | label27 = Original&nbsp;owner | data27 = {{{original_owner|}}} | label28 = {{longitem|Principal engineer}} | data28 = {{{engineer|}}} | label29 = Other&nbsp;engineer{{pluralize from text|{{{other_engineer|}}}|plural=s}} | data29 = {{{other_engineer|}}} | label30 = Date&nbsp;approved | data30 = {{{date_approved|}}} | label31 = Date&nbsp;of&nbsp;act | data31 = {{{date_act|}}} | label32 = Construction&nbsp;began | data32 = {{{date_began|}}} | label33 = {{longitem|Date of first use}} | data33 = {{{date_use|}}} | label34 = Date&nbsp;completed | data34 = {{{date_completed|}}} | label35 = Date&nbsp;extended | data35 = {{{date_extended|}}} | label36 = Date&nbsp;closed | data36 = {{{date_closed|}}} | label37 = Date&nbsp;restored | data37 = {{{date_restored|}}} | label38 = {{longitem|{{{xfield2}}}}} | data38 = {{{xvalue2|}}} | header39 = Geography | label40 = Direction | data40 = {{{direction|}}} | label41 = Start&nbsp;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&nbsp;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&nbsp;of | data46 = {{{branch_of|}}} | label47 = Connects&nbsp;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 == "&#123;&#123;&#123;coordinates&#125;&#125;&#125;" 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&params=1_2_N_3_4_W_ or //tools.wmflabs.org/geohack/geohack.php?pagename=Example&params=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