Connexion
Menu Principal
Recherche
Menu secondaire
Image Aléatoire
MagnumRexxor.png
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
Moteur de jeu GameBlender et alternatives Problème Visual Studio Code dans Armory3D 6 53 Aujourd'hui 00:10:09
Black_Panther 
[WIP] et travaux terminés [WIP] Bataille Navale // Animation 3d    [1][2] 19 593 Hier 17:20:10
Guppy88 
Questions & Réponses [résolu] Duplication de groupe dans Blender 2.8?    [1][2] 10 177 Hier 14:50:51
Fracoris 
Questions & Réponses Tutoriel: La duplication de groupe (vidéo) 0 21 Hier 14:47:35
Fracoris 
Questions & Réponses Aide UV mapping. Détordre le mappage!    [1][2] 11 123 Hier 14:25:23
busanga 
[WIP] et travaux terminés [terminé] VFX Harry Potter 6 187 18/10 21:58:47
moonboots 
Questions & Réponses Où mettre un Tutoriel? 3 103 18/10 21:57:39
moonboots 
Questions & Réponses [non résolu] Scale "mode objet" ne tient pas compte des axes du repère personnalisé    [1][2] 15 270 18/10 13:50:21
paquetdemouchoirs 
Questions & Réponses [WIP] Comment modifier le diamètre d'un cercle    [1][2] 15 262 18/10 13:05:39
busanga 
Questions & Réponses [résolu] Faire apparaître les boutons de la souris sur l'écran ? 4 138 18/10 10:15:42
Fracoris 
The Blender Clan 'tchat Présentation OlivierL. 3 135 17/10 11:58:05
Gilead_Maerlyn 
The Blender Clan 'tchat [Recrutement] 3D artists & animateurs pour jeu de simulation spatiale 3 348 15/10 22:55:21
ThePioneers 
Questions & Réponses Transférer une chevelure 0 105 15/10 13:44:40
Horemheb 
Questions & Réponses [résolu] Ne pas voir une partie d'un objet lors du rendu 9 258 15/10 13:07:02
Horemheb 
Questions & Réponses Blender 2.8 et Unity 4 202 14/10 13:30:42
Hook 
Python & Plugins [résolu] Comparaisons d'un ensemble de valeurs    [1][2] 10 383 14/10 09:31:56
makhaon 
Questions & Réponses [résolu] Rendu avec eevee, scène toujours lumineuse même sans lights. 2 202 12/10 22:17:48
Obaemon 
Questions & Réponses [non résolu] renderman Blender problème de connexion 2 202 12/10 19:18:54
tokoji 
[WIP] et travaux terminés [WIP] Nécromancienne sur sanglier    [1][2][3]...[6] 55 14339 10/10 18:45:51
Gilead_Maerlyn 
Moteur de jeu GameBlender et alternatives [résolu] BGE - son 3D, cône inner angle 1 233 10/10 15:35:54
Redstar 

Qui est en ligne
71 utilisateur(s) en ligne (dont 47 sur Forums)

Membre(s): 2
Invité(s): 69


Black_Panther, Gilead_Maerlyn, plus...
Nouveaux membres
thecake 18/10/2019
OlivierL 16/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
Nek 6/10/2019
Gildas 5/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