User:Dalkvist/ekonomiska kartan

From OpenStreetMap Wiki
Jump to navigation Jump to search

Update 2016-04

Detta är ursprungligen från 2009, tyvärr finns inte något av mina saker kvar. Det går dok fortfarande bra att ladda hem kartorna från lantmäteriet. Dok fungerar det inte att använda deras koordinattransformationstjänst längre. Jag är inte aktiv längre men det kan finns andra som lekt med EK på den svenska e-postlistan (Talk-se).

Ekonomiska kartan till osm

Jag har den senaste veckan webscrapat alla kartbladen i ekonomiska kartan serien, drygt 11000 ark och knappa 20GB. Funderar nu på hur man kan använda dem, har skrivit kod som gör om djvuer till geo tiffs som sedan kan delas upp i tiles för användning i potlach och kan via wms laddas i josm.

Den lagliga biten är inte trivial när det gäller att använda kartorna, kartbladen (och hela kartserien) fortfarande är skyddad av lantmäteriets upphovsrätt, vilket gör det svårt att använda dem som underlag i potlach som britterna gör med några av sina gamla kartor.

Men eftersom det inte går att upphovsrättsskydda information så berörs den geografiska informationen i kartorna inte av upphovsrätten. Informationen skyddas av det svenska katalogskyddet och av EU:s database protection act, som båda har en betydligt kortare skyddstid, 15 år. Därmed så är (bör) det vara fritt fram att vi hämtar information från ekonomiska kartan, vars kartblad är från ca 1950 till ca 1980.

Lika bra att inflika standarddisclaimern här, jag är inte utbildad advokat, men jag har noga läst de lagar som berör upphovsrätt och kartor/geografisk information. Jag har också bollat mina slutsatser med upphovsrättsprofessorer som håller med om mitt resonemang, dock finns det ingen praxis när det gäller geografisk information. Det närmaste är en dom om katalogskyddet från 1970-talet.

"Upphovsrätten avser kartan som ett beskrivande verk, dvs. sättet som informationen är presentat i den bilden. Det skyddet varar i 70 år efter upphovsmannens dödsår. Geografiska fakta som de är sammanställda kan vara föremål för katalogskydd och är då skyddade mot utdrag/kopiering av väsentliga delar under 15 år. Ändras/kompletteras sammanställningen (väsentligt) åtnjuter den nya ändrade sammanställningen skydd under en ny 15-årsperiod."

- Marianne Levin, Professor i civilrätt (immaterialrätt), Juridiska institutionen, Stockholms universitet

En lösning på distributionsproblematiken kan vara att göra något liknade som gjordes med gaza-wms:en, att man har en "hemlig" adress som bara de som frågar efter den får. På så sätt så delar man bara med sig av upphovsskyddat material till sina "vänner", något som (än så länge) är tillåtet.

Arbetsflöde (förslag på program)

Ekonomiska kartan in josm
Ekonomiska kartan in josm
  1. ladda ner djvu fil (htmlunit)
  2. export djvu -> tiff (ddjvu)
  3. transformera hörn punkterna från rt90(rt38) till sweref lat lon
  4. lägga till hörnen som referenspunkter (gdal_translate)
  5. omvandla till geotiff (gdalwarp)
  6. skapa tiles (kartrutor?) från geotifen för användning i potlach (maptiler)
  7. dela ut geotifen via wms för användning i josm (geoserver)
  8. ...
  9. ...
  10. profit!?

Hämta kartbladen från lantmäteriet

Manuellt

Lättast är att söka via kartan[1] ofta måste man gå ner till zoom nivå 1 för att få söka.

Om man kan bladindelningen [2] (sidan 9) utantill så är det smidigare att använda den mer avancerade sökningen[3]

Välj "rikets allmänna kartverks arkiv" och "ekonomiska kartan" samt det län och kommun man är intresserad av.

Webscraping

Tyvärr så kräver sökningen javascript för att fungera så man är tvungen att använda någonting lite mer avancerat än wget. Java biblioteket htmlunit[4] fungerar bra för mig.

Kartbladen är indelade i 3 filer: ett index, en fil med hela kartbladet, och en fil med bara själva kartan. De finns på följande adress, där ID är det interna numret som lantmäteriet använder i sin historiska databas.

https://etjanster.lantmateriet.se/historiskakartor/s/document/rak2_{ID}.index.djvu (måste hämtas först) https://etjanster.lantmateriet.se/historiskakartor/s/document/rak2_{ID}_1_1.djvu https://etjanster.lantmateriet.se/historiskakartor/s/document/rak2_{ID}_1_2.djvu (nästan alltid den med bara kartan)


Export

Manuelt

Öppna (index)filen antingen direkt i webbläsaren med pluginet eller med skrivbordsprogrammet och välj exportera som/export as och välj tiff formatet.

För att få kartbladet i något annat än .bmp så behöver man använda DjVuLibre [5] se nedan.

Scripts

DDJVU från DjVuLibre har bra scriptingstöd,

ddjvu -format=tiff -page=2 från.djvu karta.tiff

Koordinater

Hörnen på varje kartblad är lättast att hitta koordinaterna för, eftersom det nedre vänstra(sydvästa) hörnet har sin koordinat angiven i rt38 i kilometer. Så för att få fram de andra hörnen så lägger man till 5km på x för de övre hörnen och 5km på y för de högra hörnen. För de matematiskt handikappade så kan man alltid titta på kartbladen runtom ;)

Dessa fyra punkter omvandlar man sedan till wgs84 ("gps koordinater") via lantmäteriets tjänst [6] (fungerar inte längre) höjden spelar ingen(liten) roll så länge som den är samma för alla punkterna för ett kartblad.

Scripting

Koordinaterna för hörnen kan ganska enkelt räknas ut med hjälp av kartbladsnummret, som består av två komponenter, båda bestående av ett nummer och en bokstav, ett för storrutan och ett för själva kartbladet.

Varje storruta består av 100 blad [0-9 X a-j], både storrutornas och bladens x axel är numeriskt ökande norrut och bådas y axel är alfabetiskt ökande österut.

x = (storrutaX * 50000) + 6100000 + (5000 * bladX)

y = ((storrutaYs position i alfabetet - 1) * 50000) + 1200000 + (5000 * (bladYs position i alfabetet -1))

Transformation

Manuellt

Todo qgis, arcmap ect...

scripting

Defacto standard biblioteket för geografiska bild manipulationer är gdal[7] för att lägga in referens punkter i bilden används gdal_translate.

gdal_translate -of GTiff -co TILED=YES -a_srs '+init=epsg:4326'
	      -outsize 5000 5000 karta.tif karta-gcp.tif 
	      -gcp 0 0       longitud-nordvästra-hörnet  latitud-nordvästra-hörnet
	      -gcp 5000 0    longitud-nordöstra-hörnet latitud-nordöstra-hörnet
	      -gcp 0 5000    longitud-sydvästra-hörnet   latitud-sydvästra-hörnet
	      -gcp 5000 5000 longitud-sydöstra-hörnet  latitud-sydöstra-hörnet

Se dok upp med att några kartblad inte är 5000 x 5000. Har inte hittat något bra sätt att automatiskt hantera detta än.

omvandling

Göra om kartan till wgs84

gdalwarp -co COMPRESS=JPEG -co JPEG_QUALITY=45 -rcs karta-gcp.tiff karta-geo.tiff


geotif till map tile

Här finns det lite olika vägar att gå ett är bara göra om varje kartblad till tiles var och en för sig. Se maptiler[8] eller

gdal2tiles.py -z 14-15 -w openlayers /path/to/geotif/kartblad /path/to/contain/tiles/

Alternativt så sammanfogar man ett antal kartblad (tex alla i en storruta) och gör om alla till tiles på en gång. Antingen fysiskt sammanfoga med gdal_merge eller virtuellt med gdalbuildvrt,

gdal_merge.py -n 0 -o ut-fil.tif -co COMPRESS=JPEG -co JPEG_QUALITY=45 in-filer

respektive

gdalbuildvrt ut-fil.vrt in-filer

Tyvärr så fungerar transparens inte riktigt som det ska i gdalbuildvrt, så man måste editera filen som skapas. Man måste byta ut alla förekomster av "<SimpleSource>" till "<ComplexSource>" och alla förekomster av "</SimpleSource>" till "<NODATA>0</NODATA></ComplexSource>"

Och till sist skapa map tiles

gdal2tiles.py -z 14-15 -w openlayers ut-fil.(tif/vrt) /path/to/contain/tiles/

fel tiles

Tyvärr så kan man inte bara använda tiles som de är, efter som de är döpta efter en lite annan standard.

På maptiler.org finns det en sida om detta[9], där kan man ladda ner ett python skript som bla kan svara på vad en specifik TMS tile har för google värde.

Nedan är en variant av ett skript som jag kör efter att ha kört gdal2tiles, globalmaptiles-tms-to-google.py är en lätt modifierad variant av globalmaptiles.py som bara returnerar y koordinaten (dvs filnamnet) i googles standard (den osm också använder).

#!/bin/sh                                                                                                                                                    
for zoom in `ls $1`
do                                                                                                                                      
    if [ -d $1$zoom ]; then                                                                                                                                       
        for x in `ls $1$zoom`
        do                                                                                                                                       
            for y in `ls $1$zoom/$x`
            do                                                
                newY=`python globalmaptiles-tms-to-google.py $zoom $x $y`
                `mv $1$zoom/$x/$y $1$zoom/$x/$newY.png`
            done
        done
    fi
done

Potlatch (tiles)

Ekonomiska kartan in potlatch
Ekonomiska kartan in potlatch

För att potlatch ska kunna läsa filerna så behöver de vara tillgängliga via en webbserver, den egna datorn funkar dok bra (dvs localhost).

För att sedan se bilderna så går man in på inställningar och skriver i adressen till sina bilder i custom rutan. Tex http://localhost/osm/tiles/13h/!/!/!.png där de tre ! är zoom, x, och y respektive.

Det går också att länka direkt till de egna bilderna

http://www.openstreetmap.org/edit?&tileurl=URL

JOMS (WMS eller tiles)

Josm kan presis som potlatch läsa in tiles, med hjälp av Frederik Ramms slipymap plugin JOSM/Plugins/SlippyMap


Josm kan också använda wms:er lättast att köra en sådan är nog geoserver[10] där man bara lägger till sin geotiff som en ny CoverageStore, som sedan kan laddas i josm med wms pluginet.

openstreetmap.se serverar EK via cachad proxy mot den primära datakällan och brukar i de flesta fallen vara snabbare.

tms:http://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.png

Todo exempel.

JOSM/PicLayer

Ett alternativ till tiles är att göra en world file, och öppna bilden med JOSMs plugin PicLayer, se User:Twse/ektowld.