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 [Driver]difference entre single proprety et transform channel 0 7 Aujourd'hui 02:10:15
pierre-y 
The Blender Clan 'tchat Décès d'Eddy    [1][2] 15 286 Hier 21:30:42
origalde 
Questions & Réponses Perte de vue de mon objet par des zones grises 0 21 Hier 19:51:22
Olguern 
Questions & Réponses Installer une ancienne version pour Blend4web 4 85 Hier 18:44:19
Rimpotche 
Questions & Réponses [non résolu] Une MixRGB Node qui ne fait pas son travail... 3 117 Hier 18:41:56
Rimpotche 
Questions & Réponses Installation de Blend4Web avec la version 2.82 1 35 Hier 15:58:04
ebrain 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Reprise du développement    [1][2][3]...[42] 416 75597 Hier 15:36:35
Hook 
[WIP] et travaux terminés [WIP] Akihabara 1 98 Hier 12:25:02
smogBlender 
Questions & Réponses Animation bras + piston. 8 490 Hier 09:29:43
NaaB 
Python & Plugins [resolu] cibler l'element selectionné dans une UI list 3 57 Hier 07:15:48
pierre-y 
Questions & Réponses Smoke non visible en Render (2.81) 6 132 20/02 18:12:35
CBY 
Moteur de jeu GameBlender et alternatives Faire un jeu sans coder    [1][2][3] 21 1512 20/02 14:06:05
Melodicpinpon 
Questions & Réponses [résolu] Reconstruction à partir d'un scan 3D    [1][2] 10 136 20/02 13:38:41
Redstar 
Questions & Réponses [non résolu] fond transparent dans le viewport : blender 2.8 4 76 20/02 12:55:21
dam 
[WIP] et travaux terminés [WIP] Projet Tales & Legends    [1][2][3]...[11] 109 36882 20/02 11:13:12
Redstar 
FAQ modélisation Où trouver des modèles à télécharger ? 2 84494 20/02 09:10:19
USA 
Moteur de jeu GameBlender et alternatives Rien ne sera plus jamais comme avant    [1][2] 10 730 19/02 22:14:30
lollito 
The Blender Clan 'tchat Blender 2.82 est sorti ! 0 70 19/02 15:21:37
ebrain 
Questions & Réponses mauvais nodes pour materiel bois brillant 2 107 18/02 20:52:15
ladyvanessa 
Questions & Réponses Eevee et le baking 5 169 18/02 11:57:05
lollito 

Qui est en ligne
89 utilisateur(s) en ligne (dont 36 sur Forums)

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


plus...
Nouveaux membres
BrendanTre 22/2/2020
JulieGardi 22/2/2020
AlexandraJ 22/2/2020
LeonoreGun 22/2/2020
Xiomara77G 22/2/2020
ChiquitaMa 22/2/2020
TereseAlbe 22/2/2020
IgnacioMcc 22/2/2020
Lucille48F 22/2/2020
JuanaAuric 22/2/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Fev 23
anniversaire de windspirit
Mar 14
Anniversaire de AMV12
Mar 16
Anniversaire de galba
plus 274 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