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
[WIP] et travaux terminés La mare aux canards    [1][2] 10 97 Aujourd'hui 17:45:24
Rimpotche 
The Blender Clan 'tchat Benchmark EEVEE    [1][2][3] 24 727 Aujourd'hui 14:37:08
Bibi09 
[WIP] et travaux terminés Différents rendus 2.91 9 131 Aujourd'hui 12:05:20
Bibi09 
Questions & Réponses Render Layers qui n'apparaissent pas    [1][2] 10 100 Aujourd'hui 11:02:12
HarDrive 
Questions & Réponses Problème perso qui bouge des 2 côtés qu'avec 1 coté de l'armature et pas de l'autre    [1][2] 12 1881 Hier 15:14:53
Rimpotche 
The Blender Clan 'tchat Avenir du blender clan    [1][2][3]...[13] 123 8009 Hier 11:39:51
Bibi09 
Hors Sujet !! Nouveau tutoriel : Animation labiale simplifiée 2.9 3 68 Hier 10:07:35
moonboots 
Questions & Réponses [résolu] Problème avec les addons 2 76 Hier 09:42:19
Lamoyse 
Questions & Réponses SCAN 3D - Carrière - animation 6 82 Hier 07:23:48
Versatil 
Questions & Réponses [résolu] Texture Image en noir dans le rendu 3 267 23/09 15:10:30
Horemheb 
Moteur de jeu GameBlender et alternatives [non résolu] Cs (vaisseau)    [1][2][3]...[47] 467 140065 23/09 13:20:39
sbkodama 
Questions & Réponses [non résolu] Move to collection 8 107 22/09 21:15:48
JaAlVir657 
Questions & Réponses Boids, boids, boids...    [1][2] 18 327 22/09 20:53:24
JaAlVir657 
Python & Plugins [WIP] Transportation Add-on pour Blender 5 311 22/09 20:12:35
ferrari6 
[WIP] et travaux terminés Blender 2.9 les outils du sculpte 0 57 22/09 19:51:11
meltingman 
[WIP] et travaux terminés [WIP] Kanata et personnage secret coucours Blender 3D France    [1][2][3] 25 344 22/09 19:19:34
meltingman 
Questions & Réponses [non résolu] Simulation Tissu Temps Reel    [1][2] 14 242 22/09 16:57:22
ThierryT 
[WIP] et travaux terminés [WIP] Teeny Tiny - Story    [1][2][3]...[10] 99 7610 21/09 16:28:45
meltingman 
Le coin des geeks gain de fluidité viewport entre ryzen 3900X et 3950X    [1][2][3] 27 584 21/09 12:12:59
papillon 
Le coin des geeks Ralentissement du chargement de Blender 8 192 20/09 17:43:54
Rimpotche 

Qui est en ligne
117 utilisateur(s) en ligne (dont 87 sur Forums)

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


plus...
Nouveaux membres
RoccoMathe 25/9/2020
KaySkertch 25/9/2020
TerraWoodr 25/9/2020
Dacia4412 25/9/2020
KazukoKula 25/9/2020
DouglasKea 25/9/2020
GennieSly 25/9/2020
FranklinCh 25/9/2020
ArielleHed 25/9/2020
RollandFar 25/9/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 9
BUG de Lyon
plus 264 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