Sweden/Datakällor/Erfarenheter

From OpenStreetMap Wiki
Jump to navigation Jump to search

Script och förslag på vad som kan importeras från Lantmäteriet, Trafikverket, Naturvårdsverket mm

Detta är ett försök att samla lite mina (ChristianA) erfarenheter av import av data från ovanstående källor. Från början var detta ett inlägg i min OSM-dagbok, men jag blev ombedd att skapa denna sida för att sammanfatta. Detta är alltså mina egna erfarenheter och ska inte tas som en allmängiltig sanning. Dessutom kan uppdaterad data göra mina slutsatser inaktuella. Värt att notera är också att jag främst importerat data för rurala områden. I urbana områden kanske man får gå tillväga på annat sätt. Syftet med mina importer är främst att förbättra täckningen på landsbygden i de områden jag brukar kartera och att importera saker som är svåra/tidsödande att få in manuellt eller genom att rita av satellitbilder.

OBS! Importera försiktigt! Jag importerar endast mindre områden via JOSM och får manuellt gå igenom objekt vid eventuella krockar. Man bör verifiera importen genom jämförelse med satellitbilder eller, ännu hellre, på-marken-kontroll.

Allmänna tips:

  1. Importera för begränsade områden. Jag använder "fieldpapers" för att skapa ett rutnät över ett område där jag sedan hanterar en ruta i taget för varje typ av objekt jag vill importera.
  2. Importera en sak i taget för ditt valda områda. Tex "Berg i dagen" från Terrängkartan. Då blir det lätt överskådligt vad det uppladdade ändringssettet innebär och det är lättare att backa tillbaka ändringen ifall något problem skulle uppstå.
  3. Var beredd på manuellt arbete. Även det slugaste importscriptet i världen kommer att ha svårt att jämka ihop redan existerande data med det som ska importeras.
  4. Var medveten om begränsningarna i datat som importeras.
  5. Ha koll på licensen på datat som importeras.

Förslag på arbetsgång för ett område:

  1. Kör script för att preparera NVDB-data för området. Ladda resulterande fil i JOSM.
  2. Använd NVDB för att korrigera positionen hos satellitbilder (de som finns i JOSM, som tex Bing). Observera att korrektionen kan behöva göras för olika zoomnivåer samt kan behöva justeras på flera platser. Riktigt små vägar kan ibland ha lite mindre pålitlig geometri i NVDB, så använd helst större vägar/korsningar för korrektionen.
  3. Importera NVDB för vägar som saknas.
  4. Korrigera vid behov befintliga vägars geometri mot NVDBs. JOSM har en funktion för att kopiera geometrin från ett objekt till ett annat.
  5. Kör script för att preparera data från LM Terrängkartan
  6. Importera utvalda lager från LM Terrängkartan
  7. Lägg namn på platser från Terrängkartan och Ekonomiska Kartan
  8. Importera eventuella naturreservat, skyddade områden samt vandringsleder i naturreservat från Naturvårdsverket

Preparera TRV NVDB

NVDB är Nationella VägDataBasen, dvs en databas över Sveriges vägnät. Det finns massa information att använda sig av och scriptet nedan kan troligen förbättras för att få ut mer information till OSM. Orginalfilerna kan laddas ner från Trafikverkets FTP-tjänst.

Med hjälp av QGIS slogs lagren ShapeNVDB_DKFunkVagklass, ShapeNVDB_DKHastighetsgrans, ShapeNVDB_DKVagnummer och ShapeVIS_DKSlitlager ihop, för hela landet.

Sedan användes följande villkor för att utifrån funktionell vägklass och vägtyp gissa vilket OSM-klass det borde vara (via QGIS Field Calculator), dvs taggen "highway"=

WHEN "TYP" = 1	AND "KLASS" = 0	THEN 'motorway'
WHEN "TYP" = 1	AND "KLASS" = 1	THEN 'trunk'
WHEN "TYP" = 1	AND "KLASS" = 2	THEN 'primary'
WHEN "TYP" = 1	AND "KLASS" = 3	THEN 'secondary'
WHEN "TYP" = 1	AND "KLASS" = 4	THEN 'secondary'
WHEN "TYP" = 1	AND "KLASS" = 5	THEN 'tertiary'
WHEN "TYP" = 1	AND "KLASS" = 6	THEN 'tertiary'
WHEN "TYP" = 1	AND "KLASS" = 7	THEN 'residential'
WHEN "TYP" = 1	AND "KLASS" = 8	THEN 'unclassified'
WHEN "TYP" = 1	AND "KLASS" = 9	THEN 'track'
WHEN "TYP" = 2	AND "KLASS" = 0	THEN 'trunk'
WHEN "TYP" = 2	AND "KLASS" = 1	THEN 'trunk'
WHEN "TYP" = 2	AND "KLASS" = 2	THEN 'primary'
WHEN "TYP" = 2	AND "KLASS" = 3	THEN 'secondary'
WHEN "TYP" = 2	AND "KLASS" = 4	THEN 'tertiary'
WHEN "TYP" = 3	AND "KLASS" = 0	THEN 'primary'
WHEN "TYP" = 3	AND "KLASS" = 1	THEN 'primary'
WHEN "TYP" = 3	AND "KLASS" = 2	THEN 'primary'
WHEN "TYP" = 3	AND "KLASS" = 3	THEN 'secondary'
WHEN "TYP" = 3	AND "KLASS" = 4	THEN 'secondary'
WHEN "TYP" = 3	AND "KLASS" = 5	THEN 'tertiary'
WHEN "TYP" = 3	AND "KLASS" = 6	THEN 'tertiary'
WHEN "TYP" = 3	AND "KLASS" = 7	THEN 'unclassified'
WHEN "TYP" = 3	AND "KLASS" = 8	THEN 'unclassified'
WHEN "TYP" = 3	AND "KLASS" = 9	THEN 'unclassified'
WHEN "TYP" = 4	AND "KLASS" = 3	THEN 'secondary'
WHEN "TYP" = 4	AND "KLASS" = 4	THEN 'secondary'
WHEN "TYP" = 4	AND "KLASS" = 5	THEN 'tertiary'
WHEN "TYP" = 4	AND "KLASS" = 5	THEN 'tertiary'
WHEN "TYP" = 4	AND "KLASS" = 7	THEN 'residential'
WHEN "TYP" = 4	AND "KLASS" = 8	THEN 'unclassified'
WHEN "TYP" = 4	AND "KLASS" = 9	THEN 'unclassified'
WHEN "TYP" = 5	AND "KLASS" = 0	THEN 'primary'
WHEN "TYP" = 5	AND "KLASS" = 1	THEN 'motorway_link'
WHEN "TYP" = 5	AND "KLASS" = 3	THEN 'secondary'
WHEN "TYP" = 5	AND "KLASS" = 4	THEN 'secondary'
WHEN "TYP" = 5	AND "KLASS" = 5	THEN 'unclassified'
WHEN "TYP" = 5	AND "KLASS" = 7	THEN 'residential'
WHEN "TYP" = 5	AND "KLASS" = 8	THEN 'unclassified'
WHEN "TYP" = 5	AND "KLASS" = 9	THEN 'unclassified'
WHEN "TYP" = 6	AND "KLASS" = 0	THEN 'motorway'
WHEN "TYP" = 6	AND "KLASS" = 1	THEN 'trunk'
WHEN "TYP" = 6	AND "KLASS" = 2	THEN 'trunk'
WHEN "TYP" = 6	AND "KLASS" = 3	THEN 'secondary'
WHEN "TYP" = 6	AND "KLASS" = 4	THEN 'tertiary'
WHEN "TYP" = 6	AND "KLASS" = 5	THEN 'tertiary'
WHEN "TYP" = 6	AND "KLASS" = 6	THEN 'tertiary'
WHEN "TYP" = 6	AND "KLASS" = 7	THEN 'unclassified'
WHEN "TYP" = 6	AND "KLASS" = 8	THEN 'unclassified'
WHEN "TYP" = 6	AND "KLASS" = 9	THEN 'unclassified'
WHEN "TYP" is NULL	AND "KLASS" = 0	THEN 'motorway'
WHEN "TYP" is NULL	AND "KLASS" = 1	THEN 'trunk'
WHEN "TYP" is NULL	AND "KLASS" = 2	THEN 'primary'
WHEN "TYP" is NULL	AND "KLASS" = 3	THEN 'secondary'
WHEN "TYP" is NULL	AND "KLASS" = 4	THEN 'secondary'
WHEN "TYP" is NULL	AND "KLASS" = 5	THEN 'tertiary'
WHEN "TYP" is NULL	AND "KLASS" = 6	THEN 'tertiary'
WHEN "TYP" is NULL	AND "KLASS" = 7	THEN 'residential'
WHEN "TYP" is NULL	AND "KLASS" = 8	THEN 'unclassified'
WHEN "TYP" is NULL	AND "KLASS" = 9	THEN 'track'


På liknande sätt för att gissa beläggning, dvs taggen "surface"=

WHEN "TYP" = 1	AND "KLASS" = 0	THEN 'asphalt'
WHEN "TYP" = 1	AND "KLASS" = 1	THEN 'asphalt'
WHEN "TYP" = 1	AND "KLASS" = 2	THEN 'asphalt'
WHEN "TYP" = 1	AND "KLASS" = 3	THEN 'asphalt'
WHEN "TYP" = 1	AND "KLASS" = 4	THEN 'asphalt'
WHEN "TYP" = 1	AND "KLASS" = 5	THEN 'asphalt'
WHEN "TYP" = 1	AND "KLASS" = 6	THEN 'asphalt'
WHEN "TYP" = 1	AND "KLASS" = 7	THEN 'asphalt'
WHEN "TYP" = 2	AND "KLASS" = 0	THEN 'asphalt'
WHEN "TYP" = 2	AND "KLASS" = 1	THEN 'asphalt'
WHEN "TYP" = 2	AND "KLASS" = 2	THEN 'asphalt'
WHEN "TYP" = 2	AND "KLASS" = 3	THEN 'asphalt'
WHEN "TYP" = 2	AND "KLASS" = 4	THEN 'asphalt'
WHEN "TYP" = 3	AND "KLASS" = 0	THEN 'asphalt'
WHEN "TYP" = 3	AND "KLASS" = 1	THEN 'asphalt'
WHEN "TYP" = 3	AND "KLASS" = 2	THEN 'asphalt'
WHEN "TYP" = 3	AND "KLASS" = 3	THEN 'asphalt'
WHEN "TYP" = 3	AND "KLASS" = 4	THEN 'asphalt'
WHEN "TYP" = 4	AND "KLASS" = 3	THEN 'asphalt'
WHEN "TYP" = 4	AND "KLASS" = 4	THEN 'asphalt'
WHEN "TYP" = 4	AND "KLASS" = 5	THEN 'asphalt'
WHEN "TYP" = 4	AND "KLASS" = 5	THEN 'asphalt'
WHEN "TYP" = 4	AND "KLASS" = 7	THEN 'asphalt'
WHEN "TYP" = 5	AND "KLASS" = 0	THEN 'asphalt'
WHEN "TYP" = 5	AND "KLASS" = 1	THEN 'asphalt'
WHEN "TYP" = 5	AND "KLASS" = 3	THEN 'asphalt'
WHEN "TYP" = 5	AND "KLASS" = 4	THEN 'asphalt'
WHEN "TYP" = 6	AND "KLASS" = 0	THEN 'asphalt'
WHEN "TYP" = 6	AND "KLASS" = 1	THEN 'asphalt'
WHEN "TYP" = 6	AND "KLASS" = 2	THEN 'asphalt'
WHEN "TYP" = 6	AND "KLASS" = 3	THEN 'asphalt'
WHEN "TYP" is NULL	AND "KLASS" = 0	THEN 'asphalt'
WHEN "TYP" is NULL	AND "KLASS" = 1	THEN 'asphalt'
WHEN "TYP" is NULL	AND "KLASS" = 2	THEN 'asphalt'
WHEN "TYP" is NULL	AND "KLASS" = 3	THEN 'asphalt'
WHEN "TYP" is NULL	AND "KLASS" = 4	THEN 'asphalt'
WHEN "TYP" is NULL	AND "KLASS" = 5	THEN 'asphalt'
WHEN "TYP" is NULL	AND "KLASS" = 6	THEN 'asphalt'



Script för att preparera LM Terrängkartan

Orginalfilerna kan laddas ner från Lantmäteriets Öppna data. Notera att Terrängkartans data är anpassad för visning, dvs objekten kan ha justerats vad gäller geometrin/placering för att kartan ska se tjusig ut. Detta innebär att absoluta positioner kan skilja en del från verkligheten.

  • scriptet:
#!/bin/bash

reg="05"

# Kolmården
ymin=6500478
xmin=565907
ymax=6523250
xmax=596396

in_atr_name="KATEGORI"

# Lista på lager att bearbeta, dvs splitta upp
declare -A layers
# polygonlager
layers["ma"]="Åker;Fruktodling;"
layers["mb"]="Fritidsbebyggelse;Hög bebyggelse;Industriområde;Låg bebyggelse;Sluten bebyggelse"
layers["mo"]="Annan öppen mark;Skog, barr- och blandskog;Lövskog;Annan öppen mark utan skogskontur;"
layers["ms"]="Berg i dagen;Sankmark, normal;Sankmark, svårframkomlig;Sankmark, torvtäkt"
layers["mv"]="Vattenyta med diffus strandlinje;Vattenyta"

# linjelager
layers["fl"]="Fornlämningsavgränsning;Gruvhål, större"
layers["hl"]="Vattendrag under mark;Vattendrag, kartografisk klass 1;Vattendrag, kartografisk klass 2;Vattendrag, kartografisk klass 3;Vattentub och vattenränna"
layers["kl"]="Kraftledning, region;Kraftledning, stam;Transformatorstationsområde"
layers["vl"]="Allmän väg klass 1;Allmän väg klass 1, i underfart;Allmän väg klass 2;Allmän väg klass 2, i underfart;Allmän väg klass 3;Allmän väg klass 3, i underfart;Bilväg;Bilväg, i underfart;Bättre bilväg;Bättre bilväg, i underfart;Färjeled;Gata;Gata i sluten bebyggelse;Gata, i underfart;Gata, större;Gata, större, i underfart;Genomfartsgata, -led, i underfart;Genomfartsgata,-led;Motorväg;Motorväg i underfart;På- och avfartsväg klass 1;På- och avfartsväg klass 1, i underfart;På- och avfartsväg klass 2;På- och avfartsväg klass 2, i underfart;På- och avfartsväg klass 3;På- och avfartsväg klass 3, i underfart;Sämre bilväg;Sämre bilväg, i underfart;Uppfartsväg;Uppfartsväg, i underfart"
layers["vo"]="Cykelväg, parkväg;Elljusspår;Gångbro och spång;Gångstig;Linbana;Traktorväg;Underfart för övrig väg eller led;Vandringsled;Vandringsled, längs väg"


# beskrivning av OSM taggar för varje LM kategori ovan
declare -A mapper
mapper["Fruktodling"]="landuse=orchard"
mapper["Åker"]="landuse=farmland"
mapper["Fritidsbebyggelse"]="landuse=residential"
mapper["Hög bebyggelse"]="landuse=residential"
mapper["Industriområde"]="landuse=industrial"
mapper["Låg bebyggelse"]="landuse=residential"
mapper["Sluten bebyggelse"]="landuse=residential"
mapper["Annan öppen mark"]="landuse=meadow"
mapper["Annan öppen mark utan skogskontur"]="meadow"
mapper["Lövskog"]="landuse=forest;leaf_type=broadleaved"
mapper["Skog, barr- och blandskog"]="landuse=forest"
mapper["Berg i dagen"]="natural=bare_rock"
mapper["Sankmark, normal"]="natural=wetland"
mapper["Sankmark, svårframkomlig"]="natural=wetland"
mapper["Sankmark, torvtäkt"]="natural=wetland"
mapper["Vattenyta"]="natural=water"
mapper["Vattenyta med diffus strandlinje"]="natural=wetland"
mapper["Fornlämningsavgränsning"]="historic=yes"
mapper["Gruvhål, större"]="landuse=quarry"
mapper["Vattendrag under mark"]="waterway=stream;tunnel=culvert"
mapper["Vattendrag, kartografisk klass 1"]="waterway=stream"
mapper["Vattendrag, kartografisk klass 2"]="waterway=stream"
mapper["Vattendrag, kartografisk klass 3"]="waterway=river"
mapper["Vattentub och vattenränna"]="waterway=drain"
mapper["Kraftledning, region"]="power=line"
mapper["Kraftledning, stam"]="power=line"
mapper["Transformatorstationsområde"]="power=substation"
mapper["Allmän väg klass 1"]="highway=primary"
mapper["Allmän väg klass 1, i underfart"]="higgway=primary;tunnel=yes"
mapper["Allmän väg klass 2"]="highway=secondary"
mapper["Allmän väg klass 2, i underfart"]="highway=secondary;tunnel=yes"
mapper["Allmän väg klass 3"]="highway=tertiary"
mapper["Allmän väg klass 3, i underfart"]="highway=tertiary;tunnel=yes"
mapper["Bilväg"]="highway=unclassified"
mapper["Bilväg, i underfart"]="highway=unclassified;tunnel=yes"
mapper["Bättre bilväg"]="highway=unclassified"
mapper["Bättre bilväg, i underfart"]="highway=unclassified;tunnel=yes"
mapper["Färjeled"]="waterway=ferry"
mapper["Gata"]="highway=residental"
mapper["Gata i sluten bebyggelse"]="highway=residential"
mapper["Gata, i underfart"]="highway=residential;tunnel=yes"
mapper["Gata, större"]="highway=tertiary;tertiary=major_street"
mapper["Gata, större, i underfart"]="highway=tertiary;tertiary=major_street;tunnel=yes"
mapper["Genomfartsgata,-led"]="highway=tertiary;tertiary=through_street"
mapper["Genomfartsgata, -led, i underfart"]="highway=tertiary;tertiary=through_street;tunnel=yes"
mapper["Motorväg"]="higwhway=motorway"
mapper["Motorväg i underfart"]="highway=motorway;tunnel=yes"
mapper["På- och avfartsväg klass 1"]="highway=primary_link"
mapper["På- och avfartsväg klass 1, i underfart"]="highway=primary_link;tunnel=yes"
mapper["På- och avfartsväg klass 2"]="highway=secondary_link"
mapper["På- och avfartsväg klass 2, i underfart"]="highway=secondary_link;tunnel=yes"
mapper["På- och avfartsväg klass 3"]="highway=tertiary_link"
mapper["På- och avfartsväg klass 3, i underfart"]="highway=tertiary_link;tunnel=yes"
mapper["Sämre bilväg"]="highway=track"
mapper["Sämre bilväg, i underfart"]="highway=track;tunnel=yes"
mapper["Uppfartsväg"]="highway=service"
mapper["Uppfartsväg, i underfart"]="highway=service;tunnel=yes"

mapper["Cykelväg, parkväg"]="highway=cycleway"
mapper["Elljusspår"]="highway=path,lit=yes,piste=cross_country"
mapper["Gångbro och spång"]="highway=path,bridge=yes"
mapper["Gångstig"]="highway=path"
mapper["Linbana"]="aerialway=gondola"
mapper["Traktorväg"]="highway=track;tracktype=grade5;note=Needs_surveying"
mapper["Underfart för övrig väg eller led"]="highway=path;tunnel=yes"
mapper["Vandringsled"]="highway=path;marked_trail=yes;note=Needs_surveying"
mapper["Vandringsled, längs väg"]="highway=path;marked_trail=yes"

for layer in "${!layers[@]}"; do

    echo $layer
    #echo "\'${layers[$layer]}\'"
    IFS=';' read -r -a array <<< "${layers[$layer]}"
    for thingy in "${array[@]} "; do
        # remove trailing space in last item of array (why?)
        thingy=$(echo $thingy | sed 's/[ \t]*$//')
        laynam=$(echo $thingy | sed 's/ /_/g' | sed 's/-//g' | sed 's/,//g')""
        fnam="${laynam}.shp"
        # split shapefile into each component
        ogr2ogr -spat $xmin $ymin $xmax $ymax -update -append -where "KATEGORI=$(echo \'${thingy}\')" $fnam ../${layer}_${reg}.shp

        # add all fieldnames/values to each file
        IFS=';' read -r -a attrs <<< "${mapper[$thingy]}"
        echo $attrs
        for attr in "${attrs[@]}"; do
            attrnam=$(echo $attr | awk -F'=' '{print $1}')
            attrval=$(echo $attr | awk -F'=' '{print $2}')
            echo "ATTRNAM: $attrnam, ATTRVAL: $attrval"
            # add OSM fields/attrs
            ogrinfo $fnam -sql "ALTER TABLE $laynam ADD COLUMN ${attrnam} character(40)"
            ogrinfo $fnam -sql "UPDATE $laynam SET ${attrnam}='${attrval}'" $laynam -dialect sqlite

        done
        # remove LM fields/attrs
        ogrinfo $fnam -sql "ALTER TABLE $laynam DROP COLUMN KATEGORI"
        ogrinfo $fnam -sql "ALTER TABLE $laynam DROP COLUMN KKOD"
        # add attribution
        ogrinfo $fnam -sql "ALTER TABLE $laynam ADD COLUMN source character(20)"
        ogrinfo $fnam -sql "UPDATE $laynam SET source='Lantmäteriet'" $laynam -dialect sqlite
   done

done

# mosa ihop alla hl lager
IFS=';' read -r -a array <<< "${layers["hl"]}"
for thingy in "${array[@]} "; do
    echo $thingy
    thingy=$(echo $thingy | sed 's/[ \t]*$//')
    laynam=$(echo $thingy | sed 's/ /_/g' | sed 's/-//g' | sed 's/,//g')""
    fnam="${laynam}.shp"
    ogr2ogr -update -append -addfields vattendrag.shp $fnam
done

# mosa ihop alla våtmark lager
declare -A dummy
dummy["ms"]="Sankmark, normal;Sankmark, svårframkomlig;Sankmark, torvtäkt"

IFS=';' read -r -a array <<< "${dummy["ms"]}"
for thingy in "${array[@]} "; do
    echo $thingy
    thingy=$(echo $thingy | sed 's/[ \t]*$//')
    laynam=$(echo $thingy | sed 's/ /_/g' | sed 's/-//g' | sed 's/,//g')""
    fnam="${laynam}.shp"
    ogr2ogr -update -append -addfields våtmark.shp $fnam
done



Vad som ej bör importeras:

  • Vägar. Dessa är bättre att ta från NVDB (ovan)
  • Skog. Detta pga att det blir väldigt stora multipolygoner och dessutom måste man justera geometrin manuellt. Med andra ord är det oftast snabbare att rita av satellitbilder manuellt. Möjligen undantag för lövskog, eftersom det är svårt att avgöra skogstyp från satellitbilder.
  • Åkermark/öppen mark, av samma orsak som för skogar. Ofta är polygonerna inte lika stora som för skogar, men man måste ändå justera mycket manuellt.
  • Vattenytor. Samma sak som för ovan gäller ofta här med. Ifall sjöar helt saknas kan man dock importera dom från Terrängkartan, men geometrierna kan behöva justeras efteråt.

Vad som kan importeras:

  • Traktorvägar. Dessa finns oftast inte med i NVDB (även om visst överlapp kan förekomma), så dessa kan tas från Terrängkartan.
  • Berg i dagen
  • Våtmarker. Dock har jag haft svårt att från informationen i Terrängkartan klura ut mer detaljer om våtmarken.
  • Vattendrag. Ofta är det dock enklare att rita av dessa från den renderade Terrängkartan, Ekonomiska kartan (kan vara inaktuell) samt satellitbilder.
  • Stigar/vandringsleder
  • Kraftledning. Kan vara enklare att rita av från satellitbilder beroende på upplösning/kvalitet.
  • Fornlämning

Hur gör man rent praktiskt?

Scripten ovan är bash-script, så man behöver kunna köra dessa. Alternativt kan man köra alla kommandon manuellt. Scripten behöver även ogr2ogr. I JOSM kan man, med pluginet Opendata, öppna resulterande shapefiler. Varje fil blir då ett separat lager. Då är det enkelt att från lagret för, tex, berg i dagen, kopiera objekt och sedan klistra in dem på rätt plats (Ctrl-Alt-V) i OSM-lagret.