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

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

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



lunedì 30 settembre 2013

CityEngine Web Scene

Nel post del mese scorso ci eravamo lasciati descrivendo la possibilità di visualizzare le multipatch utilizzando il web viewer Esri (Esri CityEngine Web Scene) esportando il documento ArcScene nel formato 3ws. Ma che cos'è il visualizzatore Web CityEngine? E' un'applicazione Web per visualizzare scene 3D in un browser. Esso si basa su WebGL (Web-based Graphics Library) e consente di visualizzare contenuti 3D in un browser attivando l'accelerazione hardware per il rendering degli elementi grafici 3D e senza installare plug-in aggiuntivi. I principali browser supportano WebGL anche se Internet Explorer necessita di Google Chrome Frame; con il rilascio di IE 11 anche il browser di Microsoft supporterà WebGL. Per prestazioni ottimali occorre avere una buona scheda grafica installata per poter sfruttare la potenza di calcolo offerta dalla GPU. Il consiglio è anche di mantenere aggiornati i driver della scheda grafica.
In attesa delle Esri API 3D javascript schedulate per il 1Q del 2014 in versione beta e per il 2Q del 2014 in versione finale, possiamo visualizzare e generare contenuti dinamici 3D anche con il visualizzatore Web CityEngine.
Va ricordato che questo visualizzatore era nato per visualizzare le scene create con Esri CityEngine.
Esri CityEngine è un pacchetto software che consente di creare in modo efficace paesaggi urbani 3D utilizzando i dati GIS esistenti, nonché eseguire geoprogettazioni concettuali in 3D. Una volta modificato il paesaggio, la scena 3D può essere caricata anche direttamente in ArcGIS Online per condividerla con altri utenti tramite un browser Web. Ma, come già detto dalla 10.2, è possibile esportare scene web 3D da documenti ArcScene in formato scena Web di CityEngine senza la necessità di avere una licenza CityEngine ma quella di avere la licenza dell'estensione 3D Analyst per ArcGIS.
Una delle possibili applicazioni in questo panorama potrebbe essere quella di generare dinamicamente contenuti 3D, ad esempio, feature Multipatch, feature class PolylineZ, feature class PointZ, con simboli 3D, caricarli in un documento ArcScene ed esportare la scena da far visualizzare nel viewer Esri WebGL compliant.
Ad esempio prendiamo uno dei tanti tool geoprocessing 3D che ArcGIS ci mette a disposizione: skyline e relativa skyline barrier. Potremmo generare le feature class e caricarle al volo in un sxd per generare la scene. Le skyline sono utilizzate per, ad esempio, analizzare gli spazi aerei, per le valutazioni di impatto ambientale e a supporto di altre analisi.

Qui possiamo vedere un esempio:


Ma potremmo anche inserire l'animazione negli specchi d'acqua (water shader) semplicemente aggiungendo al nome del layer un suffisso (per maggiori dettagli vedere qui).



Qui potete vedere una pagina dimostrativa di creazione di una scena generando la skyline e la skyline barrier indicando degli osservatori sulla mappa utilizzando una SOE ArcGis Server. Una volta creata la scene (in questo caso circa 60 secondi) comparirà un toaster in basso a destra con il link della scena.

Nel tool di skyline possiamo anche indicare anche una o più feature class da utilizzare come ostacoli (tipicamente edifici). In questo caso possiamo impostare osservatori anche sopra gli edifici calcolando la quota tramite l'intersezione dell'IRay con la multipatch.



            IVector3D vector = new Vector3DClass();
            vector.SetComponents(0, 0, -1);
            int idObserver = 0;
            bool isAddObserver = false;
            bool isAddOnBuildings;
            foreach (IPoint p in points)
            {
                try
                {
                    if ((p == null) || (p.IsEmpty))
                    {
                        continue;
                    }
 
                    IRay ray = new RayClass();
                    ray.Origin = GeometryUtilities.ConstructPoint3D(p.X, p.Y, 1000000.0);
                    ray.Vector = vector;
 
                    isAddOnBuildings = false;
 
                    if (featureClassObstacles != null)
                    {
                        IFeatureCursor featureCursor = null;
                        try
                        {
                            featureCursor = featureClassObstacles.Search(nulltrue);
 
                            IFeature feature = null;
                            while ((feature = featureCursor.NextFeature()) != null)
                            {
                                IGeometry g = feature.ShapeCopy;
                                if (ray.Intersects(g))
                                {
                                    IPoint firstIntersectionPoint = new PointClass();
                                    ray.QueryFirstIntersection(g, firstIntersectionPoint);
                                    if (!firstIntersectionPoint.IsEmpty)
                                    {
                                        IFeature featureObserver = featureClassObserver.CreateFeature();
                                        firstIntersectionPoint.Z += offset;
                                        featureObserver.Shape = firstIntersectionPoint;
                                        idObserver++;
                                        featureObserver.set_Value(idxIdObserver, idObserver);
                                        featureObserver.Store();
                                        isAddObserver = true;
                                        isAddOnBuildings = true;
                                        break;
                                    }
 
                                }
                            }
                        }
                        catch
                        {
                            throw;
                        }
                        finally
                        {
                            Marshal.FinalReleaseComObject(featureCursor);
                        }
                    }
 
                    if (!isAddOnBuildings)
                    {
                        //Get the column and row by giving x,y coordinates in a map space.
                        int col = raster.ToPixelColumn(p.X);
                        int row = raster.ToPixelRow(p.Y);
                        //Get the value at first band.
                        object pixelValue = raster.GetPixelValue(0, col, row);
                        
                        if (pixelValue != null)
                        {
                            double pixel = Convert.ToDouble(pixelValue);
                            IFeature featureObserver = featureClassObserver.CreateFeature();
                            featureObserver.Shape = GeometryUtilities.ConstructPoint3D(p.X, p.Y, pixel + offset);
                            idObserver++;
                            featureObserver.set_Value(idxIdObserver, idObserver);
                            featureObserver.Store();
                            isAddObserver = true;
                            continue;
                        }
                    }
 
                }
                catch
                {
                }
            
            }
 
 
            if (!isAddObserver)
            {
                throw new Exception("Observer not found!");
            }

Qui potete vedere la pagina dimostrativa.


Ora la palla a voi per crearvi modelli o utilizzare analisi 2D/3D da visualizzare nel viewer.