This document is archived and information here might be outdated. Recommended version. |
ArcObjects Help for .NET developers > ESRI.ArcGIS.Snippets > Snippets > Zoom to Selected Globe Features Snippet (ArcObjects .NET 10.4 SDK) |
Zooms to the geographic extent of the selected features. Using this method ensures that all the selected features are displayed on the screen.
///<summary>Zooms to the geographic extent of the selected features. Using this method ensures that all the selected features are displayed on the screen.</summary> /// ///<param name="globe">An IGlobe interface</param> /// ///<remarks></remarks> 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 Cast ESRI.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 Cast ZAware.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 Cast ESRI.ArcGIS.Carto.IFeatureSelection featureSelection=(ESRI.ArcGIS.Carto.IFeatureSelection)layer; // Explicit Cast ESRI.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 Cast System.Boolean getLayerExtent=true; ESRI.ArcGIS.Geodatabase.IFeature feature; // Automatically initialized to null. Used to test existence of a feature in the featureCursor while ((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 Cast if (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 closer System.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); }
'''<summary>Zooms to the geographic extent of the selected features. Using this method ensures that all the selected features are displayed on the screen.</summary> ''' '''<param name="globe">An IGlobe interface</param> ''' '''<remarks></remarks> Public Sub ZoomToSelectedGlobeFeatures(ByVal globe As ESRI.ArcGIS.GlobeCore.IGlobe) Dim globeDisplay As ESRI.ArcGIS.GlobeCore.IGlobeDisplay=globe.GlobeDisplay Dim sceneViewer As ESRI.ArcGIS.Analyst3D.ISceneViewer=globeDisplay.ActiveViewer Dim camera As ESRI.ArcGIS.Analyst3D.ICamera=sceneViewer.Camera Dim globeCamera As ESRI.ArcGIS.GlobeCore.IGlobeCamera=CType(camera, ESRI.ArcGIS.GlobeCore.IGlobeCamera) ' Explicit Cast Dim scene As ESRI.ArcGIS.Analyst3D.IScene=globeDisplay.Scene Dim enumLayer As ESRI.ArcGIS.Carto.IEnumLayer=scene.Layers(Nothing, True) Dim envelope As ESRI.ArcGIS.Geometry.IEnvelope=New ESRI.ArcGIS.Geometry.EnvelopeClass envelope.SetEmpty() Dim layersExtentEnvelope As ESRI.ArcGIS.Geometry.IEnvelope=New ESRI.ArcGIS.Geometry.EnvelopeClass layersExtentEnvelope.SetEmpty() Dim ZAware As ESRI.ArcGIS.Geometry.IZAware=CType(Envelope, ESRI.ArcGIS.Geometry.IZAware) ' Explicit Cast ZAware.ZAware=(True) Dim spatialFilter As ESRI.ArcGIS.Geodatabase.ISpatialFilter=New ESRI.ArcGIS.Geodatabase.SpatialFilterClass Dim spatialReference As ESRI.ArcGIS.Geometry.ISpatialReference=scene.SpatialReference Dim haveFeatures As System.Boolean=False enumLayer.Reset() Dim layer As ESRI.ArcGIS.Carto.ILayer layer=enumLayer.Next() While layer IsNot Nothing If TypeOf layer Is ESRI.ArcGIS.Carto.IFeatureLayer Then Dim featureLayer As ESRI.ArcGIS.Carto.IFeatureLayer=CType(layer, ESRI.ArcGIS.Carto.IFeatureLayer) ' Explicit Cast Dim featureSelection As ESRI.ArcGIS.Carto.IFeatureSelection=CType(layer, ESRI.ArcGIS.Carto.IFeatureSelection) ' Explicit Cast Dim selectionSet As ESRI.ArcGIS.Geodatabase.ISelectionSet=featureSelection.SelectionSet Dim featureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass=featureLayer.FeatureClass Dim shapeField As System.String=featureClass.ShapeFieldName spatialFilter.GeometryField=shapeField spatialReference=spatialFilter.OutputSpatialReference(shapeField) ' The next 2 lines of code are different from many other ArcObjects programming techniques in that the ' ICursor Interface variable 'cursor' is initialized to Nothing. It is set by reference with the ' call to the Search method. Dim cursor As ESRI.ArcGIS.Geodatabase.ICursor=Nothing selectionSet.Search(spatialFilter, True, cursor) Dim featureCursor As ESRI.ArcGIS.Geodatabase.IFeatureCursor=CType(cursor, ESRI.ArcGIS.Geodatabase.IFeatureCursor) ' Explicit Cast Dim getLayerExtent As System.Boolean=True Dim feature As ESRI.ArcGIS.Geodatabase.IFeature feature=featureCursor.NextFeature While (feature) IsNot Nothing Dim geometry As ESRI.ArcGIS.Geometry.IGeometry=feature.Shape Dim featureExtent As ESRI.ArcGIS.Geometry.IEnvelope=geometry.Envelope envelope.Union(featureExtent) haveFeatures=True If getLayerExtent Then Dim geoDataset As ESRI.ArcGIS.Geodatabase.IGeoDataset=CType(featureLayer, ESRI.ArcGIS.Geodatabase.IGeoDataset) ' Explicit Cast If Not (geoDataset Is Nothing) Then Dim layerExtent As ESRI.ArcGIS.Geometry.IEnvelope=geoDataset.Extent layersExtentEnvelope.Union(layerExtent) End If getLayerExtent=False End If feature=featureCursor.NextFeature ' Iterate through the next feature End While End If ' typeof layer=enumLayer.Next() ' Iterate through the next layer End While ' Since the size of points is very small, we use a special case to zoom in closer Dim width As System.Double=envelope.Width Dim height As System.Double=envelope.Height ' Must be a single point, Zoom to 1 x 1 degree area, or lets say 1/20th of layer extent, whichever is smallest. If width=0 AndAlso height=0 Then Dim dimension As System.Double=1 Dim bEmpty As System.Boolean=layersExtentEnvelope.IsEmpty If Not bEmpty Then Dim layerWidth As System.Double=layersExtentEnvelope.Width Dim layerHeight As System.Double=layersExtentEnvelope.Height Dim layerDim As System.Double=System.Math.Max(layerWidth, layerHeight) * 0.05 If layerDim > 0 Then dimension=System.Math.Min(1, layerDim) End If End If Dim xMin As System.Double=envelope.XMin Dim yMin As System.Double=envelope.YMin Dim point As ESRI.ArcGIS.Geometry.IPoint=New ESRI.ArcGIS.Geometry.PointClass point.X=xMin Point.Y=yMin envelope.Width=dimension envelope.Height=dimension envelope.CenterAt(Point) Else If width=0 OrElse height=0 Then Dim maxDim As System.Double=System.Math.Max(width, height) envelope.Width=maxDim envelope.Height=maxDim End If End If globeCamera.SetToZoomToExtents(Envelope, globe, sceneViewer) sceneViewer.Redraw(True) End Sub