Import fichier DEM
OverdOzed
Inscrit:
24/07/2008 00: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 17:30
_________________
Tuto MaPZone
Créer un fichier PDF de la contribution Imprimer


Re: Import fichier DEM
Clan Afficionado
Inscrit:
04/08/2009 13: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 09:02
Créer un fichier PDF de la contribution Imprimer


Re: Import fichier DEM
OverdOzed
Inscrit:
24/07/2008 00: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 21: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 [non résolu] Ecran bleu 2 21 Aujourd'hui 18:35:32
alexmge 
Questions & Réponses [non résolu] va et vient entre sculpt et layout impossible    [1][2] 11 134 Aujourd'hui 09:56:50
manondup 
Le coin des geeks carte graphique Intel(R) HD Graphics et OpenGL    [1][2][3] 24 792 Hier 22:47:15
Bibi09 
Questions & Réponses shader 5 135 Hier 20:23:23
Rimpotche 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Première version disponible !    [1][2][3]...[56] 558 92760 Hier 12:34:39
Hook 
[WIP] et travaux terminés Le Tigre 4 201 Hier 11:19:09
lastrodamo 
Questions & Réponses [non résolu] le Rendu de preview et le rendu final ne sonts pas pareils 2 63 03/07 23:18:27
Pinguinax 
Questions & Réponses [non résolu] Particules system dynamique 0 57 03/07 13:27:09
Ramar 
[WIP] et travaux terminés bas sculpture corps    [1][2] 18 316 01/07 18:57:21
prometheusx 
[WIP] et travaux terminés Générateur d'oreille - Beta testeurs bienvenus 8 449 30/06 10:28:08
Rimpotche 
Le coin des geeks Vieilles cartes graphiques : Quadro FX5800 ou Quadro 4000 ? 3 198 30/06 07:48:42
Poutrator 
Questions & Réponses Changement de caméra 2 188 28/06 19:10:40
prometheusx 
Moteur de jeu GameBlender et alternatives hARMful engine    [1][2][3]...[8] 78 8761 28/06 16:44:44
Bibi09 
Questions & Réponses Faire pousser des cheveux 2 176 28/06 16:01:40
Rimpotche 
Questions & Réponses convertir un mesh en hair et le relier 2 130 28/06 11:11:44
prometheusx 
Questions & Réponses feu rapide 2 186 28/06 07:22:23
francerf 
Questions & Réponses collision de tissu 1 130 27/06 23:54:35
prometheusx 
Questions & Réponses blender 282a 2 175 27/06 18:39:51
LALA 
Moteur de jeu GameBlender et alternatives Nouveau fangame de Rayman 5 1431 27/06 11:25:02
lucky 
Questions & Réponses Retrouver un calque 1 132 26/06 18:55:10
Rimpotche 

Qui est en ligne
43 utilisateur(s) en ligne (dont 26 sur Forums)

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


plus...
Nouveaux membres
Dartank 5/7/2020
manondup 3/7/2020
Ramar 3/7/2020
Blendnoob 2/7/2020
blendmus 30/6/2020
Rafalithique2020 29/6/2020
rainbowfruit 27/6/2020
Flamby22 25/6/2020
mitronougna1 25/6/2020

patapote
25/6/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Jui 11
BUG de Lyon
Jui 23
Anniv du BlenderClan !
Aou 7
anniversaire Cem47
plus 269 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445