OpenStreetMap

Öppna Data: Import av Lantmäteriets Terrängkartan och Trafikverkets NVDB

Posted by ChristianA on 13 February 2018 in Swedish (Svenska)

På senare tid har jag importerat en del data från Trafikverket och Lantmäteriet, eftersom båda har släppt en del data som CC0, vilket gör det möjligt att använda i OSM. Jag tänkte dela med mig av några av de erfarenheter jag har fått detta.

Trafikverket

NVDB

NVDB= Nationella VägDataBasen är Trafikverkets databas över vägnätet i Sverige. Det finns många olika fält och Trafikverket släpper inte all information fri vad jag vet. Men det som finns är ganska omfattande. Jag har endast importerat geometrin och översatt ett par attribut så att vägarna ska bli hyfsat taggade i OSM.

Först laddade jag ner alla län och sedan valde jag ut ett par intressanta filer, som jag slog ihop för hela landet. Sedan rensade jag bort (för mig) ointressanta attribut från shapefilen med QGIS. Jag har använt Vägtyp och funktionell vägklass för att gissa vilken "highway"-tagg som ska användas. Hastigheten går att använda rakt av. Dessutom har jag försökt gissa beläggning efter Vägtyp och funktionell vägklass. För de vägar i tätorter där gatunamn finns har jag importerat dessa. Allt detta har gjorts i QGIS med hjälp av Fältkalkyltorn och ett par rediga CASE-satser. Fördelen med att mappa om attributen redan i shapefilen är att när man sedan importerar denna i JOSM kan behöver man bara kopiera vägarna mellan shapefilens lager och det aktuella OSM-lagret, taggarna finns ju redan på plats, vilket sparar tid. Eftersom JOSM inte kan hantera shapefiler så bra har jag ett litet script som klipper ut det område jag är intresserad av ur filen med hela Sveriges vägnät.

Lantmäteriet

Lantmäteriet har släppt Terrängkartan i vektorform fri. Detta är ju roligt, men inte så roligt som jag hoppades på. Det är nämligen så att informationen är förenklad för att passa en viss skala och för att kartan ska renderas snyggt. Det innebär i praktiken att objekt i Terrängkartan inte alltid ligger på rätt plats jämfört med verkligheten. Detta gör det lite knepigare att importera direkt utan att korrigera positionen för varje enskilt objekt, vilket ju tar en del tid.

Vägar från Trafikverket och Lantmäteriet Var är vägen? Det skiljer upp emot 10 meter mellan NVDB och Terrängkartan.

För Terrängkartan gjorde jag ett script i Bash som (med hjälp av ogr2ogr) delar upp lager i underlager och byter taggar för att passa med OSM. Dock visade det sig att detta inte alltid var så bra, eftersom man ofta får lappa ihop saker manuellt i JOSM när man tex tar vattendrag och våtmarker från separata lager.

Djävulska multipolygoner

Skog och åkermark har jag tyckt varit svårt att importera från Terrängkartan. Anledningen är att Lantmäteriet har dessa lager som riktigt maffiga multipolygoner, som är lite för stora för att vara praktiskt hanterbara i JOSM. För mig går det fortare att bara rita av dessa områden från satellitbilder. (Se även om aktualitet nedan). Någon mer kompentent karterare kanske fixar det bättre än jag dock. Skog-lagren innehåller dock info om skogtyp (barr eller löv) vilket ju vore trevlig att kunna importera.

Tidens tand (Aktualitet)

Ett annat problem med Terrängkartan är att datat inte alltid är uppdaterat. Detta gäller nog främst på landet, men det hjälper ju inte mig som främst karterar landsbygd. På bilderna nedan visas en bild på lagret "öppen mark" ovanpå Ortofoto från 1975. Uppe till höger i bilden kan man se ett område med öppen mark som inte finns kvar på nyare bilder, som den från Google nedanför. I båda fallen kan man även se att objekten i Terrängkartan ligger något förskjutna mot verkligheten så som nämnts ovan.

Gammalt ortofoto Gammalt ortofoto med "Öppen mark".

Nyare satelitbild. Bakgrund från Google Nyare satellitbild med "Öppen mark". Notera området uppe till höger som ej längre verkar vara öppen mark.

Möjligheter

Finns det då inget man kan använda Terrängkartan till? Jodå, det finns en del användbart. Jag har tex använt vattenlinjer, traktorväg (resten av vägarna tar jag från NVDB), kraftledningar, eljjuspår, gruvor, fornlämningar mm. Så undersök gärna datat och se vad du kan få användning av!

Guldgruvan

En riktig guldgruva för den som karterar på landsbygden är för övrigt Ekonomiska Kartan (vars upphovsrätt har gått ut). Den har namn på sjöar, gårdar, byar, torp, skogar, berg och massa annat. Visst har en hel del ändrats sedan kartan gjordes, men namnen är ofta fortfarande aktuella. Dessutom kan man använda kartan för att hitta saker som inte riktigt finns kvar, tex banvallar från nedlagda järnvägar.

Location: Bergmossen, Björsäter, Åtvidabergs kommun, Landskapet Östergötland, Östergötlands län, Götaland, Sverige

Comment from emj on 18 February 2018 at 22:58

Trevligt har du bash skripten och anteckningar om hur man får fram gruvor osv någonstans?

Comment from ChristianA on 19 February 2018 at 15:49

#!/bin/bash

reg="05"
#Hela OG:
xmin=470000
xmax=630000
ymin=6395000
ymax=6545000

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"
mapper["Underfart för övrig väg eller led"]="highway=path;tunnel=yes"
mapper["Vandringsled"]="highway=path;marked_trail=yes"
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

Comment from ChristianA on 19 February 2018 at 15:50

MEN: endast större gruvor mm är med. Se även mina kommentarer om att datat kan ligga "lite snett".

Comment from emj on 20 February 2018 at 21:52

Tack så mycket, du är en gud, hashmaps i bash!

Nu känns det som om jag är skyldig dig att försöka få till något från detta

Comment from DrJoshua on 8 August 2018 at 08:06

Jag skulle vilja komplettera OSM med mindre traktor- och skogsvägar från NVDB. Jag har lagt in shapefilen med funktionell vägklass i JOSM. Hur tar man smidigast nästa steg? Om jag börjar kopiera mellan lagren (NVDB och OSM) så måste det väl bli en hel del redigerande för att få rätt topologi att vägar ansluter till varandra? Kom med tips!

Comment from ChristianA on 8 August 2018 at 12:40

Hej. Plockar man in en shapefil direkt så måste man ju dels ändra attribut-tabellen så att taggarna stämmer för OSM. Det är det som mitt script (eller hack kanske) försöker åstadkomma.

Det andra problemet är precis som du säger att man får pilla en hel del för att koppla ihop vägarna man tar från NVDB med vägar som redan finns i OSM. Ifall flera vägar sitter ihop kan man med fördel kopiera dom samtidigt från shapefilen till OSM, för då hänger i alla fall dessa vägar ihop. Men sen måste man ju fortfarande få ihop dom med befintliga...

Ibland, när vägarna i OSM stämmer dåligt med verkligheten/NVDB, tar jag bort den som finns i OSM (men sparar taggningen) och tar in från NVDB istället. Det finns även en funktion i JOSM för att ta geometrin från ett objekt och överföra till ett annat. Det var dock lite bökigt att använda sist jag provade (ett bra tag sedan).

Mindre traktorvägar finns det inte så mycket av i NVDB; Lantmäteriet har mer sådana, men var uppmärksam på att shapefilerna är gjorda för kartan; dvs en del objekt ligger medvetet snett för att saker inte ska hamna ovanpå varandra...

Login to leave a comment