Ny versjon av Artskart, som per idag (april 2026) ligger på artskart.artsdatabanken.no (videre omtalt som Artskart 2). Første innsats i Artskart 3 har som mål å erstatte Artskart 2, så snart det er mulig. Videre er det ambisjoner om å utvide Artskart med mer funksjonalitet enn det som finnes i Artskart 2.
Noen viktige mål
- Få bukt med ytelsesproblemer
- Ny og foredret backend som er mer modulær og oversiktlig
- Få en er moderne frontend
- Få en portal som er i henhold til Artsdatabankens designsystem og visuelle identitet
-
Node.js 24 LTS (minst 24.15.0, som Angular 22 krever) for Angular frontend
-
Angular CLI 22.1
-
Visual Studio 2026 er nødvendig for .NET 10
-
Docker Desktop — kreves for å kjøre integrasjonstester (Testcontainers starter en SQL Server-container automatisk)
-
installasjon av lokale nbic-map-komponent Pakken er tilgjengelig på npm: https://www.npmjs.com/package/@artsdatabanken/nbic-map-component Install the package from
artskart3.webapp:npm install @artsdatabanken/nbic-map-component
Connecting to GitHub with SSH og spesifikt seksjonen Generate new SSH Key.
- Kjør
gh repo clone Artsdatabanken/Artskart3eller bruk Github Desktop for å laste ned repositoriet
- Åpne Artskart 3 i terminalen og kjør
cd .\Artskart3.WebApp\; npm ifor å installere pakkene i frontend - Kjør kommandoen
ng servefra Artskart3/Artskart3.Webapp/ i terminalen for å starte frontend
- Åpne løsningsfilen
Artskart3.slnxi Visual Studio/Rider og kjør prosjektet med profilenArtskart3.Api - API-et starter på
https://localhost:5088 - Swagger UI er tilgjengelig på
https://localhost:5088/swagger - Helsesjekk for databasetilkobling og andre avhengigheter:
https://localhost:5088/hc
NB: Første gang du kjører API-et på HTTPS må du sette opp trust mot det lokale utviklersertifikatet:
dotnet dev-certs https --trust
Du vil trenge en sql server database for å kjøre apiet. En .bacpac fil ligger på Teams (Artskart->General->Shared->NyeArtskart->DatabaseDumps->Artskart2Index-2026-3-12-14-27.bacpak) hvis du ønsker å starte med en database med data. Ønsker du å starte med en tom database, se Databasemigrasjoner lenger ned.
VS: Høyreklikk prosjektet og velg "Manage User Secrets" Rider: Høyreklikk prosjektet og velg Tools->.Net user Secrets
Filen skal se noe slik ut, endre connectionstring ved behov.
{
"ConnectionStrings:ArtskartIndex": "data source=localhost;initial catalog=Artskart3Index;Integrated Security=true;MultipleActiveResultSets=True;App=EntityFramework;TrustServerCertificate=True",
"ClientSafeList": "127.0.0.1;::1"
}
cd Artskart3.Api
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:ArtskartIndex" "data source=localhost;initial catalog=Artskart3Index;Integrated Security=true;MultipleActiveResultSets=True;App=EntityFramework;TrustServerCertificate=True"
dotnet user-secrets set "ClientSafeList" "127.0.0.1;::1"Valgfritt — legg til Application Insights ConnectionString hvis du skal teste det lokalt
Prosjektet bruker EF Core code-first migrasjoner. Alle migrasjoner kjøres fra Artskart3.Infrastructure-mappen.
Forutsetninger — installer EF Core-verktøyet globalt én gang:
dotnet tool install --global dotnet-efLegge til en ny migrasjon etter å ha endret en domeneklasse:
cd Artskart3.Infrastructure
dotnet ef migrations add <NavnPåMigrasjon> --startup-project ..\Artskart3.ApiKjøre migrasjoner mot lokal database:
cd Artskart3.Infrastructure
dotnet ef database update --context ArtskartDbContext --startup-project ..\Artskart3.ApiAngre siste migrasjon (kun hvis den ikke er kjørt mot databasen ennå):
cd Artskart3.Infrastructure
dotnet ef migrations remove --startup-project ..\Artskart3.ApiMigrasjonsfilene ligger i
Artskart3.Infrastructure/Migrations/. Ikke rediger disse manuelt etter at de er kjørt mot en delt database.
Prosjektet bruker coverage.runsettings for å ekskludere generert kode (EF Core-migrasjoner, OpenAPI-generatorer, kompilatorgenererte typer) fra dekningsanalysen.
Kjør alle tester og samle dekningsdata:
dotnet test --settings coverage.runsettings --collect "XPlat Code Coverage"Kjør kun enhetstester:
dotnet test Artskart3.Tests.Unit --settings coverage.runsettings --collect "XPlat Code Coverage"Kjør kun integrasjonstester:
Forutsetning: Docker Desktop må kjøre. Testcontainers starter og stopper en SQL Server-container automatisk for hver testkjøring. Se
Artskart3.Tests.Integration/README.mdfor detaljer.
dotnet test Artskart3.Tests.Integration --settings coverage.runsettings --collect "XPlat Code Coverage"Dekningsrapporten lagres som en coverage.cobertura.xml-fil under TestResults/-mappen i hvert testprosjekt.
Installer rapportverktøyet én gang globalt:
dotnet tool install --global dotnet-reportgenerator-globaltoolGenerer HTML-rapport fra alle innsamlede filer:
reportgenerator -reports:"**/TestResults/**/coverage.cobertura.xml" -targetdir:"TestResults/CoverageReport" -reporttypes:HtmlÅpne rapporten i nettleseren:
Start-Process "TestResults/CoverageReport/index.html"Standariserer navngiving av branches er feature/navn-på-branch som for eksempel: feature/authentication for features og bugfix/fix-ip-blocking hvis det er en bugfix.
For å gjøre endringer i Artskart krever det at det lages en pull request som må godkjennes av en annen utvikler.
Driftsmeldinger og andre varsler som vises i portalen styres via en JSON-fil som redigeres manuelt av en superbruker. Se Artskart3.Infrastructure/Data/JsonDb/README.md for feltbeskrivelse og fremgangsmåte for å legge til nye varsler.
Et funn i kartets funnliste åpner et detaljpanel. Listen beholdes i DOM-en med gruppering, åpne grener og rulleposisjon. Forrige/neste følger treets rekkefølge, også gjennom lukkede grener, og går rundt ved første/siste funn. Detaljene kan utvides med knappen i smal visning. Tilbake-knappen vises bare i fullskjerm og går tilbake til smal detaljvisning; lukk viser listen igjen fra begge visninger. Det valgte funnet markeres i hovedkartet uten panorering eller endring av zoom, også ved forrige/neste og direkte lenker.
Lenker på formen /?observationId=123 åpner et enkelt funn. Hvert skifte av
funn legger til en oppføring i nettleserhistorikken. En lenke uten gjeldende
listekontekst viser ett funn uten forrige/neste; filtre og listeutvalg lagres
ikke i URL-en. Endrede filtre eller et nytt kartutvalg avslutter den gamle
detaljøkten.
API:
GET /api/observations/{id}returnerer offentlige opplysninger og bildemetadata, aldri bildeblob eller base64. Vanlig BFF-headerX-CSRF: 1kreves som for andre JSON-endepunkter.GET /api/observations/{id}/media/{mediaId}/imageleverer lagret bilde ved behov. Nettleseren prøver førstMediaFile.Origin, deretter blob-endepunktet én gang. Kun støttede rasterbildetyper vises; tomme bildegallerier skjules.GET /api/observations/{id}/maps/localog/maps/overviewreturnerer henholdsvis 800x800 og 500x800 PNG. Begge bildeendepunktene er offentlige, skrivebeskyttede og unntatt BFF-headerkravet slik at de virker i<img>. Slettede funn/bilder eller bilder som tilhører et annet funn, utleveres ikke.
Kartene genereres med SkiaSharp fra faste HTTPS WMS-kilder hos Kartverket
(Norges grunnkart, terrengmodell og GEBCO) og Norsk Polarinstitutt (Svalbard).
Kildelenker vises under kartene og i bildeviseren. Ingen vilkårlige WMS-adresser,
lag, bildestørrelser eller koordinater kan angis av API-klienten.
Offentlige koordinater brukes gjennomgående; SensitiveObservationData
brukes ikke. Lokalkartet er omtrent 82 km bredt, og oversiktskartet utvides
ved behov for å inkludere funnet.
Rendereren har fire samtidige jobber, en egen 64 MiB minnebuffer med 15 minutters
levetid, 25 sekunders samlet tidsgrense og maksimalt 12 MiB per WMS-svar.
Kartendepunktet tillater fire samtidige forespørsler og 16 i kø; over dette
returneres 429. Feil fra kartkilder gir 502/504 og kan prøves på nytt i panelet.
Bilder støtter ETag og fem minutters HTTP-mellomlagring. Deployment må inkludere
SkiaSharps native Linux-bibliotek (pakken SkiaSharp.NativeAssets.Linux.NoDependencies);
en bygging på macOS alene verifiserer ikke Linux-runtime.
Vurderingslenker velges fra aktive TaxonProperty-rader for riktig kategori og
område, med siste årstall i prefikset. Tvetydige/udaterte lenker utelates og
logges. For eldre importerte taxa brukes den eksisterende offentlige takson-ID-en
når ExternalTaxonId ikke er fylt ut. Dataleverandørlenke utelates inntil modellen
har en pålitelig URL-kilde.
Per juli 2026 er alle miljøene kun tilgjengelig dersom man er tilkoblet Artsdatabankens nettverk direkte eller via VPN.
- Testing i teamet: artskart3.test.artsdatabanken.no (20.251.135.164)
- Testing før release til produksjon: artskart3-staging.test.artsdatabanken.no (20.251.135.164)
- Produksjon/Beta: artskart3.artsdatabanken.no (51.120.48.232)
- Opprett en PR som slår sammen develop-branchen inn i staging-branchen
- Når en reviewer har godkjent PR-en, velg merge. Staging-branchen blir oppdatert og lukkes.
- Opprett en PR som slår sammen staging-branchen inn i main-branchen
- Når en reviewer har godkjent PR-en, velg merge. Main-branchen blir oppdatert og lukkes.
- Flytt issues fra "Accepted" til "Done" i projsktet-boardet. FERDIG.
| Dato | Beskrivelse |
|---|---|
| Apr 2026 | Lagt til komposittindekser på søkefilterkolonner i Observation-tabellen (LocationId, TaxonGroupId, CategoryId, YearCollected, MonthCollected m.m.) |
| Jun 2026 | Lagt til dekkende indeks på Area(AreaTypeId, Fid, IsCurrent), LocationAreas(AreaId, LocationId) og OrganizationRelation(OrganizationId, ObservationId) for raskere joins |
| Jun 2026 | Erstattet to separate indekser på ObservationEntityIndex med en dekkende komposittindeks (EntityTypeId, EntityId, ObservationId), pluss indeks på Observation.DateTimeCollected og Area(ZoomLevel, IsCurrent) |
| Dato | Beskrivelse |
|---|---|
| Jun 2026 | Opprettet ObservationEntityIndex-tabell som flat projeksjon av observasjon-til-omrade-relasjoner — eliminerer dyre multi-tabell-joins for filtrering pa kommune, fylke, verneomrade, havomrade og institusjon |
| Jun 2026 | Byttet fra AreaFid (string) til EntityId (int) i indekstabellen for raskere heltallssammenlikning |
| Dato | Beskrivelse |
|---|---|
| Mai 2026 | Erstattet Include-basert eager loading med .Select()-projeksjon slik at databasen kun returnerer kolonner som faktisk brukes i DTO-en |
| Jun 2026 | Omskrev kommune-/fylkesfiltre fra korrelerte subsporreringer (Location.Areas.Any()) til to-stegs oppslag via ObservationEntityIndex |
| Aug 2026 | Slo sammen to databasesporreringer til en for lokasjonsendepunktet — GROUP BY med JOIN i stedet for aggregering + separat koordinatoppslag |
| Aug 2026 | Flyttet envelope-filter fra Observation.East/North (ingen indeks) til Location.East/North (bruker IX_EastNorth) |
| Dato | Beskrivelse |
|---|---|
| Aug 2026 | Fjernet duplisert CRS per feature i GeoJSON (~5.5 MB spart ved 100k features) |
| Aug 2026 | Erstattet GeoJSON med kompakt array-format [id, lon, lat, count] (~7x reduksjon) |
| Aug 2026 | Fjernet Locality fra bulk-lokasjonsdata |
| Aug 2026 | Forenklet LocationModel fra 15+ felt til 4, fjernet ubrukte felt fra DB-projeksjon |
| Dato | Beskrivelse |
|---|---|
| Aug 2026 | Strommer JSON direkte til HttpResponse.Body via Utf8JsonWriter i stedet for a mellomlagre som streng |
| Aug 2026 | Fjernet unodvendig IAsyncEnumerable-wrapping rundt ferdig materialisert liste |
| Dato | Beskrivelse |
|---|---|
| Jun 2026 | Erstattet Angular pipe (AreaNamePipe) per rad i listevisning med forhandsberegnet Map-oppslag via computed signal — unngår lineart sok per rad per change detection |
| Aug 2026 | Forenklet lokasjonsparsing fra fire metoder (regex-basert GeoJSON-parsing) til en enkel array-parser |
| Dato | Beskrivelse |
|---|---|
| Jun 2026 | Lagt til SlowQueryLog-tabell og action filter som logger sporreringer over konfigurerbar terskel — muliggjor identifisering av trege endepunkter |