///Zooms to the geographic extent of the selected features. Using this method ensures that all the selected features are displayed on the screen.
///
///An IGlobe interface
///
///
public void ZoomToSelectedGlobeFeatures(ESRI.ArcGIS.GlobeCore.IGlobe globe)
{ESRI.ArcGIS.GlobeCore.IGlobeDisplay globeDisplay = globe.GlobeDisplay;ESRI.ArcGIS.Analyst3D.ISceneViewer sceneViewer = globeDisplay.ActiveViewer;ESRI.ArcGIS.Analyst3D.ICamera camera = sceneViewer.Camera;ESRI.ArcGIS.GlobeCore.IGlobeCamera globeCamera = (ESRI.ArcGIS.GlobeCore.IGlobeCamera)camera; // Explicit CastESRI.ArcGIS.Analyst3D.IScene scene = globeDisplay.Scene;ESRI.ArcGIS.Carto.IEnumLayer enumLayer = scene.get_Layers(null, true);ESRI.ArcGIS.Geometry.IEnvelope envelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();envelope.SetEmpty();ESRI.ArcGIS.Geometry.IEnvelope layersExtentEnvelope = new ESRI.ArcGIS.Geometry.EnvelopeClass();layersExtentEnvelope.SetEmpty();ESRI.ArcGIS.Geometry.IZAware ZAware = (ESRI.ArcGIS.Geometry.IZAware)envelope; // Explicit CastZAware.ZAware = (true);ESRI.ArcGIS.Geodatabase.ISpatialFilter spatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();ESRI.ArcGIS.Geometry.ISpatialReference spatialReference = scene.SpatialReference;System.Boolean haveFeatures = false;enumLayer.Reset();ESRI.ArcGIS.Carto.ILayer layer;while ((layer = enumLayer.Next()) != null){if (layer == null)break;if (layer is ESRI.ArcGIS.Carto.IFeatureLayer){ESRI.ArcGIS.Carto.IFeatureLayer featureLayer = (ESRI.ArcGIS.Carto.IFeatureLayer)layer; // Explicit CastESRI.ArcGIS.Carto.IFeatureSelection featureSelection = (ESRI.ArcGIS.Carto.IFeatureSelection)layer; // Explicit CastESRI.ArcGIS.Geodatabase.ISelectionSet selectionSet = featureSelection.SelectionSet;ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass = featureLayer.FeatureClass;System.String shapeField = featureClass.ShapeFieldName;spatialFilter.GeometryField = shapeField;spatialFilter.set_OutputSpatialReference(shapeField, spatialReference);// The next 2 lines of code are different from many other ArcObjects programming techniques in that the // ICursor Interface variable 'cursor' is initialized to a Null value. It is set by reference with the // call to the Search method; hence the need for the 'out' argument (see MSDN for more information).ESRI.ArcGIS.Geodatabase.ICursor cursor;selectionSet.Search(spatialFilter, true, out cursor);ESRI.ArcGIS.Geodatabase.IFeatureCursor featureCursor = (ESRI.ArcGIS.Geodatabase.IFeatureCursor)cursor; // Explicit CastSystem.Boolean getLayerExtent = true;ESRI.ArcGIS.Geodatabase.IFeature feature; // Automatically initialized to null. Used to test existence of a feature in the featureCursorwhile ((feature = featureCursor.NextFeature()) != null){ESRI.ArcGIS.Geometry.IGeometry geometry = feature.Shape;ESRI.ArcGIS.Geometry.IEnvelope featureExtent = geometry.Envelope;envelope.Union(featureExtent);haveFeatures = true;if (getLayerExtent){ESRI.ArcGIS.Geodatabase.IGeoDataset geoDataset = (ESRI.ArcGIS.Geodatabase.IGeoDataset)featureLayer; // Explicit Castif (geoDataset != null){ESRI.ArcGIS.Geometry.IEnvelope layerExtent = geoDataset.Extent;layersExtentEnvelope.Union(layerExtent);}getLayerExtent = false;}}}}// Since the size of points is very small, we use a special case to zoom in closerSystem.Double width = envelope.Width;System.Double height = envelope.Height;if (width == 0.0 && height == 0.0) // Must be a single point, Zoom to 1 x 1 degree area,{ // or lets say 1/20th of layer extent, whichever is smallest.System.Double dim = 1.0;System.Boolean bEmpty = layersExtentEnvelope.IsEmpty;if (!bEmpty){System.Double layerWidth = layersExtentEnvelope.Width;System.Double layerHeight = layersExtentEnvelope.Height;System.Double layerDim = System.Math.Max(layerWidth, layerHeight) * 0.05;if (layerDim > 0.0)dim = System.Math.Min(1.0, layerDim);}System.Double xMin = envelope.XMin;System.Double yMin = envelope.YMin;ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();point.X = xMin;point.Y = yMin;envelope.Width = dim;envelope.Height = dim;envelope.CenterAt(point);}else if (width == 0.0 || height == 0.0){System.Double maxDim = System.Math.Max(width, height);envelope.Width = maxDim;envelope.Height = maxDim;}globeCamera.SetToZoomToExtents(envelope, globe, sceneViewer);sceneViewer.Redraw(true);