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: Karlsnäs, Å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?

Hide this comment

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
Hide this comment

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".

Hide this comment

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

Hide this comment

Leave a comment

Parsed with Markdown

  • Headings

    # Heading
    ## Subheading

  • Unordered list

    * First item
    * Second item

  • Ordered list

    1. First item
    2. Second item

  • Link

    [Text](URL)
  • Image

    ![Alt text](URL)

Login to leave a comment