Etikettarkiv | 3D

QGIS och 3D

QGIS är inte på något sätt känt för att kunna visualisera data i 3D på ett påtagligt bra sätt.

Men är det då helt kört om man ändå vill använda QGIS? Nej det är inte, och alternativen är inte helt usla, även om det finns en del kvar att önska. Läs mer…

3D Realtidskartering

Det har formligen exploderat på marknaden med mjukvaror för att fotogrammetriskt göra om stillbilder till 3D modeller och orthofoton för tillämpningar i såväl liten som stor skala.

I dessa fall så väntar vi bara på kommersiella lösningar som inte kostar flera månadslöner. Det finns billigare, men då är de i de flesta fall begränsade och saknar, för mig, viktiga funktioner. Tills vidare så får jag nöja mig med Visual SFM, som är gratis och löser uppgifterna tillräckligt bra. Det de kommersiella programmen är bättre på är framför allt arbetsflöde och automatisering.

Denna artikel handlar dock inte om mjukvaror för efterbearbetning, utan om kartering i realtid! Läs mer…

OpenLayers med 3D

Igår testade jag Boundless OpenGeo Suite 4.5 med deras Webapp-SDK och byggde en helt standardiserad webbtjänst med OpenLayers 3.

Idag tänkte jag följa Andreas Hocevars instruktioner för att anpassa denna tjänst så att det även går att växla till 3D, vilket är ett nytt tillägg i OpenGeo Suite, tack vare tillägget CesiumJS.

I filen ”src/app/app.js” redigerar jag och lägger till följande:

Screenshot from 2014-12-30 17:06:13Raderna infogas vid rad 129 före map.on(‘singleclick’)-funktionen. Sist i filen lägger jag även till följande:

$('#toggle-globe').click(function() {
  ol3d.setEnabled(!ol3d.getEnabled());
});

Detta för att det skall gå att växla mellan 2D och 3D, när man väljer i menyn. På tal om menyn, så måste även ”index.html” i apptest-roten redigeras och en rad för detta menyalternativ läggas till:

<li><a href="#" data-toggle="collapse" data-target=".navbar-collapse.in" id="toggle-globe"><i class="fa fa-globe"></i>&nbsp;&nbsp;Toggle globe view</a></li>

Det är efter rad 58 som ovanstående skall läggas till, vilket ger två ”<li>” rader totalt, den redan befintliga inräknad.

Nu skulle det då fungera att testa, men se det gör det inte…

Han har nämligen glömt något i instruktionen. Det måste finnas med hänvisningar till Cesium skripten…

Screenshot from 2014-12-30 18:21:32I ”index.html” så skall man före ”</head>” taggen lägga till de två raderna med hänvisning till ”ol3-cesium”, annars kommer det aldrig att fungera.

När jag ändå höll på lite så ändrade jag på en rubrik och några menyalternativ, vilket var barnsligt enkelt.

Screenshot from 2014-12-30 18:33:15När man väl börjar bryta lite i javascript-koden så är det inte särskilt krångligt och med mallarna i OpenGeo Suite Webapp-SDK, eller enbart med OpenLayers3 och CesiumJS för den delen, så är det inte så hemskt svårt att få till en 3D visning av geodata på en glob så här.

Är det felfritt och utan problem? Nej det är det inte, i alla fall inte direkt från ett exempel. Man måste skruva och anpassa koden lite mera och det är nog speciellt viktigt med en bra Tile-server för att det skall uppdatera rimligt snabbt. Med de länkar som används i exemplet så går det lite väl långsamt. Men bara det att det går att skapa en webbkarta där det är enkelt att växla mellan 2D och 3D, utan att det för den skull skall krävas en massa plug-in i webbläsaren är mycket värdefullt.

Du hittar mitt halvskakiga exempel på http://geosupportsystem.altervista.org/ol3cesium/ men du får klicka bort ”overlays” om du vill att kartan skall uppdateras i 3D (fungerar ändå inte utan min lokala geoserver).

Kartor för blinda…

… men mest för mitt eget nörderi.

Har ni sett inlägget om kartor för blinda på GIS-Lounge (http://www.gislounge.com/3d-maps-blind/)?

Då jag numera är stolt ägare till en 3D-skrivare så tänkte jag testa detta (GIS-nörd + 3D-skrivare = kartor i 3D).

Först och främst, det finns säkert massor med sätt att göra detta på och jag har bara provat ett par stycken, så här redovisar jag det som fungerade bäst av dessa. Vald metod fungerar även med andra GIS program så även ESRI-användare kan vara med på instruktionerna här.

Höjddata är ofta rasterbilder medan 3D-skrivare behöver styrkoder i ett speciellt format. Styrkoder beräknas i program som är anpassade till aktuell skrivare, lite som drivrutiner för vanliga skrivare. Filformatet som de flesta sådana styrkodsprogram vill läsa in är STL, vilket är ett format för att hantera 3D-modeller. Detta format är dock inget som finns att exportera till från QGIS, varför gör det inte det förresten? Kanske ett uppseglande behov av QGIS insticksprogram som en engagerad pythonprogrammerare där ute kan ta tag i.

Jag började först med att klippa raster i QGIS och exportera som xyz-fil för att döpa om till ”asc” och importera i MeshLab. Detta gick bra, men jag kan MeshLab lite för dåligt för att gå vidare därifrån med den typ av data som skapades. Om det är någon som lyckas så får ni gärna höra av er med en instruktion hur man får ut användbara stl-filer av dessa xyz/asc filer. Det fungerar dock utmärkt att visualisera höjddata i 3D på detta vis, så det kan vara intressant att titta på MeshLab för detta ändamål.

Efter lite efterforskningar så hittade jag däremot ett litet javaprogram som underlättade ganska mycket för mig. Metoden blev därför mycket enklare och helt oberoende av vilken GIS-mjukvara som används.

Screenshot from 2014-10-18 13:18:12Jag började med att läsa in ett lager med höjddata och gå till det område jag var intresserad av. Det skall vara höjddata som är symboliserat i svart till vitt där vitt är högsta punkten. I bilden ovan har jag använt data från Danmark över Helsingör med Kronborgs slott till höger.

Screenshot from 2014-10-18 12:31:43Det är skapligt viktigt att använda sig av rätt stil i egenskaperna för lagret för att få så hög ”upplösning” som möjligt i modellen. I QGIS så väljer jag Min/Max och ändrar ”Full” till ”Nuvarande” och ”Uppskattad” till ”Verklig”, klickar på ”Läs in” och därefter ”OK”. Detta ger svart i det synliga områdets lägsta punkt och vitt i det synliga områdets högsta.

För att gå vidare behövs det bara en bild i gråskala så från QGIS exporterar jag den synliga delen av kartan med menyalternativet ”Spara som bild…”. I mina försök har jag valt png-format på bilden och det fungerar bra.

Screenshot from 2014-10-18 13:19:52Nästa steg blev att köra javaprogrammet som går att hämta hem från SourceForge (http://sourceforge.net/projects/heightmap2stl/). Kommandot som gör om bilden till stl-format ges i ett terminalfönster. Det enklaste är att ha bild och jar-fil på samma sökväg och navigera dit i terminalen (hur du gör beror på om du kör Windows/Mac/Linux).

Jar-filen måste vara ”körbar” och du måste ha Java installerat:

java -jar heightmap2stl.jar bild.png 20 2

Kommandot ovan består av ett java-anrop och tre parametrar. Den första anger vilken bildfil som skall användas. Den andra hur hög modellen skall vara som högst. Den tredje hur hög den minst skall vara.

Här får man experimentera lite för att uppnå den effekt man önskar och det går exempelvis att räkna lite i förväg om man vill få det så verklighetstroget som möjligt.

Programmet skapar en stl-fil med samma namn som bilden och i samma katalog. Denna stl-fil kan man sedan öppna i MeshLab.

Screenshot from 2014-10-18 14:45:58Det går egentligen att läsa in stl-filen direkt i ditt program för 3D-skrivaren men i mitt fall så får jag modeller med mycket fler än 1 miljon punkter, vilket är helt onödigt i många fall och genererar stora modellfiler. I MeshLab så är det enkelt att reducera punkterna med ett filter (Remeshing, Simplification and Reconstruction/Quadric Edge Collaps Decimation):

Screenshot from 2014-10-18 10:57:02Jag tror inte du behöver vara speciellt försiktig här, lite beroende på hur många punkter du börjar med. Jag har valt reduceringar allt från 50% till 10% (i bilden ovan angiven som 0.1), och då tror jag att man hamnar på en rimlig nivå med ett par hundra tusen punkter.

Spara modellen på nytt och sedan är det dags för 3D-programmet. Vilket program som används för detta är helt beroende av vilken typ av 3D-skrivare man har.

Jag använder Slic3r för att skapa styrkoden för 3D-skrivaren (g-code). När jag läser in min modell så blir den på tok för stor för skrivaren, men då finns det en skalningsfunktion i Slic3r som löser detta.

Mitt försök här fick jag dock skala ner till 10% i storlek, så min inställning på 2 (mm) som minsta höjd skalades också om, vilket gav en väldigt tunn modell, där även några av detaljerna försvann:

SONY DSCEftersom utskriften i huvudsak är endast ett lager tjock så böjde den sig lite när jag bände loss den. Jag får ändå säga att det fungerade väldigt bra och utskriften tog ”bara” 42 minuter.

3D i bilder

Detta inlägg är något av ett återbesök av tidigare inlägg och handlar om hur man kan använda foton för att skapa 3D modeller med datorer.

Det finns flera kommersiella program som gör detta väldigt bra, men här handlar det om öppen källkod, och en av anledningarna till att jag gör ett återbesök är att jag helst jobbar med Linux.

Programmen jag använder är VisualSFM och Meshlab.

Screenshot from 2014-08-23 10:13:42

VisualSFM är ett GUI, eller användargränssnitt, för en mängd andra program som det är mer eller mindre beroende av. Det är detta som gör det lite krångligt att installera, speciellt på Linux. För Windows så finns det färdiga paket som går att hämta hem och packa upp, sedan är det mer eller mindre bara att köra.

Nu har jag dock hittat en instruktion som jag kunnat följa nästan helt utan att göra några anpassningar och därmed fått VisualSFM att fungera på min dator utan Nvidia grafikkort (eller annan avancerad GPU för den delen).

Jag kombinerar Scott Sawyers instruktion (länk) och de generella instruktionerna för Linux (länk), det senare mest för att jag som sagt inte har ett Nvidia grafikkort. Det är lite pilligt och man måste redigera konfigfiler och kompilera källkod upprepade gånger, men om man läser instruktionen och kommentarerna längre ner så borde det med lite tålamod gå att få allt att fungera.

Screenshot from 2014-08-23 10:27:23

Börja med att lägga in några bilder (Open Multiple Images). Här har jag valt ett enkelt objekt från Sveriges centrala delar, men det skulle lika gärna kunnat vara överlappande bilder tagna från en UAV/UAS. Att tänka på är att ju mer överlapp det är bland bilderna, desto bättre blir det.

Bilderna matchas (Compute Missing Matches) så att programmet vet vilka som hör ihop. Sedan är det bara att köra 3D rekonstruktionen (Compute 3D Reconstruction).

Screenshot from 2014-08-23 10:34:24

Detta skapar ett ”glest” punktmoln (Sparse point cloud) där punkterna och kamerapositionerna visas i 3D. Använd höger och vänster musknapp för att flytta runt modellen. Skrollhjulet zoomar och om man håller inne CTRL så ändras storleken på bilderna vid kamerapositionerna och med ALT så ändras storleken på punkterna.

Har man många bilder så kan det ta ett litet tag men hela processen går att följa i realtid i 3D.

Nästa steg blir att skapa ett ”tätt” punktmoln (Dense point cloud) genom att köra ”Run Dense Reconstruktion” (knappen med texten ”CMVS”).

I detta steg får man peka ut var man vill spara resultatet och det är även detta steg som brukar ta längst tid. Det går heller inte att följa resultatet i realtid så här gäller det helt enkelt att ha tålamod och vänta.

Screenshot from 2014-08-23 10:47:10

Växla mellan ”glest” och ”tätt” punktmoln med TAB och tänd och släck kamerapositioner med knappen ”f”.

Nästa steg blir att öppna modellen i Meshlab, vilket görs genom att helt enkelt öppna (CTRL+O) filen ”bundle.rd.out” som ligger i katalogen ”00” i den katalog som skapades i det förra steget. Man får också peka ut filen ”list.txt” som innehåller sökvägar till de bilder som används.

Som standard visas det glesa punktmolnet. I lagerdialogen (menyn View – Show Layer Dialog) kan man radera detta glesa punktmoln genom att högerklicka på modellen och välja ”Delete Current Mesh”. Nästa steg blir att importera den ”täta” modellen med CTRL-I (Import Mesh). Denna ligger i undermappen ”00/models” och heter i mitt fall ”option-0000.ply”.

Screenshot from 2014-08-23 11:02:07

I det täta punktmolnet finns en hel del punkter som är fel, men dessa kan enkelt markeras och tas bort med ”Select Vertexes” och ”Delete the current set of selected vertices…”.

I detta steg så kan Meshlab krascha då och då så det gäller att som vanligt spara sitt arbete med jämna mellanrum, men framför allt ha tålamod och låta datorn jobba färdigt.

Screenshot from 2014-08-23 11:18:58

Här skulle man kunna vara nöjd med något som bara är ”häftigt”, men låt oss ta det ett steg till. Genom att beräkna ”normals” så ger man programmet instruktioner om vad som är ”insida” och ”utsida”. Blir det fel så kan den lilla kryssrutan i bilden ovan användas. Inställningarna kan man justera i alla dialoger, men jag kör på standard i detta exempel.

Du startar dialogen under ”Filters – Point Set – Compute Normals for point set”.

Modellen består fortfarande av punkter (zooma in i din modell så får du se). Nästa steg blir att göra om den till ”ytor”. Det finns flera filter för detta och vilket som passar bäst kan variera. Här väljer jag ”Filters – Point Set – Surface Reconstruction: Poisson”, med standardvärden.

Screenshot from 2014-08-23 11:29:27

Det är nu man märker om man varit noggrann med att rensa bland punkterna tidigare (jag har inte varit så noggrann).

Vill man nu använda modellen för att skriva ut den med en 3D-skrivare så går det att exportera STL-filer från Meshlab, men detta har jag inte testat. Modellen kan även exporteras i mängder av andra format för fortsatt bearbetning.

Vill man lägga på texturer från fotografierna så går det också.

Använd ”Filters – Texture – Parameterization from registered rasters” och välj att hänsyn skall tas till det beräknade avståndet till kameran och bildernas kanter (bild nedan).

Screenshot from 2014-08-23 12:51:20

Klicka på ”Apply” och gå sedan till menyn ”Filters – Camera – Project Active Rasters ….” och klicka på ”Apply” i dialogrutan.

Screenshot from 2014-08-23 13:10:04

Beroende på vad du använder för motiv och vilka filter du använder så kan du nu få fram en bättre eller sämre textur på din modell. I bilden ovan så har jag fuskat och draperat en av bilderna ovanpå så att det skall bli extra tydligt i artikeln, men man får testa en hel del för att det skall bli ett skapligt resultat.

Samma princip som beskrivits ovan går som sagt att använda för att hantera UAV/UAS bilder och sedan skapa ortorektifierade bilder samt höjddata, men detta är något jag själv inte provat så det ger jag mig inte in på att förklara. Sök på YouTube efter VisualSFM och UAV eller motsvarande så går det att hitta massor av filmer (mer eller mindre bra). Använder du Windows och är intresserad av att skapa ortofoton och höjddata så kanske CMPMVS är ett alternativ att titta närmare på (YouTube exempel).

Ännu en drakflygning

Skärmbild från 2013-10-12 16:10:40

Bilden ovan visar fotopunkter och GPS spår.

Jag var ute och testade KAP igen. Den här gången så använde jag en GPS med GoPro kameran och georefererade alla bilder innan jag läste in dem i PhotoScan Pro.

Omedelbart så kom några fördelar, inte minst att bilderna redan var någorlunda placerade och orienterade, så matchningen i programmet gick snabbare.

Skärmbild från 2013-10-12 16:13:30Tyvärr så fick jag inte till kamerainfästningen så att kameran tittade rakt ner, jag tror det var den extra vikten av GPS mottagaren, varför alla bilderna är svagt orienterade mor väst.

Det blev skapligt i alla fall och tillräckligt bra för mina försök.

Skärmbild från 2013-10-12 19:55:34

När alla beräkningar och texturer var genererade så placerade jag ut lite markörer i modellen. Jag ville se om det med hjälp av GPS nu gick att mäta i bilden utan att mata in referensvärden. Dessutom så exporterade jag markörerna till en fil och öppnade dem i QGIS över ett lager med flygbilder. Resultatet ser du nedan.

Det är byggnadshörn och tydliga kanter på asfalt och betong som utgör mina markörpunkter. Det finns lite begränsningar i Demo versionen av PhotoScan Pro, men på det hela taget, ”Grejt Suxess”.

Skärmbild från 2013-10-12 19:44:06

Observera att felet i bilderna endast är runt 10 meter jämfört med Google. Då skall man tänka på att det endast är fotoplatserna som är geotaggade hängande från ett snöre i en drake. Hade jag tagit samma GPS och medeltalsberäknat några referenspunkter på marken och använt dessa för den slutliga georefereringen av bilden skulle felet sannolikt bli i princip försumbart.

Drakflygning, uppföljning.

OK, då har vi ett sätt att ta massor med ”flygbilder” och nu vill vi implementera en metod för att göra detta lite mera rutinmässigt, går det?

Jajjamen! Som jag visat så kan man använda Agisoft PhotoScan Pro för att göra beräkningarna och om man är villig att betala $3’499 så är det en väg att gå.

En annan väg som jag hittat exempel på YouTube är PhotoModeler Scanner, en programvara jag tittat på tidigare men lämnat lite då deras demoversioner av mjukvaran är väldigt begränsad.

Video som visar hur man kan skapa orthophoto från flygbilder med PhotoModeler Scanner.

Priset för PhotoModeler Scanner är $2’495 alltså 1’000 dollar billigare. Men jag kan som sagt inte säga om mjukvaran är bättre eller sämre än PhotoScan Pro.

Andra alternativ som kan nämnas är Pix4D (http://www.youtube.com/watch?v=cJ-nCgBXZ5I), Dronemapper, Trimble Gatewing med flera, men dessa är ganska starkt förknippade med UAV-hårdvara och har därmed en helt annan regelbok och kostnad.

Open Source då?

Jodå det finns programbibliotek som Open CV och källkod till diverse kommandoradsprogram som du får kompilera själv, men jag har inte hittat en programvara som kan göra allt som de båda kommersiella programmen (PhotoModeler Scanner och PhotoScan Pro) klarar av. På en sida läste jag detta:

”I’ll warn you: you’ll need to install packages, download academic software, and edit and compile source code. This will also require more than 2 GB of hard drive space.”

Antingen så får man kasta sig in i programmeringens värld och skriva sitt eget program (mycket av koden bakom programmen kommer från Open Source) eller så kanske man kan hitta små moduler som löser delar av problemet och på så sätt pussla ihop en komplett lösning. Det blir mycket pysslande hur som helst. Om man ändå vill göra ett försök så kan man börja titta på Bundler, VisualSFM och kanske Insight3D.

Hade det funnits ett Open Source alternativ som löste uppgiften lika bra som dessa program så hade de inte kostat flera tusen dollar…