Vinnaren i pepparkakshustävlingen!
2012-11-09, 14:40
  #1
Medlem
Pancake&Sausages avatar
Hej!

Jag har fått ett litet roligt problem på halsen (Som så vanligt alltid dyker upp när man egentligen försöker lösa andra problem), men det är intressant ändå.

Problemet är att jag ska koppla en bild föreställande Sveriges demografi till data rörande väderleksförhållande mm. sedan en tid tillbaka. Bilden i fråga: http://upload.wikimedia.org/wikipedi...is2007.svg.png

Problemet är att SMHI's mätstationer är angivna i lat-long och den givna bilden är det inte. Rakt norrut på den bilden är ex. lite snett upp åt höger. Men inte bara det, om man jämför de uppenbara landformationerna (Ölands sydspets, treriksröset m.fl) så är det inte enbart en rent linjär transformation utan verkar vara något mer. Det jag vill göra är att transformera om bilden från den givna till en ny där latitud och longitud stämmer överens med ex. pixelkoordinaterna i bilden.

Jag har plockat ut 33 punkter som det med säkerhet går att säga transformeras från en punkt i bilden till en given latlot-koordinat. Hur gör jag nu med alla andra punkter (De som ligger mellan "säkra" punkter)?
Citera
2012-11-10, 20:50
  #2
Medlem
Pancake&Sausages avatar
Har (delvis) löst det hela genom att använda två metoder:

Den första kom fram genom att anta att x-koordinaten i det "transformerade" planet är en linjär funktion av både x- och y-koordinaten i ursprungsplanet där både x- och y-koordinaten finns "ensamma" men även där de ingår i en mängd olika funktioner, vad fan som, jag vet inte hur den ursprungliga transformen såg ut så jag fyllde bara på så gott det gick (polynom, logaritmer och fan och hans moster). Därefter gjordes en flervariabelsregression av x' ("Nya" x-koordinaten) som en funktion av allt det nämnt ovan. Detsamma gjordes med den nya y-koordinaten. Resultatet blev rätt hyfsat. Såhär hade ett rutnät transformerats i det aktuella området:

Innan Efter

Tänkte därefter att det gick att först göra en vanlig skalnings- och rotationstransform varpå punkterna "nästan" ligger rakt ovanpå varandra: http://i.imgur.com/yb8WH.png

Därefter skulle varje punkt "dras" mot den punkt den skall ligga ovanpå, och i samband med denna dragning så drar den med sig alla sina "grannarpunkter" åt samma håll. Den mängd som varje punkt följer efter viktas sedan i form av exp(-(Avstånd/K).^2). Denna valdes lite godtyckligt för att den såg snyggast ut vid test med ett vanligt rutmönster. 'K' är bara en konstant som ska se till att "dragningen" blir tillräckligt stor, och att när en punkt väl dras så ska den se till att dra med sig så många av sina grannar som möjligt. 'K' valdes därför att bli så stor som möjligt.

Det hela skedde iterativt genom att den punkt som låg längst från sin "transform-punkt" var den som drogs först. Informationen om positionen för den punkt som dras samt dess vektor kunde sedan sparas för varje iteration och upprepas med ett vanligt rutmönster istället.

Resultatet sett i ett rutmönster: Innan Efter

Denna iteration tog tid och kunde inte göras för varje punkt så ett nytt rutmönster om 100*100 rutor byggdes upp och alla punkter däremellan blev helt enkelt en interpolation av de givna punkterna från rutmönstret.

Den slutliga bildtransformationen skedde i MatLab och tog en dryg minut att genomföra.

Kartan för befolkningstäthet: Före Efter

Nu motsvarar alltså samma mängd pixlar i höjd eller bredd samma gradtal i lat-long oavsett var dessa pixlar tas ut i bilden. Det verkar stämma hyfsat bra också!

Edit: Detta är givetvis bra mycket jävla krångligare än det behövde göras (Särskilt sett till att det sannolikt inte hade behövts någon datahämtning på detta sätt alls) men jag är så jävulskt stolt över mig själv just nu så det finns inte.
__________________
Senast redigerad av Pancake&Sausage 2012-11-10 kl. 20:54.
Citera
2012-11-10, 21:30
  #3
Medlem
Om man jagar runt lite i informationen tillhörande kartan på Wikipedia, ser man att den är baserad på kartan beskriven här, där det står att kartan är projicerad i RT 90 2.5 gon V, dvs en Gauss-Krüger-projektion med medelmeridianen belägen 2,5 gon väster om gamla observatoriet i Stockholm. Men detta betyder alltså att koordinater i kartan borde kunna fås genom en simpel rotation av koordinater i RT 90. Så det enklaste borde vara att ta dina koordinater för SMHI-stationerna, ta reda på vilket koordinatsystem dessa är givna i, konvertera dem till RT 90, och sen försöka anpassa dessa till kartan genom en rotation. Formlerna för transformationerna borde vara enkla att Googla fram.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback