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(null, true); 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.