… 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.
Jag 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.
Det ä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.
Nä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.
Det 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):
Jag 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:
Eftersom 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.