Connexion
Menu Principal
Recherche
Menu secondaire
Image Aléatoire
rendu.jpg
Publicité
Formation Blender ElephormBlender 3d Elephorm


     






Import fichier DEM
OverdOzed
Inscrit:
24/07/2008 01:45
De Paris
Post(s): 3447
Bonjour à tous !

On m'a demandé il y a peu un moyen d'ouvrir les fichiers DEM présents sur un CD VistaPro.
Le format DEM, pour Digital Elevation Model est un format décrivant le relief d'une portion de terrain.
En gros, c'est une heightmap mais elle n'est pas compresser de la même façon qu'une image donc je n'ai pas trouvé de moyen simple de l'ouvrir.
Avec l'aide de ce site, j'ai fait un petit script permettant d'ouvrir ces fichiers. Je n'ai testé le script que sur les fichiers du cd que j'avais mais je sais que le format DEM a été utilisé par l'USGS, United States Geological Survey, donc ça peut peut-être servir à d'autres.

En ce qui concerne l'utilisation du script, il faut indiquer dans rep le chemin du fichier à ouvrir et la variable pos permet de gérer le décalage. Par exemple, si on charge deux fichiers représentant des zones contiguës selon l'axe X, on charge le premier fichier avec pos = (0,0) et le second avec pos = (1,0). Ça évite de déplacer les blocs à la main si on veut en charger beaucoup.

Un petit rendu d'un terrain chargé avec ce script (région des Alpes italiennes) :


Voici donc le petit script d'import : profitez-en, c'est libre d'être réutilisé sans conditions de ma part.
import io
from struct import unpack, calcsize
import bpy

## Paramètres ##
    # Fichier
rep = "/media/DEM_ALPES/Alps/ALPS75/DEMS0303/ALPSAR19.DEM"
    # Position du bloc.
# Aide : Si pour le fichier ALPSaa11, pos = (i, j)
#  si aa augmente, augmenter i
#  si 11 augmente, augmenter j
pos = (0, 0)
scale = .1
scalez = 1./500.
## ##

def main(rep, pos, scale) :
    offx = pos[1] * 256 * scale
    offy = pos[0] * 256 * scale
    
    ## Ouverture du fichier
    file = io.FileIO(rep)
    raw = file.read()
    
    f = 'B'           # Format : unsigned char
    s = calcsize(f)   # Taille en bytes d'un élément de données
    off = 2048        # Offset (2048 bytes d'en-tete)
    
    wx = 258
    width = 258
    
    ## Analyse des données
    verts = []
    faces = []
    
    print("-----------------")
    def read(off) :
        if off+s > len(raw) :
            print("erreur")
        (a,) = unpack(f, raw[off:off+s])
        return a, off + s
    
    x = 0
    while x < wx :
        # longueur de la ligne
        long, off = read(off)
        a, off = read(off)
        long = long * 256 + a
        
        # Décompression
        k = off
        data = []
        while off - k < long :
            c, off = read(off)
            if c >= 128 :
                r = 257 - c # Nombre de répétitions
                oct, off = read(off)
                data.extend([oct]*r)
            else :
                for i in range(c + 1) :
                    oct, off = read(off)
                    data.append(oct)
        
        
        # Altitude absolue
        alt = data[0] * 256 + data[1]
        point = [alt]
        k = 2
        while k < len(data) :
            c = data[k]
            if c == 128 and k + 2 < len(data) :
                point.append(256 * data[k+1] + data[k+2])
                k += 3
            elif c < 128 :
                point.append(point[-1]+c)
                k += 1
            else :
                point.append(point[-1]-256+c)
                k += 1
        
        
        # Construction du maillage
        for y in range(min(width,len(point))) :
            hgt = point[y]
            
            verts.append((offy + y*scale, offx + x*scale, hgt*scalez))
            
            if x > 0 and y > 0 :
                faces.append(((x-1)*width + y, (x-1)*width + y - 1, x*width + y - 1, x*width + y))
            
        x += 1
    
    ## Construction de l'objet
    mesh = bpy.data.meshes.new("dem_mesh")
    mesh.from_pydata(verts, [], faces)
    mesh.update()
    
    obj = bpy.data.objects.new("dem", mesh)
    scene = bpy.context.scene
    scene.objects.link(obj)



main(rep, pos, scale)

Contribution le : 17/02/2013 18:30
_________________
Tuto MaPZone
Créer un fichier PDF de la contribution Imprimer


Re: Import fichier DEM
Clan Afficionado
Inscrit:
04/08/2009 14:33
De Lille
Post(s): 52
Bonjour Bobibou,

Connais-tu cet add-on?
ESRI shapefile I/O
Si tu veux, je pourrais faire de ton code, un add-on....
Ciao.
Spirou4D

Contribution le : 18/02/2013 10:02
Créer un fichier PDF de la contribution Imprimer


Re: Import fichier DEM
OverdOzed
Inscrit:
24/07/2008 01:45
De Paris
Post(s): 3447
Ah non je connaissais pas cet add-on merci

Tu peux faire un add-on si ça te fais plaisir, je ne compte pas approfondir ce script, faute de temps, je postais juste pour partager, même si visiblement d'autres l'on déjà fait.

Mais tu me fais pensé que j'ai pas parlé de la licence du code : c'est tout libre

Contribution le : 18/02/2013 22:17
_________________
Tuto MaPZone
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Questions & Réponses Blender 2.8 et Unity 4 69 Aujourd'hui 13:30:42
Hook 
Questions & Réponses Ne pas voir une partie d'un objet lors du rendu 8 79 Aujourd'hui 10:41:02
Horemheb 
Python & Plugins [résolu] Comparaisons d'un ensemble de valeurs    [1][2] 10 195 Aujourd'hui 09:31:56
makhaon 
[WIP] et travaux terminés [WIP] Bataille Navale // Animation 3d 8 209 Hier 22:56:16
Guppy88 
Questions & Réponses [résolu] Rendu avec eevee, scène toujours lumineuse même sans lights. 2 79 12/10 22:17:48
Obaemon 
Questions & Réponses [non résolu] renderman Blender problème de connexion 2 127 12/10 19:18:54
tokoji 
[WIP] et travaux terminés [WIP] Nécromancienne sur sanglier    [1][2][3]...[6] 55 14049 10/10 18:45:51
Gilead_Maerlyn 
Moteur de jeu GameBlender et alternatives BGE - son 3D, cône inner angle 1 157 10/10 15:35:54
Redstar 
Questions & Réponses Enlever les wireframes en object mode 1 103 10/10 02:29:52
Rimpotche 
Questions & Réponses [non résolu] Problème de normal baking 0 84 09/10 15:41:29
Irreel 
Questions & Réponses carte graphique pour cycles 1 220 09/10 14:50:50
Sphere3d 
Questions & Réponses [résolu] MIDI to Blender 9 557 08/10 20:41:37
docouatzat 
Questions & Réponses Problème Compositing 2 153 06/10 23:44:45
Rimpotche 
Questions & Réponses Surface a partir de 2 courbes fermées de beziers non coplanaires 9 204 06/10 22:58:28
ewok2 
Questions & Réponses [résolu] Blender 2.8 : Layout/Modelling 2 126 06/10 20:02:53
blendinfos 
Questions & Réponses [résolu] blender 2.8 et 2.79 ensemble 3 132 06/10 15:54:46
sapajou 
Questions & Réponses [résolu] Blender 2.8 : Inset faces/Bevel bug ? 2 104 06/10 15:06:24
blendinfos 
Questions & Réponses Problème de rendu sur une animation de fumée 1 116 06/10 15:01:01
Rimpotche 
Questions & Réponses [résolu] Blender 2.8 : item "Filter Addon" 3 127 06/10 13:24:28
blendinfos 
Questions & Réponses export textures avec .obj 0 104 05/10 22:11:09
Gildas 

Qui est en ligne
40 utilisateur(s) en ligne (dont 30 sur Forums)

Membre(s): 0
Invité(s): 40


plus...
Nouveaux membres
Marcos06N 14/10/2019
IFVShela56 14/10/2019
FreddyWorg 14/10/2019
SeanLockye 14/10/2019
Obaemon 12/10/2019
ALK-chimiste 12/10/2019
Sinus 12/10/2019
thelight 10/10/2019
thelightoi 10/10/2019
nathanrogee 6/10/2019
Dernier Ajout
Forky-3D-ToyStory BC.png

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 11
BUG de Lyon
plus 278 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2019 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445