venerdì 28 ottobre 2011

Navighiamo in 3D

Cari Amici del blog, oggi desidero parlarvi delle Mappe Georeferenziate SRTM (Shuttle Radar Topography Mission). Il progetto SRTM è da considerare uno sforzo colossale, organizzato dalla NASA e da altre Agenzie spaziali (ASI compresa), finalizzato alla realizzazione di un Data Base in 3D dell'intera superficie del nostro Pianeta Terra.

 


Nella precedente immagine vedete graficamente in cosa consiste l'output del progetto SRTM: una miriade di file altimetrici, detti TILE, perfettamente georeferenziati, che riportano in formato numerico l'altezza sul livello del mare (S.l.m.) di ogni rilievo, collina, montagna (isole e isolette, comprese), sparse per il nostro globo terraqueo ...una vera e propria manna per chi è interessato alla realizzazione di un autopilota/navigatore che, scherzosamente, nei precedenti post ho definito come "Un Robot alla Guida".

Come possiamo utilizzare i file HGT del progetto SRTM3?
Procediamo per passi ...e guardiamo insieme le relative immagini!

1) Aggiungiamo il Mare

2) Aggiungiamo il Sole

3) Aggiungiamo una Foto Satellitare dell'area di interesse

4) Elaboriamo l'immagine con un Ombreggiatore 3D ...e il gioco è fatto!!!
(Click per ingrandire - Golfo di Napoli, Penisola sorrentina, Capri)

Nella precedente foto abbiamo visto il risultato in una delle tante possibili viste prospettiche. Ma andiamo più in dettaglio e vediamo, con la prossima foto, cosa ci offre il Data Base SRTM3 con la sua risoluzione di 3'' Arco per Pixel.

Questa non è un immagine del Paneta Luna, il nostro caro satellite naturale, ma rappresenta una mappa ombreggiata dei Campi Flegrei, ovvero un'area vulcanica che si estende dalla Collina di Posillipo (Napoli) al Golfo di Pozzuoli e che comprende numerosi Comuni, situati in questa meravigliosa area storico-paesaggistica, ricchi di panorami mozzafiato e reperti archeologici.

Nella prossima immagine, estendendo un pò lo sguardo verso Sud, vediamo...


 ...in primo piano i Campi Flegrei, poi, il monte Vesuvio e, poi, un tratto della Penisola sorrentina.
Qui il tutto si vede meglio salendo sugli appennini al confine con la Provincia di Avellino...

...e qui in vista aerea.


Per gli amanti del "codice C", riporto il listato di un semplice programma utilizzabile per convertire un file HGT in formato BMP, meglio "digeribile" dai nostri PC.

/* SRTM Tile to BMP simple program */

#include <stdio.h>
union t_height {
    unsigned char in_chr[2];
    short height;
} t_height;
/* image buffer */
char buffer[1200][1200][3];

int main() {
    /* file pointer */
    FILE * fdin;
    FILE * fdout;
    /* array index */
    int x,y;
    /* color components */   
    char color_r;
    char color_g;
    char color_b;
    /* other */
    int min = 0;
    int max = 0;

    char bmp_header[] = {
        0x42, 0x4D, 0x36, 0xEB, 0x41, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
        0x00, 0x00, 0xB0, 0x04, 0x00, 0x00, 0xB0, 0x04,
        0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0xEB, 0x41, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00   
    };
   
    /* open SRTM tile file */
    fdin = fopen("N40E014.hgt", "r");
    if(fdin != NULL) {
        printf("Input file opened.\n");
    } else {
        exit(0);
    }   
    /* transcondig loop */   
    for(y=0; y<1200; y++) {
        for(x=0; x<1200; x++) {
            t_height.in_chr[1] = fgetc(fdin);
            t_height.in_chr[0] = fgetc(fdin);

            /* set color pixel */
            if (t_height.height == 0) {
                color_r = 0;
                color_g = 0;
                color_b = 128;
            } else if (t_height.height > 0) {
                color_r = t_height.height / 7;
                color_g = color_r;
                color_b = color_r;
            }
            buffer[x][y][0] = color_r; //red
            buffer[x][y][1] = color_g; //green
            buffer[x][y][2] = color_b; //blu      
            /* update min, max */
            if (t_height.height > max) {
                max = t_height.height;
            }
            if (t_height.height < min) {
                min = t_height.height;
            }                      
        }
        /* discard pixel 1201 */
        t_height.in_chr[1] = fgetc(fdin);
        t_height.in_chr[0] = fgetc(fdin);
    }   
    /* close .hgt files */
    fclose(fdin);
    /* open BMP file */
    fdout = fopen("SRTM.bmp", "w");
    if(fdout) printf("Output file opened.\n");
    /* write BMP 1200x1200 header */
    for(x=0; x<54; x++) {
        fputc(bmp_header[x], fdout);
    }
    /* write image buffer to BMP data area */
    for(y=1199; y>=0; y--) {
        for(x=0; x<1200; x++) {
            fputc(buffer [x][y][2], fdout); //blu
            fputc(buffer [x][y][1], fdout); //green
            fputc(buffer [x][y][0], fdout); //red
        }
    }   
    fclose(fdout);
    /* message */
    printf("Min: %d  Max: %d\n", min, max);
    printf("Conversion complete.\n");
    /* terminate program */
    return 0;
}

Nei prossimi post vedremo come utilizzare le Mappe SRTM nel nostro navigatore fai-da-te e vedremo anche come utilizzare il file-system Linux in abbinamento al Displey TFT a colori.

Qui Pianeta Terra ...in 3D, a presto.

Nessun commento:

Posta un commento