Tag Archive | 3D

3D i QGIS 3.X?

STOPP! Detta inlägg handlar om spekulation och möjligheter!!! Det finns ingen substans i de möjligheter och antaganden som jag presenterar här! Det finns inga som helst garantier att QGIS någonsin kommer att få 3D integrerat! Men… Läs mer…

Annonser

QGIS Globe, plugin för 3D

QGIS har inte haft superstarkt stöd för att hantera 3D tidigare. Jodå, det går att använda höjddata och göra bearbetningar och analyser där man tar hänsyn till 3D, men visualiseringen har det varit ganska skralt med.

Hur ser det då ut nu? Har det skett några förändringar till det bättre, och hur bra är det i så fall?

Läs mer…

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