Il tema della determinazione delle linee di flusso di dati GIS era già stato considerato nei post Metodi di Runge-Kutta per la determinazione di linee di flusso nei GIS e Generare linee di flusso nei GIS.
In questo post presento due differenti implementazioni in Python ed in C++, entrambe open-source e free, del classico algoritmo di Runge-Kutta-Fehlberg (RKF 45) per il calcolo della traiettoria di flusso in un campo di velocità variabile nello spazio ma “costante” nel tempo. I due algoritmi calcolano il percorso di ipotetiche particelle puntuali all'interno del campo di velocità durante un intervallo di tempo prefissato. Queste implementazioni funzionano direttamente con dati nei formati classici GIS (shapefiles e raster letti da GDAL). Sono state realizzate e testate su Windows Vista e XP. Fatto salve eventuali modifiche minori, dovrebbero funzionare anche su Linux, ricompilando, nel caso dell'implementazione in C++, il codice sorgente.
Le due implementazioni, con codice sorgente, eseguibile, un dataset di esempio ed una breve descrizione teorica, sono disponibili alla pagina www.malg.eu/streamlines.php (in inglese).
In questo post presento due differenti implementazioni in Python ed in C++, entrambe open-source e free, del classico algoritmo di Runge-Kutta-Fehlberg (RKF 45) per il calcolo della traiettoria di flusso in un campo di velocità variabile nello spazio ma “costante” nel tempo. I due algoritmi calcolano il percorso di ipotetiche particelle puntuali all'interno del campo di velocità durante un intervallo di tempo prefissato. Queste implementazioni funzionano direttamente con dati nei formati classici GIS (shapefiles e raster letti da GDAL). Sono state realizzate e testate su Windows Vista e XP. Fatto salve eventuali modifiche minori, dovrebbero funzionare anche su Linux, ricompilando, nel caso dell'implementazione in C++, il codice sorgente.
Le due implementazioni, con codice sorgente, eseguibile, un dataset di esempio ed una breve descrizione teorica, sono disponibili alla pagina www.malg.eu/streamlines.php (in inglese).
Entrambe queste implementazioni si basano su OGR per leggere le posizioni iniziali dei punti da uno shapefile.
Il campo di velocità è definito dalle sue componenti cartesiane vx e vy, conservate in due distinti livelli raster. Mentre lo script Python legge solo raster in formato Arc/Info ascii grid, il programma C++ legge i formati raster resi disponibili da GDAL. E' cruciale che i livelli raster delle componenti delle velocità abbiano le stesse caratteristiche geometriche e geografiche (uguale numero di righe e colonne, stessa dimensione geografica delle celle, identico posizionamento nello spazio).
Il campo di velocità è definito dalle sue componenti cartesiane vx e vy, conservate in due distinti livelli raster. Mentre lo script Python legge solo raster in formato Arc/Info ascii grid, il programma C++ legge i formati raster resi disponibili da GDAL. E' cruciale che i livelli raster delle componenti delle velocità abbiano le stesse caratteristiche geometriche e geografiche (uguale numero di righe e colonne, stessa dimensione geografica delle celle, identico posizionamento nello spazio).
Il risultato consiste in uno shapefile, sempre puntuale, i cui punti rappresentano le traiettorie delle particelle per intervalli di tempo successivi. Gli intervalli di tempo possono avere durata variabile, in quanto il metodo RKF 45 consente di scegliere dei passi adattivi per ridurre gli errori stimati al di sotto di una soglia massima.
No comments:
Post a Comment