-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



sabato 17 novembre 2012

Smack...! Bacini idrografici

L’extension Spatial Analyst, una delle più utilizzate in ArcGIS, permette un’innumerevole serie di analisi. Tra queste troviamo anche quelle relative all’idrologia. In questo caso, ArcGIS ci mette a disposizione uno strumento per lo sviluppo di soluzioni e la gestione delle risorse idriche. Gli idrologi e gli idrogeologi possono utilizzare la tecnologia GIS per integrare vari tipi di dati e applicazioni in un unico sistema centralizzato. L’insieme degli strumenti contenuti, ad esempio, in ArcHydro, facilita la creazione, la gestione e la visualizzazione degli oggetti idrologici all’interno dell’ambiente di ArcGIS.
I seguenti tool ci sono messi a disposizione per la gestione delle nostre analisi: Basin, Fill, Flow Accumulation, Flow Direction, Flow Length, Sink, Snap Pour Point, Stream Link, Stream Order, Stream To Feature e Watershed
E’ possibile, ad esempio, con questi tool delineare in modo automatico il bacino imbrifero a partire dal modello digitale del terreno, determinare il reticolo idrografico e l’ordine delle aste fluviali.
Ad esempio, per determinare un bacino idrografico a partire da una sezione di chiusura, si procede creando innanzitutto un raster che rappresenta la direzione di flusso di ogni cella ad una delle otto celle adiacenti verso la quale ha la pendenza maggiore. A seconda delle direzione la cella sarà impostata con i valori 1,2,4,8,16,32,64 o 128.
I valori di output sono derivati da una rappresentazione binaria dei risultati dell’analisi e, come possiamo osservare dall’immagine, se il flusso è diretto a destra verrà impostato 1, se il flusso è diretto in basso a destra verrà impostato 2 e così via fino a 128. Il focal flow che è un filtro focale può utilizzare operatori bitwise; così, ad esempio, se da una cella il flusso è in tutte le direzioni verrà impostato il valore 128+64+32+16+8+4+2+1 = 255, mentre se dovesse essere nella direzione 3 e 1 sarà 4+1 = 5.
 

L’approccio utilizzato è quello di un modello di flusso di otto direzioni (D8) e segue l’approccio presentato da Jensen and Domingue (1988).

Il calcolo effettuato per determinare la direzione con la pendenza più ripida per ogni cella è:




ΔZ / distanza


La distanza è deteminata tra i centri delle celle, pertanto la cella centrale rispetto alle celle poste sulla diagonale avrà un fattore 1,4142.. (le celle sono quadrate) mentre le altre avranno un fattore 1.
Nell’esempio seguente la dimensione della cella è 1 unità.
 

Se tutte le celle adiacenti sono più alte di quella centrale, la cella è un sink (pozzo) ed avrà una direzione di flusso non definita. Celle con direzione di flusso non definito possono essere marcate come sink utilizzando la funzione Sink. Per ottenere una rappresentazione accurata della direzione di flusso sulla superficie, i sink possono essere riempiti con la funzione Fill utilizzando il DEM.
Una volta determinata la direzione di flusso a partire dal DEM, occorre determinare gli accumuli di flusso. La flow accumulation è determinata a partire dalla flow direction.
Questa funzione calcola il flusso accumulato come peso accumulato di tutte le celle che scorrono verso ogni cella. Se non è fornito un peso sul raster, ad ogni cella è applicato un peso pari a 1 e quindi il numero rappresentato sarà il numero di celle nel quale il flusso arriva alla cella.
 
 In questo esempio è stato dato peso 1 ad ogni cella.
 
 
Celle con un elevato accumulo di flusso sono aree dove l’acqua converge in modo massiccio e possono essere utilizzate per identificare canali di flusso, mentre celle con accumulo di flusso pari a zero possono essere utilizzate per identificare gli spartiacque.
Un esempio di utilizzo di un raster pesato nella funzione di Flow Accumulation è determinare l’ammontare di pioggia caduta all’interno di un dato bacino imbrifero. In questo caso il raster pesato potrebbe essere un raster che rappresenta la precipitazione media durante un dato temporale. Il risultato della funzione di Flow Accumulation rappresenterà la quantità di pioggia che defluisce in ogni cella, assumendo che tutta la pioggia defluisce senza altri fattori che possano influenzarla (evapotraspirazione, infiltrazione nel sottosuolo ecc.).
Ora, per determinare i bacini idrografici relativi a determinate sezioni di chiusura, possiamo utilizzare la funzione Watershed che richiede come input la flow direction e i punti rappresentanti le sezione di chiusura.
Il modello seguente determina un watershed a partire da una flow direction, una flow accumulation e da uno o più punti che si posizioneranno mediante la distanza di snap alle celle con il più alto valore di flusso di accumulo (Snap Pour Point).
 
Utilizzando gli ArcObjects, l’interfaccia da utilizzare è la IHydrologyOp2 della library Spatial Analyst che ci mette a disposizione tutte le funzioni elencate precedentemente.

Per determinare un watershed scriveremo:

            try
            {
                IFeatureWorkspace featureWorkspace = Helper.CreateInMemoryWorkspace() as IFeatureWorkspace;
                IFeatureClass featureClass = this.CreateFeatureClass(location, featureWorkspace);
 
                IFeature feature = featureClass.CreateFeature();
                feature.Shape = location;
                feature.set_Value(featureClass.FindField(SAUtility.FieldNameIdWatershed), (int)idWatershed.Value);
                feature.Store();
 
                IHydrologyOp hydrologyOp = new RasterHydrologyOp() as IHydrologyOp;
 
                IGeoDataset accumulation = this.GetGeodataset((int)idAccumulation.Value);
                IGeoDataset direction = this.GetGeodataset((int)idDirection.Value);
 
                IFeatureClassDescriptor featureClassDescriptor = new FeatureClassDescriptorClass();
                featureClassDescriptor.Create(featureClass, nullSAUtility.FieldNameIdWatershed);
                IGeoDataset pourPoint = featureClassDescriptor as IGeoDataset;
 
                IRasterAnalysisEnvironment rasterAnalysisEnvironment = new RasterAnalysisClass();
                object extentProvider = Type.Missing;
                object snapRasterData = Type.Missing;
                rasterAnalysisEnvironment.SetExtent(esriRasterEnvSettingEnum.esriRasterEnvMaxOf, ref extentProvider, ref snapRasterData);
 
                IGeoDataset snapRaster = hydrologyOp.SnapPourPoint(pourPoint, accumulation, snapDistance.Value);
 
                IGeoDataset watershed = hydrologyOp.Watershed(direction, snapRaster);
 
                IConversionOp conversionOp = new RasterConversionOpClass() as IConversionOp;
                IGeoDataset featureClassWatershed = conversionOp.RasterDataToPolygonFeatureData(watershed, featureWorkspace as IWorkspace"WatershedPolygon"true);
 
                IRecordSetInit recordset = new RecordSetClass();
                recordset.SetSourceTable(featureClassWatershed as ITablenull);
 
                byte[] recorset = Conversion.ToJson(recordset as IRecordSet);
                this.logger.LogMessage(ServerLogger.msgType.infoDetailed, methodName, SAUtility.MessageCodeSOE, string.Format("Watershed created with succcess. IdWatershed {0}", (int)idWatershed.Value));
                return recorset;
            }
            catch (Exception ex)
            {
                this.logger.LogMessage(ServerLogger.msgType.error, methodName, SAUtility.MessageCodeSOE, ex.Message);
                return new ObjectError("error create watershed").ToJsonObject().JsonByte();
            }

Per puro divertimento (come dice il mio amico Erik) ho creato una SOE da utilizzate in ArcGIS Server 10.1 per poter creare bacini idrografici online. Potete scaricarla qui.



Per i non sviluppatori gli stessi risultati possono essere ottenuti pubblicando il modello (che potete scaricare qui mentre il tutorial lo trovate qui) visto precedentemente.