diff options
author | Guilhem Moulin <guilhem@fripost.org> | 2025-06-12 14:18:28 +0200 |
---|---|---|
committer | Guilhem Moulin <guilhem@fripost.org> | 2025-06-12 19:31:47 +0200 |
commit | 05a018f27aba3a20fd581cb88daa8afbbd3407de (patch) | |
tree | 8d27d74c988a18cbac27caff6bc95e9a5d1b3240 /src/popover.js | |
parent | 1f09018cf8c5e2ddc27a5afa89efeaf19c0eac4a (diff) |
Factor out Popover handling into separate module.
Diffstat (limited to 'src/popover.js')
-rw-r--r-- | src/popover.js | 1959 |
1 files changed, 1959 insertions, 0 deletions
diff --git a/src/popover.js b/src/popover.js new file mode 100644 index 0000000..ef809ed --- /dev/null +++ b/src/popover.js @@ -0,0 +1,1959 @@ +import Overlay from 'ol/Overlay.js'; +import Stroke from 'ol/style/Stroke.js'; +import Style from 'ol/style/Style.js'; + +import { Popover } from 'bootstrap'; + +const popup = document.getElementById('popup'); + +/* TODO: this should really be refactored… */ +const layers = { + 'mrr.appr_ec': { + popoverTitle: 'Bearbetningskoncession \u2013 beviljad', + popover: [ + ['Namn', 'name'], + ['Koncessionsmineral', 'mineral'], + ['Ägare', 'owners'], + ['Tillståndsid', 'licenceid', { classes: ['feature-attr-mrr-license-id'] }], + ['Areal', 'geom_area', { fn: 'area' }], + ['Giltig från', 'validfrom'], + ['Giltig till', 'validto'], + ['Diarienummer', 'diarynr', { classes: ['feature-attr-dnr'] }], + ['Ansökningsdatum', 'appl_date'], + ['Beslutsdatum', 'dec_date'], + //['Kommun', 'Municipality'], + //['Län', 'County'], + ], + }, + 'mrr.appl_ec': { + popoverTitle: 'Bearbetningskoncession \u2013 ansökt', + popover: [ + ['Namn', 'name'], + ['Koncessionsmineral', 'mineral'], + ['Sökande', 'owners'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Ansökningsdatum', 'appl_date'], + ['Diarienummer', 'diarynr', { classes: ['feature-attr-dnr'] }], + //['Kommun', 'Municipality'], + //['Län', 'County'], + ], + }, + 'mrr.appr_met': { + popoverTitle: 'Undersökningstillstånd, metaller och industrimineral \u2013 beviljad', + popover: [ + ['Namn', 'name'], + ['Koncessionsmineral', 'mineral'], + ['Ägare', 'owners'], + ['Tillståndsid', 'licenceid', { classes: ['feature-attr-mrr-license-id'] }], + ['Areal', 'geom_area', { fn: 'area' }], + ['Giltig från', 'validfrom'], + ['Giltig till', 'validto'], + ['Diarienummer', 'diarynr', { classes: ['feature-attr-dnr'] }], + ['Ansökningsdatum', 'appl_date'], + ['Beslutsdatum', 'dec_date'], + //['Kommun', 'Municipality'], + //['Län', 'County'], + ], + }, + 'mrr.appl_met': { + popoverTitle: 'Undersökningstillstånd, metaller och industrimineral \u2013 ansökt', + popover: [ + ['Namn', 'name'], + ['Koncessionsmineral', 'mineral'], + ['Sökande', 'owners'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Ansökningsdatum', 'appl_date'], + ['Diarienummer', 'diarynr', { classes: ['feature-attr-dnr'] }], + //['Kommun', 'Municipality'], + //['Län', 'County'], + ], + }, + 'mrr.appr_ogd': { + popoverTitle: 'Undersökningstillstånd, olja, gas och diamant \u2013 beviljad', + popover: [ + ['Namn', 'name'], + ['Koncessionsmineral', 'mineral'], + ['Ägare', 'owners'], + ['Tillståndsid', 'licenceid', { classes: ['feature-attr-mrr-license-id'] }], + ['Areal', 'geom_area', { fn: 'area' }], + ['Giltig från', 'validfrom'], + ['Giltig till', 'validto'], + ['Diarienummer', 'diarynr', { classes: ['feature-attr-dnr'] }], + ['Ansökningsdatum', 'appl_date'], + ['Beslutsdatum', 'dec_date'], + //['Kommun', 'Municipality'], + //['Län', 'County'], + ], + }, + 'mrr.appl_ogd': { + popoverTitle: 'Undersökningstillstånd, olja, gas och diamant \u2013 ansökt', + popover: [ + ['Namn', 'name'], + ['Koncessionsmineral', 'mineral'], + ['Sökande', 'owners'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Ansökningsdatum', 'appl_date'], + ['Diarienummer', 'diarynr', { classes: ['feature-attr-dnr'] }], + //['Kommun', 'Municipality'], + //['Län', 'County'], + ], + }, + 'mrr.appr_dl': { + popoverTitle: 'Markanvisning till koncession', + popover: [ + ['Namn', 'name'], + ['Tillhörande bearbetnings\u00ADkoncession(er)', 'conc_name'], + ['Tillståndsid', 'licenceid', { classes: ['feature-attr-mrr-license-id'] }], + ['Areal', 'geom_area', { fn: 'area' }], + ['Diarienummer', 'diarynr', { classes: ['feature-attr-dnr'] }], + ['Ansökningsdatum', 'appl_date'], + ['Beslutsdatum', 'dec_date'], + //['Kommun', 'Municipality'], + //['Län', 'County'], + ], + }, + + 'svk.ledningar': { + popoverTitle: 'Kraftledning (befintlig)', + popover: [ + ['Förläggning', 'Placement'], + ['Spänning', 'Voltage', { unit: 'kV' }], + ['Ledlängd', 'geom_length', { fn: 'length' }], + ], + }, + 'svk.transmissionsnatsprojekt': { + popoverTitle: 'Transmissionsnätsprojekt', + popover: [ + ['Projektnamn', 'Name'], + ['Spänning', 'Voltage', { unit: 'kV' }], + ['Länk', 'Url', { fn: function(v) { + if (v == null | v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + + 'vbk.area_current': { + popoverTitle: 'Landbaserad projekteringsområde för vindkraft', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Aktuella verk', 'AntalVerk'], + ['Antal ej koordinatsatta verk', 'AntalEjXY'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Ändringsansökan pågår', 'AndringsansokanPagar'], + ['Under byggnation', 'UnderByggnation'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.area_notcurrent': { + popoverTitle: 'Landbaserad projekteringsområde för vindkraft \u2013 ej aktuell', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Aktuella verk', 'AntalVerk'], + ['Antal ej koordinatsatta verk', 'AntalEjXY'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Ändringsansökan pågår', 'AndringsansokanPagar'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_completed': { + popoverTitle: 'Havsbaserad vindkraft \u2013 tillståndsansökan uppförd', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Tillståndsansökan inlämnad', 'AnsokanInlamnat'], + ['Tillståndsansökan beviljad', 'AnsokanBeviljad'], + ['Överklagad', 'AnsokanOverklagad'], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Parken uppförd', 'Uppfort'], + ['Beviljat antal verk', 'BeviljatAntalVerk'], + ['Uppfört antal verk', 'UppfortAntalVerk'], + ['Beviljad maxhöjd', 'BeviljadMaxhojd', { unit: 'm' }], + ['Installerad effekt', 'InstalleradEffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_approved': { + popoverTitle: 'Havsbaserad vindkraft \u2013 tillståndsansökan beviljad', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Ändringsansökan pågår', 'AndringsansokanPagar'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Tillståndsansökan inlämnad', 'AnsokanInlamnat'], + ['Tillståndsansökan återkallad', 'AnsokanAterkallad'], + ['Tillståndsansökan beviljad', 'AnsokanBeviljad'], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Under byggnation', 'UnderByggnation'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Beviljat antal verk', 'BeviljatAntalVerk'], + ['Beviljad maxhöjd', 'BeviljadMaxhojd', { unit: 'm' }], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_amended': { + popoverTitle: 'Havsbaserad vindkraft \u2013 ändringsansökan', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + //['Ändringsansökan pågår', 'AndringsansokanPagar'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Tillståndsansökan inlämnad', 'AnsokanInlamnat'], + //['Natura2000 ansökan', 'Natura2000_Ansokan'], + //['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_rejected': { + popoverTitle: 'Havsbaserad vindkraft \u2013 tillståndsansökan avslagen', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Tillståndsansökan inlämnad', 'AnsokanInlamnat'], + ['Tillståndsansökan avslagen', 'AnsokanAvslagen'], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_appealed': { + popoverTitle: 'Havsbaserad vindkraft \u2013 överklagad', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Tillståndsansökan inlämnad', 'AnsokanInlamnat'], + ['Tillståndsansökan beviljad', 'AnsokanBeviljad'], + ['Överklagad', 'AnsokanOverklagad'], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Beviljat antal verk', 'BeviljatAntalVerk'], + ['Beviljad maxhöjd', 'BeviljadMaxhojd', { unit: 'm' }], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_applied': { + popoverTitle: 'Havsbaserad vindkraft \u2013 tillståndsansökan inlämnad', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Tillståndsansökan inlämnad', 'AnsokanInlamnat'], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_consultation': { + popoverTitle: 'Havsbaserad vindkraft \u2013 samråd inför tillståndsansökan', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_investigation': { + popoverTitle: 'Havsbaserad vindkraft \u2013 inledande undersökningar', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.offshore_revoked': { + popoverTitle: 'Havsbaserad vindkraft \u2013 inte aktuell eller återkallad', + popover: [ + ['Projektnamn', 'Projektnamn'], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Verksamhetsutövare', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Projektstatus', 'Projektstatus'], + ['Diarienummer', 'Diarienummer'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Samrådsunderlag inlämnat', 'SamradsunderlagInlamnat'], + ['Tillståndsansökan inlämnad', 'AnsokanInlamnat'], + ['Tillståndsansökan återkallad', 'AnsokanAterkallad'], + ['Tillståndsansökan beviljad', 'AnsokanBeviljad'], + ['Överklagad', 'AnsokanOverklagad'], + ['Natura2000 ansökan', 'Natura2000_Ansokan'], + ['Natura2000 beslutsdatum', 'Natura2000_Beslutdatum'], + ['Planerat antal verk (min)', 'PlaneratAntalVerkMin'], + ['Planerat antal verk (max)', 'PlaneratAntalVerkMax'], + ['Panerad totalhöjd (min)', 'PlaneradHojdMin', { unit: 'm' }], + ['Panerad totalhöjd (max)', 'PlaneradHojdMax', { unit: 'm' }], + ['Planerad årsproduktion (min)', 'PlaneradProduktionMin', { unit: 'GWh' }], + ['Planerad årsproduktion (max)', 'PlaneradProduktionMax', { unit: 'GWh' }], + ['Planerad byggstart', 'PlaneradByggstart'], + ['Planerat drifttagande', 'PlaneratDrift'], + ['Beviljat antal verk', 'BeviljatAntalVerk'], + ['Beviljad maxhöjd', 'BeviljadMaxhojd', { unit: 'm' }], + ['Elområde', 'ElNamn'], + ['Senast uppdaterat', 'SenasteUppdaterat'], + ], + }, + 'vbk.station_completed': { + popoverTitle: 'Landbaserad vindkraftverk \u2013 uppfört', + popover: [ + ['Verk-ID', 'VerkID', { classes: ['feature-objid'] }], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Projektnamn', 'Projektnamn'], + ['Status', 'Status'], + ['Handlingstyp', 'Handlingstyp'], + ['Uppförandedatum', 'Uppfort'], + ['Miljöbalken tillstånd tidsbegränsning', 'MB_Tillstand'], + ['Totalhöjd', 'Totalhojd', { unit: 'm' }], + ['Navhöjd', 'Navhojd', { unit: 'm' }], + ['Rotordiameter', 'Rotordiameter', { unit: 'm' }], + ['Maxeffekt', 'Maxeffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Fabrikat', 'Fabrikat'], + ['Modell', 'Modell'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Placering', 'Placering'], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Datum för senaste uppdatering av verk', 'SenasteUppdaterat'], + ], + }, + 'vbk.station_processed': { + popoverTitle: 'Landbaserad vindkraftverk \u2013 handlagt', + popover: [ + ['Verk-ID', 'VerkID', { classes: ['feature-objid'] }], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Projektnamn', 'Projektnamn'], + ['Status', 'Status'], + ['Handlingstyp', 'Handlingstyp'], + ['Totalhöjd', 'Totalhojd', { unit: 'm' }], + ['Navhöjd', 'Navhojd', { unit: 'm' }], + ['Rotordiameter', 'Rotordiameter', { unit: 'm' }], + ['Maxeffekt', 'Maxeffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Fabrikat', 'Fabrikat'], + ['Modell', 'Modell'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Placering', 'Placering'], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Datum för senaste uppdatering av verk', 'SenasteUppdaterat'], + ], + }, + 'vbk.station_approved': { + popoverTitle: 'Landbaserad vindkraftverk \u2013 beviljat', + popover: [ + ['Verk-ID', 'VerkID', { classes: ['feature-objid'] }], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Projektnamn', 'Projektnamn'], + ['Status', 'Status'], + ['Handlingstyp', 'Handlingstyp'], + ['Miljöbalken tillstånd tidsbegränsning', 'MB_Tillstand'], + ['Totalhöjd', 'Totalhojd', { unit: 'm' }], + ['Navhöjd', 'Navhojd', { unit: 'm' }], + ['Rotordiameter', 'Rotordiameter', { unit: 'm' }], + ['Maxeffekt', 'Maxeffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Fabrikat', 'Fabrikat'], + ['Modell', 'Modell'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Placering', 'Placering'], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Datum för senaste uppdatering av verk', 'SenasteUppdaterat'], + ], + }, + 'vbk.station_revoked': { + popoverTitle: 'Landbaserad vindkraftverk \u2013 inte längre aktuell/återkallat', + popover: [ + ['Verk-ID', 'VerkID', { classes: ['feature-objid'] }], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Projektnamn', 'Projektnamn'], + ['Status', 'Status'], + ['Handlingstyp', 'Handlingstyp'], + ['Miljöbalken tillstånd tidsbegränsning', 'MB_Tillstand'], + ['Totalhöjd', 'Totalhojd', { unit: 'm' }], + ['Navhöjd', 'Navhojd', { unit: 'm' }], + ['Rotordiameter', 'Rotordiameter', { unit: 'm' }], + ['Maxeffekt', 'Maxeffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Fabrikat', 'Fabrikat'], + ['Modell', 'Modell'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Placering', 'Placering'], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Datum för senaste uppdatering av verk', 'SenasteUppdaterat'], + ], + }, + 'vbk.station_rejected': { + popoverTitle: 'Landbaserad vindkraftverk \u2013 avslagit/nekat', + popover: [ + ['Verk-ID', 'VerkID', { classes: ['feature-objid'] }], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Projektnamn', 'Projektnamn'], + ['Status', 'Status'], + ['Handlingstyp', 'Handlingstyp'], + ['Miljöbalken tillstånd tidsbegränsning', 'MB_Tillstand'], + ['Totalhöjd', 'Totalhojd', { unit: 'm' }], + ['Navhöjd', 'Navhojd', { unit: 'm' }], + ['Rotordiameter', 'Rotordiameter', { unit: 'm' }], + ['Maxeffekt', 'Maxeffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Fabrikat', 'Fabrikat'], + ['Modell', 'Modell'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Placering', 'Placering'], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Datum för senaste uppdatering av verk', 'SenasteUppdaterat'], + ], + }, + 'vbk.station_dismounted': { + popoverTitle: 'Landbaserad vindkraftverk \u2013 nedmonterat', + popover: [ + ['Verk-ID', 'VerkID', { classes: ['feature-objid'] }], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Projektnamn', 'Projektnamn'], + ['Status', 'Status'], + ['Handlingstyp', 'Handlingstyp'], + ['Uppförandedatum', 'Uppfort'], + ['Totalhöjd', 'Totalhojd', { unit: 'm' }], + ['Navhöjd', 'Navhojd', { unit: 'm' }], + ['Rotordiameter', 'Rotordiameter', { unit: 'm' }], + ['Maxeffekt', 'Maxeffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Fabrikat', 'Fabrikat'], + ['Modell', 'Modell'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Placering', 'Placering'], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Datum för senaste uppdatering av verk', 'SenasteUppdaterat'], + ], + }, + 'vbk.station_appealed': { + popoverTitle: 'Landbaserad vindkraftverk \u2013 överklagat', + popover: [ + ['Verk-ID', 'VerkID', { classes: ['feature-objid'] }], + ['Områdes-ID', 'OmrID', { classes: ['feature-objid'] }], + ['Projektnamn', 'Projektnamn'], + ['Status', 'Status'], + ['Handlingstyp', 'Handlingstyp'], + ['Totalhöjd', 'Totalhojd', { unit: 'm' }], + ['Navhöjd', 'Navhojd', { unit: 'm' }], + ['Rotordiameter', 'Rotordiameter', { unit: 'm' }], + ['Maxeffekt', 'Maxeffekt', { unit: 'MW' }], + ['Beräknad årsproduktion', 'Calprod', { unit: 'GWh' }], + ['Fabrikat', 'Fabrikat'], + ['Modell', 'Modell'], + ['Organisationsnamn', 'Organisationsnamn'], + ['Organisationsnummer', 'Organisationsnummer', { classes: ['feature-orgnr'] }], + ['Placering', 'Placering'], + //['Kommun', 'KOMNAMN'], + //['Län', 'LANSNAMN'], + ['Elområde', 'ElNamn'], + ['Datum för senaste uppdatering av verk', 'SenasteUppdaterat'], + ], + }, + + /* Documentation at + * https://www.skogsstyrelsen.se/globalassets/sjalvservice/karttjanster/geodatatjanster/produktbeskrivningar/utforda-avverkningar---produktbeskrivning.pdf + * */ + 'avverk.utford': { + popoverTitle: 'Utförd avverkning', + popover: [ + ['Ärendebeteckning', 'Beteckn', { classes: ['feature-objid'] }], + ['Registeringsår', 'ArendeAr'], + ['Skogstyp', 'Skogstyp'], + ['Areal anmält', 'AnmaldHa', { unit: 'ha' }], + ['Areal naturlig föryngring', 'NatforHa', { unit: 'ha', fn: (v) => v === 0 ? '' : v }], + //['Areal plantering', 'SkogsodlHa', { unit: 'ha', fn: (v) => v === 0 ? '' : v }], + ['Avverkningstyp', 'Avverktyp'], + ['Datum för avverkning', 'Avvdatum'], + ['Ursprung för datum för avverkning', 'KallaDatum'], + //['Ursprung för areal avverkning', 'KallaAreal'], + //['Kommun', 'Kommun'], + //['Län', 'Lan'], + ['Areal för ytan', 'geom_area', { fn: 'area' }], + ], + }, + /* Documentation at + * https://www.skogsstyrelsen.se/globalassets/sjalvservice/karttjanster/geodatatjanster/produktbeskrivningar/yttre-granser-for-avverkningsanmalda-omraden---produktbeskrivning.pdf + * */ + 'avverk.anmald': { + popoverTitle: 'Avverkningsanmälansområde', + popover: [ + ['Ärendebeteckning', 'Beteckn', { classes: ['feature-objid'] }], + ['Inkom datum', 'Inkomdatum'], + ['Registeringsår', 'ArendeAr'], + //['Skogstyp', 'Skogstyp'], + ['Areal anmält', 'AnmaldHa', { unit: 'ha' }], + ['Areal naturlig föryngring', 'NatforHa', { unit: 'ha', fn: (v) => v === 0 ? '' : v }], + ['Areal plantering', 'SkogsodlHa', { unit: 'ha', fn: (v) => v === 0 ? '' : v }], + ['Avverkningssäsong', 'AvvSasong'], + //['Avverkningstyp', 'Avverktyp'], + //['Ändamål', 'Andamal'], + //['Kommun', 'Kommun'], + //['Län', 'Lan'], + ['Ärendestatus', 'ArendeStatus'], + ['Avverkad areal', 'AvvHa', { unit: 'ha' }], + ], + }, + + 'skydd.tilltradesforbud': { + popoverTitle: 'Tillträdesförbud', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Föreskriftsområde', 'FORSKRNAMN'], + ['Namn', 'OBJEKTNAMN'], + ['Beslutsstatus', 'BESLSTAT'], + ['Föreskriftstyp', 'FORESKRTYP'], + ['Föreskriftssubtyp', 'FORESKRIFT'], + ['Från datum', 'FRANDATUM'], + ['Till datum', 'TILLDATUM'], + ['Beskrivning', 'BESKRIVN'], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'skydd.nationalpark': { + popoverTitle: 'Nationalpark', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.naturreservat': { + popoverTitle: 'Naturreservat', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.naturreservat_kommunalt': { + popoverTitle: 'Kommunalt naturreservat', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.naturvardsomrade': { + popoverTitle: 'Naturvårdsområde', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.djur_och_vaxtskyddsomrade': { + popoverTitle: 'Djur- och växtskyddsområde', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.kulturreservat': { + popoverTitle: 'Kulturreservat', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.vattenskyddsomrade': { + popoverTitle: 'Vattenskyddsområden', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ikraftträdandedatum föreskrifter', 'IKRAFTDATF'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Tillsynsmyndighet', 'TILLSYNSMH'], + ['Prövningsmyndighet tillstånd', 'PROVNMHTIL'], + ['Prövningsmyndighet dispens', 'PROVNMHDIS'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.landskapsbildsskyddsomrade': { + popoverTitle: 'Landskapsbildsskyddsområde', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.skogligt_biotopskyddsomrade': { + popoverTitle: 'Biotopskydd i skogsmark', + popover: [ + ['Ärendebeteckning', 'Beteckn', { classes: ['feature-objid'] }], + ['Biotopkategori', 'Biotyp'], + ['Skogstyp', 'Naturtyp'], + ['Registeringsår', 'ArendeAr'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Skogsmarksareal', 'AreaProd', { unit: 'ha' }], + ['Beslutsdatum', 'Datbeslut'], + ['Länk', 'Url', { fn: function(v) { + if (v == null | v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'skydd.ovrigt_biotopskyddsomrade': { + popoverTitle: 'Biotopskydd utanför skogsmark', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.naturminne_yta': { + popoverTitle: 'Naturminne (yta)', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.naturminne_punkt': { + popoverTitle: 'Naturminne (punkt)', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.interimistiskt_forbud': { + popoverTitle: 'Interimistiskt förbud', + popover: [ + ['NVR-ID', 'NVRID', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Beslutsstatus', 'BESLSTATUS'], + ['Beslutsdatum (bildande)', 'URSBESLDAT'], + ['Ursprungligt gällandedatum', 'URSGALLDAT'], + ['Senaste gällandedatum', 'SENGALLDAT'], + ['Förvaltare', 'FORVALTARE'], + ['IUCN-kategori', 'IUCNKAT'], + ['Diarienummer', 'DIARIENR', { classes: ['feature-attr-dnr'] }], + ['Lagrum', 'LAGRUM'], + ['Beslutsmyndighet', 'BESLMYND'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ], + }, + 'skydd.fageldirektivet': { + popoverTitle: 'Fågeldirektivet (SPA)', + popover: [ + ['Områdeskod', 'SITE_CODE', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Områdestyp', 'OMRADESTYP'], + ['Uppgiftslämnare', 'UPPLAMNARE'], + ['SPA-datum', 'SPA_DATUM'], + ['SCI-förslagsdatum', 'SCI_FORSL'], + ['SCI-datum', 'SCI_DATUM'], + ['SAC-datum', 'SAC_DATUM'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Kvalitet', 'KVALITET'], + ['Kännetecken för området', 'KARAKTAR'], + ['Arter', 'ARTER'], + ['Naturtyper', 'NATURTYPER'], + ['Bevarandeplan', 'BEVPLAN', { fn: function(v) { + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'skydd.habitatdirektivet': { + popoverTitle: 'Art- och habitatdirektivet (SCI)', + popover: [ + ['Områdeskod', 'SITE_CODE', { classes: ['feature-objid'] }], + ['Namn', 'NAMN'], + ['Områdestyp', 'OMRADESTYP'], + ['Uppgiftslämnare', 'UPPLAMNARE'], + ['SPA-datum', 'SPA_DATUM'], + ['SCI-förslagsdatum', 'SCI_FORSL'], + ['SCI-datum', 'SCI_DATUM'], + ['SAC-datum', 'SAC_DATUM'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Kvalitet', 'KVALITET'], + ['Kännetecken för området', 'KARAKTAR'], + ['Arter', 'ARTER'], + ['Naturtyper', 'NATURTYPER'], + ['Bevarandeplan', 'BEVPLAN', { fn: function(v) { + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'skydd.helcom': { + popoverTitle: 'Marina skyddade områden (Helcom MPA)', + popover: [ + ['Namn', 'NAME'], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'skydd.ramsar': { + popoverTitle: 'Ramsar-områden (Våtmarkskonventionen)', + popover: [ + ['Ramsar-ID', 'RAMSAR_ID', { classes: ['feature-objid'] }], + ['Skyddstyp', 'SKYDDSTYP'], + ['Namn', 'NAMN'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'LAND_HA', { unit: 'ha' }], + ['Areal vatten', 'VATTEN_HA', { unit: 'ha' }], + ['Skogsmarksareal', 'SKOG_HA', { unit: 'ha' }], + ['Ursprungligt beslutsdatum', 'URSPR_BESL'], + ['Senaste beslutsdatum', 'SEN_BESLUT'], + ['Rättsakt', 'LEGAL_ACT'], + ['Länk', 'LINK', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'skydd.ospar': { + popoverTitle: 'Marina skyddade områden (Ospar MPA)', + popover: [ + ['Ursprung', 'ORIGIN'], + ['N2000-namn', 'NAMN_N2000'], + ['MPA-ID', 'MPA_ID', { classes: ['feature-objid'] }], + ['MPA-namn', 'MPA_NAMN'], + ['N2000-ID', 'N2000_SITE', { classes: ['feature-objid'] }], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'skydd.varldsarv': { + popoverTitle: 'Världsarv med mycket höga naturvärden (Unesco)', + popover: [ + ['Namn', 'NAMN'], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'skydd.biosfarsomraden': { + popoverTitle: 'Biosfärsområde (Unesco)', + popover: [ + ['Namn', 'NAMN'], + ['Skyddstyp', 'SKYDDSTYP'], + ['Länk', 'LINK', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'skydd.naturvardsavtal': { + popoverTitle: 'Naturvårdsavtal (Naturvårdsverket, Länsstyrelsen)', + popover: [ + ['ID', 'ID', { classes: ['feature-objid'] }], + ['Namn', 'OBJNAMN'], + ['Fastighet', 'FASTBET', { classes: ['feature-objid'] }], + ['Giltig från', 'DATSTART'], + ['Giltig till', 'DATSLUT'], + ['Diarienummer', 'DIARIENRNV', { classes: ['feature-attr-dnr'] }], + ['Satus', 'STATUS'], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'skydd.naturvardsavtal_skogsstyrelsen': { + popoverTitle: 'Naturvårdsavtal (Skogsstyrelsen)', + popover: [ + ['Ärendebeteckning', 'Beteckn', { classes: ['feature-objid'] }], + ['Registeringsår', 'ArendeAr'], + ['Biotopkategori', 'NvaTyp'], + ['Skogstyp', 'Naturtyp'], + ['Avtalsdatum', 'DatAvtal'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Skogsmarksareal', 'AreaProd', { unit: 'ha' }], + ['Länk', 'Url', { fn: function(v) { + if (v == null | v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Undertyp', 'Undertyp'], + ], + }, + 'skydd.atervatningsavtal': { + popoverTitle: 'Återvätningsavtal', + popover: [ + ['Ärendebeteckning', 'Beteckn', { classes: ['feature-objid'] }], + ['Ärendeår', 'ArendeAr'], + ['Avtalat datum', 'AvtalatDatum'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Länk', 'Url', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'nv.naturvarde_sks': { + popoverTitle: 'Objekt med naturvärden (Skogsstyrelsen)', + popover: [ + ['Ärendebeteckning', 'Beteckn', { classes: ['feature-objid'] }], + ['Namn', 'Objnamn'], + ['Datum för fältinventering', 'Datinv'], + ['Biotoptyp #1', 'Biotop1'], + ['Biotoptyp #2', 'Biotop2'], + ['Biotoptyp #3', 'Biotop3'], + ['Nyckelord #1 som beskriver objektet', 'Beskrivn1'], + ['Nyckelord #2 som beskriver objektet', 'Beskrivn2'], + ['Nyckelord #3 som beskriver objektet', 'Beskrivn3'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Länk', 'Url', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'nv.nyckelbiotop': { + popoverTitle: 'Nyckelbiotop (Skogsstyrelsen)', + popover: [ + ['Ärendebeteckning', 'Beteckn', { classes: ['feature-objid'] }], + ['Namn', 'Objnamn'], + ['Datum för fältinventering', 'Datinv'], + ['Biotoptyp #1', 'Biotop1'], + ['Biotoptyp #2', 'Biotop2'], + ['Biotoptyp #3', 'Biotop3'], + ['Nyckelord #1 som beskriver objektet', 'Beskrivn1'], + ['Nyckelord #2 som beskriver objektet', 'Beskrivn2'], + ['Nyckelord #3 som beskriver objektet', 'Beskrivn3'], + ['Nyckelord #4 som beskriver objektet', 'Beskrivn4'], + ['Nyckelord #5 som beskriver objektet', 'Beskrivn5'], + ['Nyckelord #6 som beskriver objektet', 'Beskrivn6'], + ['Nyckelord #7 som beskriver objektet', 'Beskrivn7'], + ['Nyckelord #8 som beskriver objektet', 'Beskrivn8'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Länk', 'Url', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'nv.nyckelbiotop_storskogsbruk': { + popoverTitle: 'Nyckelbiotop (storskogsbruket)', + popover: [ + ['Uppgifter lämnade av', 'Org'], + ['Inkom datum', 'InkomDatum'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Länk', 'Url', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'nv.sumpskog': { + popoverTitle: 'Sumpskog', + popover: [ + ['Objektnamn', 'Namn'], + ['Skogstyp', 'Tradtext'], + ['Hydrologisk typ', 'Hydrtext'], + ['Klass på delobjektet', 'Delklass'], + ['Klass på objektet', 'Klassu'], + ['Andel löv', 'Lovandel'], + ['Andel öppet vatten', 'Andelva'], + ['Krontäckning', 'Krontakn'], + ['Huggningsklass', 'Huggklas'], + ['Ingrepp på delobjekt (max 4)', 'Ingrepp'], + ['Grad av påverkan på delobjekt (max 4)', 'Ingrpavv'], + ['Nyckelord på objektnivå', 'Objnyck'], + ['Nyckelord på delobjektsnivå', 'Delnyck'], + ['Flygbildsår', 'Flygar'], + ['Datum för fältbesök', 'Faltdat'], + ['Inventeringsteknik', 'Invtekn'], + ['Inventeringdatum', 'Invdat'], + ['Ansvarig myndighet', 'Ansvmynd'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Länk', 'Url', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, + 'nv.pagaende_naturreservatsbildning': { + popoverTitle: 'Pågående naturreservatsbildning', + popover: [ + ['Objektnamn', 'NAMN'], + ['Senast justerat', 'GRANSJUST'], /* XXX unclear what "GRANSJUST" means, just a guess */ + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'nv.snus': { + popoverTitle: 'Skyddsvärd statlig skog', + popover: [ + ['Objektnamn', 'NAMN'], + ['År', 'AR'], + ['Naturgeografisk region', 'NATURGEOGR', { classes: ['feature-objid'] }], + ['Objektskategori', 'OBJEKTKATE', { classes: ['feature-objid'] }], + ['Markägare', 'MARKAGARE'], + ['Areal värdekärna', 'VARDEKARNA', { unit: 'ha' }], + ['Areal utvecklingsmark', 'UTV_MARK', { unit: 'ha' }], + ['Totalareal', 'TOTAL_AREA', { unit: 'ha' }], + ['Areal land', 'LAND', { unit: 'ha' }], + ['Areal vatten', 'VATTEN', { unit: 'ha' }], + ['Areal produktiv skogsmark', 'PROD_SKOG', { unit: 'ha' }], + ['Areal produktiv skogsmark ovanför fjällnära gräns', 'SKOG_O_FJG', { unit: 'ha' }], + ['Areal produktiv skogsmark nedanför fjällnära gräns', 'SKOG_N_FJG', { unit: 'ha' }], + ['Areal skyddszon', 'SKYDDSZON', { unit: 'ha' }], + ['Areal arronderingsmark', 'ARRO_MARK', { unit: 'ha' }], + ['Kriterier för urval', 'KRITERIER'], + ['Beskrivning av området', 'BESKRIVN'], + ['Länsstyrelsens bedömning', 'LST_BEDOMN'], + ['Källor', 'KALLOR'], + ], + }, + + 'ri.naturvard': { + popoverTitle: 'Riksintresse naturvård', + popover: [ + ['Namn', 'NAMN'], + ['Skydd', 'SKYDD'], + ['Ämnesområde', 'AMNESOMRAD'], + ['Beskrivning', 'BESKRIVNIN', { fn: function(v) { + if (v == null || !(v.startsWith('http://') || v.startsWith('https://'))) { + return v; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Lagrum', 'LAGRUM'], + ['Beslutsdatum', 'BESLUTSDAT'], + ['Original-ID', 'ORGINALID', { classes: ['feature-objid'] }], + ['Riks-ID', 'RIKSID', { classes: ['feature-objid'] }], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'ri.friluftsliv': { + popoverTitle: 'Riksintresse friluftsliv', + popover: [ + ['Namn', 'NAMN'], + ['Skydd', 'SKYDD'], + ['Ämnesområde', 'AMNESOMR'], + ['Områdesnummer', 'OMRADESNR', { classes: ['feature-objid'] }], + ['Länk värdebeskrivning', 'LANK_VARDE', { fn: function(v) { + if (v == null | v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Lagrum', 'LAGRUM'], + ['Beslutsdatum', 'BESLDATUM'], + ['Ärendenummer', 'ARENDENR', { classes: ['feature-attr-dnr'] }], + ['Länk, beslut', 'LANK_BESLU', { fn: function(v) { + if (v == null | v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Aktivitet', 'AKTIVITET'], + ['Naturtyp', 'NATURTYP'], + ['Areal', 'geom_area', { fn: 'area' }], + ['Areal land', 'AREA_LAND_', { unit: 'ha' }], + ['Areal vatten', 'AREA_VATTE', { unit: 'ha' }], + ], + }, + 'ri.rorligt_friluftsliv': { + popoverTitle: 'Riksintresse rörligt friluftsliv (MB 4 kap 1§ och 2§)', + popover: [ + ['Namn', 'NAMN'], + //['Original-ID', 'ORIGINALID', { classes: ['feature-objid'] }], + ['Beskrivning', 'BESKRIVNIN'], + //['Metodbeskrivning', 'METODBESKR'], + //['Tillk. datum', 'TILLKDATUM'], + //['Rev. datum', 'REVDATUM'], + ['Anmärkning', 'ANM'], + ['Länk', 'OBJEKTLANK', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Areal', 'geom_area', { fn: 'area' }], + ['Referens', 'REFERENS'], + ], + }, + 'ri.obruten_kust': { + popoverTitle: 'Riksintresse obruten kust (MB 4 kap 3§)', + popover: [ + ['Namn', 'NAMN'], + //['Original-ID', 'ORIGINALID', { classes: ['feature-objid'] }], + ['Beskrivning', 'BESKRIVNIN'], + //['Metodbeskrivning', 'METODBESKR'], + //['Tillk. datum', 'TILLKDATUM'], + //['Rev. datum', 'REVDATUM'], + ['Anmärkning', 'ANM'], + ['Objekttyp', 'OBJTYP'], + ['Länk', 'OBJEKTLANK', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Areal', 'geom_area', { fn: 'area' }], + ['Referens', 'REFERENS'], + ], + }, + 'ri.obrutet_fjall': { + popoverTitle: 'Riksintresse obrutet fjäll (MB 4 kap 5§)', + popover: [ + ['Namn', 'NAMN'], + //['Original-ID', 'ORIGINALID', { classes: ['feature-objid'] }], + ['Beskrivning', 'BESKRIVNIN'], + ['Metodbeskrivning', 'METODBESKR'], + ['Tillk. datum', 'TILLKDATUM'], + //['Rev. datum', 'REVDATUM'], + ['Länk', 'OBJEKTLANK', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Areal', 'geom_area', { fn: 'area' }], + ['Referens', 'REFERENS'], + ], + }, + 'ri.skyddade_vattendrag': { + popoverTitle: 'Riksintresse skyddade vattendrag (MB 4 kap 6§)', + popover: [ + ['Namn', 'NAMN'], + //['Original-ID', 'ORIGINALID', { classes: ['feature-objid'] }], + ['Beskrivning', 'BESKRIVNIN'], + ['Metodbeskrivning', 'METODBESKR'], + ['Tillk. datum', 'TILLKDATUM'], + ['Rev. datum', 'REVDATUM'], + ['Anmärkning', 'ANM'], + ['Digitaliseringsskala', 'DIG_SKALA'], + ['Länk', 'OBJEKTLANK', { fn: function(v) { + if (v == null || v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ['Areal', 'geom_area', { fn: 'area' }], + ['Referens', 'REFERENS'], + ], + }, + + 'ren.betesomrade': { + popoverTitle: 'Samebyarnas betesområde', + popover: [ + ['Sameby', 'NAMN'], + ['Samebys typ', 'SAMEBY_TYP'], + ['Signatur', 'SIGNATUR'], + ['Aktualitet', 'AKTUALITET'], + ], + }, + 'ren.flyttled': { + popoverTitle: 'Samebyarnas markanvändningsredovisning \u2013 flyttled', + popover: [ + ['Led-ID', 'LED_ID', { classes: ['feature-objid'], fn: (v) => v === 0 ? '' : v }], + ['Sameby #1', 'SAMEBY1'], + ['Sameby #2', 'SAMEBY2'], + ['Sameby #3', 'SAMEBY3'], + ['Beskrivning', 'BESKRIVNIN'], + ['Årstid', 'ARSTID'], + ['Riksintresse', 'RIKSINTR'], + ['Fast led', 'FAST_LED'], + ['Aktualitet', 'AKTUALITET'], + ['Signatur', 'SIGNATUR'], + ['Ledlängd', 'geom_length', { fn: 'length' }], + ], + }, + 'ren.riks_ren': { + popoverTitle: 'Riksintresse rennäring', + popover: [ + ['Lagrum', 'LAGRUM'], + ['Aktualitet', 'AKTUALITET'], + ['Signatur', 'SIGNATUR'], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + 'ren.omr_riks': { + popoverTitle: '(Kärn)områden av riksintresse rennäring', + popover: [ + ['Områdes-ID', 'OMR_NR', { classes: ['feature-objid'] }], + ['Länk', 'LANK'], + ['Årets runt', 'ARET_RUNT'], + ['Sameby', 'SAMEBY'], + ['Ansvarig', 'ANSVARIG'], + ['Aktualitet', 'AKTUALITET'], + ['Signatur', 'SIGNATUR'], + ['Areal', 'geom_area', { fn: 'area' }], + ], + }, + + /* Documentation at + * https://www.smhi.se/polopoly_fs/1.34541!/dammprod%202013_3%2C%20beskrivning%2C%20SVAR2012_2.pdf + * */ + 'misc.dammar': { + popoverTitle: 'Damm', + popover: [ + ['Dammenhetens namn', 'DNamn'], + ['Dammanläggningens namn', 'Namn'], + ['Länsnr', 'LST_OBJID', { classes: ['feature-objid'] }], + ['Status', 'Status', { fn: (v) => v === 1 ? 'Befintlig damm' : v === 2 ? 'Fd. damm' : '' }], + //['Regleringstyp', 'Regleringstyp'], + ['Byggår', 'ByggAr'], + ['Dammhöjd', 'DammHojd', { unit: 'm' }], + ['Krönlängd', 'KronLangd', { unit: 'm' }], + ['Fiskväg', 'Fiskvag', { fn: (v) => + v === 1 ? 'Bassängtrappa' : + v === 2 ? 'Denilränna' : + v === 3 ? 'Slitsränna' : + v === 4 ? 'Omlöp' : + v === 5 ? 'Inlöp' : + v === 6 ? 'Ålledare' : + v === 7 ? 'Smoltränna' : + v === 8 ? 'Okänd typ' : + v === 9 ? 'Ingen' : + v === 10 ? 'Annan' : + '' }], + ['Huvudavrinningsområdesnummer', 'HARO', { classes: ['feature-objid'] } ], + ['Vattendistrikt', 'Vattendistrikt', { classes: ['feature-objid'] } ], + ['Verksamhet', 'Verksamhet', { fn: (v) => + v === 1 ? 'Kraftproduktion' : + v === 2 ? 'Industri' : + v === 3 ? 'Sjöfart' : + v === 4 ? 'Invallning' : + v === 5 ? 'Vattenförsörjning' : + v === 6 ? 'Spegeldamm' : + v === 7 ? 'Historisk' : + v === 8 ? 'Övrigt' : + '' }], + ['Högsta dämningsgräns', 'DG', { unit: 'm' }], + ['Lägsta sänkningsgräns', 'SG', { unit: 'm' }], + ['Magasinsyta', 'MY', { unit: 'km²' }], + ['Reglerbar volym', 'RV', { unit: 'Mm³' }], + ['Kommentar', 'Kommentar'], + ], + }, + + 'misc.gigafactories': { + popoverTitle: 'Stor industrisatsning', + popover: [ + ['Namn', 'Name'], + ['Länk', 'Url', { fn: function(v) { + if (v == null | v === '') { + return; + } + const a = document.createElement('a'); + a.href = v; + a.target = '_blank'; + const i = document.createElement('i'); + i.classList.add('bi', 'bi-box-arrow-up-right'); + a.appendChild(i); + return a; + }}], + ], + }, +}; + +/* popup and feature overlays */ +export const popover = function(map, mapLayers, featureOverlayLayer) { + const popupOverlay = new Overlay({ + stopEvent: true, + element: popup, + }); + map.addOverlay(popupOverlay); + + let popover, overlayAttributes = [], overlayAttrIdx = 0; + + const header = document.createElement('div'); + header.classList.add('d-flex'); + + const headerGrabbingArea = document.createElement('div'); + headerGrabbingArea.classList.add('flex-grow-1', 'grabbing-area', 'pe-2', 'me-2'); + header.appendChild(headerGrabbingArea); + + headerGrabbingArea.onmousedown = function(event) { + if (event.button != 0) { + return; + } + const popoverTip = Popover.getInstance(popup).tip; + if (popoverTip.classList.contains('popover-maximized')) { + return; + } + pageNode.classList.add('grabbing-area-grabbed'); + + if (!popoverTip.classList.contains('popover-detached')) { + /* detach popover tip */ + popoverTip.classList.add('popover-detached'); + const rect = popoverTip.getBoundingClientRect(); + const style = popoverTip.style; + style.display = 'none'; /* avoid reflows between the following assignments */ + style.position = 'absolute'; + style.transform = ''; + style.inset = `${rect.top}px auto auto ${rect.left}px`; + style.display = ''; + } + + let clientX = event.clientX, clientY = event.clientY; + document.onmousemove = function(event) { + const offsetX = clientX - event.clientX; + const offsetY = clientY - event.clientY; + clientX = event.clientX; + clientY = event.clientY; + popoverTip.style.top = (popoverTip.offsetTop - offsetY).toString() + 'px'; + popoverTip.style.left = (popoverTip.offsetLeft - offsetX).toString() + 'px'; + }; + + document.onmouseup = function(event) { + if (event.button != 0) { + return; + } + pageNode.classList.remove('grabbing-area-grabbed'); + document.onmousemove = null; + document.onmouseup = null; + }; + }; + + const pageNode = document.createElement('h6'); + headerGrabbingArea.appendChild(pageNode); + + const pageNum = document.createElement('span'); + const pageCount = document.createElement('span'); + pageNode.appendChild(document.createTextNode('Träff ')); + pageNode.appendChild(pageNum); + pageNode.appendChild(document.createTextNode(' av ')); + pageNode.appendChild(pageCount); + + const featureOverlayStyle = new Style({ + stroke: new Stroke({ + color: 'rgba(0, 255, 255, .8)', + width: 3, + }), + }); + const updateFeatureOverlayLayer = function(layer_group, layer, id) { + const lyr = mapLayers[layer_group]; + if (lyr == null) { + return; + } + const urls = lyr.getSource().getUrls(); + const source = featureOverlayLayer.getSource(); + if (source.getUrls().length < 1 || source.getUrls()[0] !== urls[0]) { + featureOverlayLayer.setVisible(false); + source.setUrls(urls); + } + featureOverlayLayer.setStyle(function(feature) { + if (feature.getId() === id && feature.getProperties().layer === layer) { + return featureOverlayStyle; + } else { + return undefined; + } + }); + featureOverlayLayer.setVisible(true); + featureOverlayLayer.changed(); + }; + const refreshPopover = function() { + const attr = overlayAttributes[overlayAttrIdx]; + updateFeatureOverlayLayer(attr.layer_group, attr.layer, attr.ogc_fid); + + pageNum.innerHTML = (overlayAttrIdx + 1).toString(); + const content = formatFeaturePropertiesToHTML(attr); + popover.tip.getElementsByClassName('popover-body')[0].replaceChildren(content); + }; + const onClickPageChange = function(event, offset) { + const btn = event.target; + if (btn.classList.contains('disabled') || popover?.tip == null) { + return; + } + if (overlayAttrIdx + offset < 0 || overlayAttrIdx + offset > overlayAttributes.length - 1) { + return; + } + + overlayAttrIdx += offset; + if (overlayAttrIdx < 1) { + btnPrev.classList.add('disabled'); + } else { + btnPrev.classList.remove('disabled'); + } + if (overlayAttrIdx < overlayAttributes.length - 1) { + btnNext.classList.remove('disabled'); + } else { + btnNext.classList.add('disabled'); + } + + refreshPopover(); + setTimeout(function() { btn.blur() }, 100); + }; + + const btnPrev = document.createElement('button'); + btnPrev.classList.add('popover-button', 'popover-button-prev'); + btnPrev.setAttribute('type', 'button'); + btnPrev.title = 'Föregående träff'; + btnPrev.setAttribute('aria-label', btnPrev.title); + btnPrev.onclick = function(event) { + return onClickPageChange(event, -1); + }; + + const btnNext = document.createElement('button'); + btnNext.classList.add('popover-button', 'popover-button-next'); + btnNext.setAttribute('type', 'button'); + btnNext.title = 'Nästa träff'; + btnNext.setAttribute('aria-label', btnNext.title); + btnNext.onclick = function(event) { + return onClickPageChange(event, +1); + }; + + const btnExpand = document.createElement('button'); + btnExpand.classList.add('popover-button', 'popover-button-expand'); + btnExpand.setAttribute('type', 'button'); + const btnExpandTitle = 'Förstora'; + const btnExpandTitle2 = 'Förminska'; + btnExpand.setAttribute('aria-label', btnExpand.title); + btnExpand.onclick = function() { + if (popover?.tip == null) { + return; + } + if (!popover.tip.classList.contains('popover-maximized')) { + popover.tip.classList.add('popover-maximized'); + btnExpand.classList.replace('popover-button-expand', 'popover-button-reduce'); + btnExpand.title = btnExpandTitle2; + btnExpand.setAttribute('aria-label', btnExpand.title); + } else { + popover.tip.classList.remove('popover-maximized'); + btnExpand.classList.replace('popover-button-reduce', 'popover-button-expand'); + btnExpand.title = btnExpandTitle; + btnExpand.setAttribute('aria-label', btnExpand.title); + } + setTimeout(function() { btnExpand.blur() }, 100); + }; + + const btnClose = document.createElement('button'); + btnClose.classList.add('popover-button', 'popover-button-close'); + btnClose.setAttribute('type', 'button'); + btnClose.title = 'Stäng'; + btnClose.setAttribute('aria-label', btnClose.title); + btnClose.onclick = function() { + featureOverlayLayer.setVisible(false); + featureOverlayLayer.changed(); + popover?.dispose(); + }; + + header.appendChild(btnPrev); + header.appendChild(btnNext); + header.appendChild(btnExpand); + header.appendChild(btnClose); + + const formatFeaturePropertiesToHTML = function(properties) { + /* turn the properties into a fine table */ + const table = document.createElement('table'); + table.classList.add('table', 'table-sm', 'table-borderless', 'table-hover'); + + const tbody = document.createElement('tbody'); + table.appendChild(tbody); + + const def = layers[properties.layer_group + '.' + properties.layer]; + def.popover.forEach(function([desc, key, opts]) { + let v = properties[key]; + if (opts === undefined) { + opts = {}; + } + if (opts.fn !== undefined) { + if (opts.fn === 'length') { + if (v < 1000) { + opts.unit = 'm'; + } else { + v /= 1000; + v = Math.round(v*100) / 100; + opts.unit = 'km'; + } + } else if (opts.fn === 'area') { + if (v < 10000) { + opts.unit = 'm²'; + } else if (v < 10000 * 10000) { + v /= 10000; + opts.unit = 'ha'; + } else { + v /= 1000000; + opts.unit = 'km²'; + } + v = Math.round(v*100) / 100; + } else { + v = opts.fn(v); + } + } + if (v == null) { + v = document.createTextNode(''); + } else if (!(v instanceof HTMLElement)) { + if (typeof(v) === 'number' && opts.unit !== undefined) { + v = v.toLocaleString('sv-SE'); + } else if (typeof(v) === 'boolean') { + v = v ? 'Ja' : 'Nej'; + } + if (opts.unit !== undefined && v !== '') { + v += '\u202F' + opts.unit; + } + v = document.createTextNode(v); + } + + const tr = document.createElement('tr'); + tbody.appendChild(tr); + + const td1 = document.createElement('td'); + tr.appendChild(td1); + const textDesc = document.createTextNode(desc); + td1.appendChild(textDesc); + + const td2 = document.createElement('td'); + tr.appendChild(td2); + td2.appendChild(v); + if (opts.classes !== undefined) { + opts.classes.forEach((c) => td2.classList.add(c)); + } + }); + + const content = document.createElement('div'); + if (def.popoverTitle !== undefined) { + const h = document.createElement('h6'); + content.appendChild(h); + const textNode = document.createTextNode(def.popoverTitle); + h.appendChild(textNode); + } + + content.appendChild(table); + return content; + }; + + const container0 = map.getViewport().getElementsByClassName('ol-overlaycontainer-stopevent')[0]; + map.on('singleclick', function(event) { + /* clear the overlay list */ + featureOverlayLayer.setVisible(false); + featureOverlayLayer.changed(); + overlayAttributes = []; + overlayAttrIdx = 0; + + /* dispose any pre-existing popover if not in detached mode */ + popover = Popover.getInstance(popup); + if (popover !== null) { + const popoverTip = popover.tip; + if (popoverTip !== null && !popoverTip.classList.contains('popover-detached')) { + popover.dispose(); + } + } + + const size = map.getSize(); + if (size[0] < 576 || size[1] < 576) { + return; + } + + /* unclear how many feature we'll find, don't render prev/next buttons for now */ + pageNode.classList.add('d-none'); + btnPrev.classList.add('d-none', 'disabled'); + btnNext.classList.add('d-none', 'disabled'); + + /* never start in maximized mode */ + if (popover?.tip != null) { + popover.tip.classList.remove('popover-maximized'); + } + btnExpand.classList.replace('popover-button-reduce', 'popover-button-expand'); + btnExpand.title = btnExpandTitle; + btnExpand.setAttribute('aria-label', btnExpand.title); + + const fetch_body = [] + map.forEachFeatureAtPixel(event.pixel, function(feature, layer) { + const layerGroup = layer.get('layerGroup'); + const layerName = feature.getProperties().layer; + const def = layers[layerGroup + '.' + layerName]; + if (def?.popover != null) { + /* skip layers which didn't opt-in for popover */ + if (!fetch_body.length) { + document.body.classList.add('inprogress'); + if (popover?.tip != null) { + popover.tip.classList.add('inprogress'); + } + } + fetch_body.push({ + layer_group: layerGroup, + layer: layerName, + fid: feature.getId() ?? -1, + }); + if (fetch_body.length >= 100) { + return true; /* enough matches already, stop detection here */ + } + } + }, { + hitTolerance: 5, + checkWrapped: false, + layerFilter: (l) => l.get('layerGroup') != null, + }); + + if (fetch_body.length === 0) { + /* dispose pre-detached popover */ + popover?.dispose(); + return; + } + + fetch('/q', { + method: 'POST', + body: JSON.stringify(fetch_body), + headers: { + 'Content-Type': 'application/json; charset=UTF-8' + } + }) + .then(function(resp) { + if (resp.status === 200) { + return resp.json(); + } else { + throw new Error(`${resp.url} [${resp.status}]`); + } + }) + .then(function(data) { + /* the data is received from the CGI in the order it was sent */ + /* TODO optimizations on the CGI would break the above assumption, so the + * decoded JSON response would need to be reordered to match fetch_body */ + overlayAttributes = data + if (overlayAttributes.length === 0) { + /* dispose pre-detached popover */ + popover?.dispose(); + return; + } + + pageCount.innerHTML = overlayAttributes.length.toString(); + if (overlayAttributes.length >= 2) { + /* render prev/pre buttons */ + btnNext.classList.remove('d-none', 'disabled'); + btnPrev.classList.remove('d-none'); + pageNode.classList.remove('d-none'); + } + if (popover?.tip == null) { + /* create a new popover (we're not already showing one in detached mode) */ + pageNum.innerHTML = (overlayAttrIdx + 1).toString(); + popupOverlay.setPosition(event.coordinate); + + const attr = overlayAttributes[0]; + updateFeatureOverlayLayer(attr.layer_group, attr.layer, attr.ogc_fid); + popover = new Popover(popup, { + template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div>' + + '<div class="popover-header"></div><div class="popover-body"></div></div>', + title: header, + content: formatFeaturePropertiesToHTML(attr), + html: true, + placement: 'right', + fallbackPlacements: ['right', 'left', 'bottom', 'top'], + container: container0, + }); + popover.show(); + } + else if (popover.tip.classList.contains('popover-detached')) { + /* update existing detached mode popover */ + refreshPopover(); + popover.tip.classList.remove('inprogress'); + } + }) + .catch(function(e) { + console.log(e); + }) + .finally(function() { + document.body.classList.remove('inprogress'); + }); + }); +}; |