import { Dialog, Disclosure, Menu, Transition } from "@headlessui/react"; import { ChevronDownIcon, ChevronUpIcon, } from "@heroicons/react/20/solid"; import { XMarkIcon } from "@heroicons/react/24/outline"; import { Fragment, useRef, useState } from "react"; import Map, { Layer, Popup, ScaleControl, Source } from "react-map-gl/maplibre"; import basemap from "./assets/basemap.json"; import mapstyle from "./countries.json"; mapstyle.sources.remap.url = import.meta.env.MODE === "localhost" ? "http://localhost:8080/capabilities/remap.json" : mapstyle.sources.remap.url const paintedLayers = mapstyle.layers.reduce((acc, cur) => ({ ...acc, [cur.id]: cur }), {}) const toggleLayers = ["Подложка"] const initialPaintFilters = [ { id: "parameter_name", name: "Показатель ВИЭ-генерации", options: [ { "value": "power_fact_mw", "label": "Фактическая установленная мощность, МВт", "checked": true }, { "value": "generation_gwh", "label": "Производство электроэнергии, млн кВт⋅ч", "checked": false }, { "value": "res_share_generation", "label": "Доля в выработке электроэнергии, %", "checked": false }, { "value": "res_share_power", "label": "Доля в балансе мощности, %", "checked": false }, { "value": "generation_to_population_kWh_pers", "label": "Производство электроэнергии на душу населения, кВт⋅ч/чел.", "checked": false } ] }, ] const initialFilterFilters = [ { id: "id_tech", name: "ВИЭ-технология", options: [ { "value": 1, "label": "СЭС", "checked": false }, { "value": 2, "label": "Наземные ВЭС", "checked": false }, { "value": 3, "label": "Офшорные ВЭС", "checked": false }, { "value": 4, "label": "ГЭС", "checked": false }, { "value": 5, "label": "БиоЭС", "checked": false }, { "value": 6, "label": "ГеоЭС", "checked": false }, { "value": 8, "label": "СЭС и ВЭС", "checked": false }, { "value": 7, "label": "Все ВИЭ", "checked": true } ] }, { "id": "year", "name": "Год", "options": [ { "value": 2010, "label": 2010, "checked": false }, { "value": 2011, "label": 2011, "checked": false }, { "value": 2012, "label": 2012, "checked": false }, { "value": 2013, "label": 2013, "checked": false }, { "value": 2014, "label": 2014, "checked": false }, { "value": 2015, "label": 2015, "checked": false }, { "value": 2016, "label": 2016, "checked": false }, { "value": 2017, "label": 2017, "checked": false }, { "value": 2018, "label": 2018, "checked": false }, { "value": 2019, "label": 2019, "checked": false }, { "value": 2020, "label": 2020, "checked": false }, { "value": 2021, "label": 2021, "checked": false }, { "value": 2022, "label": 2022, "checked": false }, { "value": 2023, "label": 2023, "checked": false }, { "value": 2024, "label": 2024, "checked": true } ] } ] export default function Countries({ mapOptions, onMapOptionClick }) { const mapRef = useRef(null); const [open, setOpen] = useState(false) const [mobileFiltersOpen, setMobileFiltersOpen] = useState(false); const [popupInfo, setPopupInfo] = useState(null); const [paintFilters, setPaintFilters] = useState(initialPaintFilters); const [filterFilters, setFilterFilters] = useState(initialFilterFilters); const generatePopup = (info) => { // console.log(info) const [currentTech, currentYear, currentParameter] = filterFilters.map(f => f.options.find(o => o.checked)).concat(paintFilters[0].options.find(o => o.checked)) return (
{info.area_km2 &&

Площадь {(info.area_km2 / 1000).toFixed(1).replace(".", ",")} тыс. км²

} {info.population_person &&

Численность населения {(info.population_person / 1000).toFixed(1).replace(".", ",")} тыс. чел.

} {info.population_densitiy_pers_km2 &&

Плотность населения {info.population_densitiy_pers_km2.toFixed(1).replace(".", ",")} чел./км²

} {info.year_carbon_neutrality &&

Целевой год достижения углеродной нейтральности {info.year_carbon_neutrality}

} {info[currentParameter.value] &&

{currentParameter.label} в {currentYear.label} году

{info[currentParameter.value] != null && }
{currentTech.label} {info[currentParameter.value].toFixed(2).replace(".", ",")}
}

Совокупная установленная мощность ВИЭ по итогам {info.static_date_power} года, МВт

{info.static_power_fact_solar_mw != null && } {info.static_power_fact_onshore_mw != null && } {info.static_power_fact_offshore_mw != null && } {info.static_power_fact_res_mw != null && } {info.static_res_share_power != null && } {info.static_solar_wind_share_power != null && }
Солнечные электростанции {info.static_power_fact_solar_mw.toFixed(2).replace(".", ",")}
Наземные ветроэлектростанции {info.static_power_fact_onshore_mw.toFixed(2).replace(".", ",")}
Офшорные ветроэлектростанции {info.static_power_fact_offshore_mw.toFixed(2).replace(".", ",")}
Всего ВИЭ (включая СЭС, ВЭС, ГЭС, БиоЭС, ГеоЭС) {info.static_power_fact_res_mw.toFixed(2).replace(".", ",")}
Доля всей ВИЭ-генерации в балансе мощности страны, % {info.static_res_share_power.toFixed(2).replace(".", ",")}
Доля СЭС и ВЭС в балансе мощности страны, % {info.static_solar_wind_share_power.toFixed(2).replace(".", ",")}

Источник: IRENA

{info.date_actualization &&

Дата актуализации: {info.date_actualization}

}
) } const generateLegend = function (parameter) { const colors_and_breaks = mapstyle.layers.find(layer => layer.id == parameter.value).paint["fill-color"].slice(2) const colors = colors_and_breaks.filter((cb, i) => i % 2 == 0) const breaks = colors_and_breaks.filter((cb, i) => i % 2 == 1) const labels = [`менее ${breaks[0]}`, ...breaks.map((brk, i, arr) => typeof arr[i + 1] !== 'undefined' ? `${brk} - ${arr[i + 1]}` : `более ${breaks.at(-1)}`)] const legend_items = colors.map((col, i) => ( { "color": col, "label": labels[i] } )).reverse() return (

{parameter.label}

{legend_items.map(item =>

{item.label}

)}
) } const handleFilterToggle = function (event) { if (paintFilters.filter((filter) => filter.id == event.target.name).length > 0) { const newStatePaintFilters = paintFilters.map((filter) => filter.id == event.target.name ? { ...filter, options: filter.options.map((option) => option.value == event.target.defaultValue ? { ...option, checked: true } : { ...option, checked: false } ), } : filter ); setPaintFilters(newStatePaintFilters); } else { const newStateFilterFilters = filterFilters.map((filter) => filter.id == event.target.name ? { ...filter, options: filter.options.map((option) => option.value == event.target.defaultValue ? { ...option, checked: true } : { ...option, checked: false } ), } : filter ); setFilterFilters(newStateFilterFilters); } }; const applyPaintFilters = (filtersObj) => { const parameter = filtersObj.find(filter => filter.id == "parameter_name").options.find(option => option.checked).value const newPaint = paintedLayers[parameter].paint return newPaint }; const applyFilterFilters = (filtersObj) => { const year_value = filtersObj.find(f => f.id == "year").options.find(option => option.checked).value const tech_value = filtersObj.find(f => f.id == "id_tech").options.find(option => option.checked).value return ["all", ["==", ["get", "year"], year_value], ["==", ["get", "id_tech_global"], tech_value]] }; const handleClick = (event) => { if (event.features[0]) { event.originalEvent.stopPropagation(); setPopupInfo({ lon: event.lngLat.lng, lat: event.lngLat.lat, ...event.features[0].properties }) setOpen(true) } }; const handleMouseEnter = (event) => { const feature = event.features[0]; if (!feature) return; mapRef.current.getCanvas().style.cursor = "pointer"; }; const handleMouseLeave = (event) => { const feature = event.features[0]; if (!feature) { return; } mapRef.current.getCanvas().style.cursor = ""; }; return (

Развитие возобновляемой энергетики в странах мира

{mapOptions.find((option) => option.current).name}
{mapOptions.map((option) => ( {option.name} ))}
{/* Layers */}
    {toggleLayers.map((layer_name) => (
    { mapRef.current .getMap() .setLayoutProperty( event.target.id, "visibility", event.target.checked ? "visible" : "none" ); }} />
    ))}
{/* Legend */} {({ open }) => ( <>

Легенда {open ? (

{generateLegend(paintFilters.find(f => f.id == "parameter_name").options.find(parameter => parameter.checked))}
)}
{/* Filters */} {paintFilters.concat(filterFilters).map((section) => ( {({ open }) => ( <>

{section.name} {open ? (

{section.options.map((option, optionIdx) => (
o.checked).value == "res_share_generation" || paintFilters[0].options.find(o => o.checked).value == "res_share_power" || paintFilters[0].options.find(o => o.checked).value == "generation_to_population_kWh_pers") && section.id == "id_tech" && option.value < 7 ? true : false } />
))}
)}
))} {/* Metadata */} {({ open }) => ( <>

Метаданные {open ? (

Границы показаны по состоянию на 2021 год

© Ассоциация развития возобновляемой энергетики

)}
{/* Map itself */}
{open && {popupInfo.country_russian_name} }
{popupInfo && popupInfo.country_russian_name}
{/* Replace with your content */} {popupInfo && generatePopup(popupInfo)} {/* /End replace */}
); }