Tag Archive | 3D

GIS – Visualisering

Som jag beskrev det i den inledande inlägget i den här serien så är visualisering högst centralt i arbetet med GIS och geodata.

Tyvärr fokuserar man ofta på det rent tekniska och ger det estetiska lägre prioritet. Om man är mån att mottagaren av informationen skall förstå vad som presenteras så är detta en prioritering som är mycket märklig.

Läs mer…

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…

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.