ArcGlobe定位

来源:互联网 发布:cntv直播软件 编辑:程序博客网 时间:2024/06/05 07:54

   private void 定位要素ToolStripMenuItem_Click(object sender, EventArgs e)

        {
            try
            {
                IScene pScene = axGlobeControl1.Globe.GlobeDisplay.Scene;
                IFeatureLayer pFlyr = null;
                for(int i=0;i<pScene.LayerCount;++i)
                {
                    if (pScene.get_Layer(i).Name == "绿化")//要定位的图层
                    {
                        pFlyr = pScene.get_Layer(i) as IFeatureLayer;
                        break;
                    }
                }
                IFeature pFteature = pFlyr.FeatureClass.GetFeature(1384);//定位ObjectID=1384元素


                ESRI.ArcGIS.Analyst3D.ICamera camera = axGlobeControl1.Globe.GlobeDisplay.ActiveViewer.Camera;
                ESRI.ArcGIS.GlobeCore.IGlobeCamera globeCamera = (ESRI.ArcGIS.GlobeCore.IGlobeCamera)camera; 


                IMap pMap = axGlobeControl1.Globe as IMap;
                pMap.SelectFeature(pFlyr, pFteature);


                ((IActiveView)axGlobeControl1.Globe).PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);


                ZoomToGeometry(axGlobeControl1.Globe, pFteature.Shape, 3);
                
            }
            catch { }

        }


        public void ZoomToGeometry(IGlobe pGlobe, IGeometry pGeo, double doubleDuration)
        {
            pGeo = ProjectGeometryGeo(pGeo);
            IEnvelope pEnvelope = null;
            pEnvelope = pGeo.Envelope;
            ZoomToSelectedGlobeFeatures(pGlobe, pEnvelope);
        }

 public void ZoomToSelectedGlobeFeatures(ESRI.ArcGIS.GlobeCore.IGlobe globe,IEnvelope pEv)
        {
            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;
            ESRI.ArcGIS.Analyst3D.IScene scene = globeDisplay.Scene;


            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;
            ZAware.ZAware = (true);


            envelope.Union(pEv);
            IFeatureLayer pFlyr = null;
            for (int i = 0; i < scene.LayerCount; ++i)
            {
                if (scene.get_Layer(i).Name == "绿化")
                {
                    pFlyr = scene.get_Layer(i) as IFeatureLayer;
                    break;
                }
            }
            ESRI.ArcGIS.Geodatabase.IGeoDataset geoDataset = (ESRI.ArcGIS.Geodatabase.IGeoDataset)pFlyr;
            if (geoDataset != null)
            {
                ESRI.ArcGIS.Geometry.IEnvelope layerExtent = geoDataset.Extent;
                layersExtentEnvelope.Union(layerExtent);
            }


            System.Double width = envelope.Width;
            System.Double height = envelope.Height;
            if (width == 0.0 && height == 0.0)
            {
                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 * 0.8;
                envelope.Height = dim * 0.8;
                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);
        }


        public static IGeometry ProjectGeometryGeo(IGeometry pGeo)
        {
            //如果是地理坐标系,则投影到投影坐标系
            if (pGeo.SpatialReference is IProjectedCoordinateSystem)
            {
                ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironment();
                IGeographicCoordinateSystem pcs = srFactory.CreateGeographicCoordinateSystem(4326);     //投影到 Mercator 坐标系
                pGeo.Project(pcs);
            }
            return pGeo;
        }


        public static IGeometry ProjectGeometry(IGeometry pGeo)
        {
            //如果是地理坐标系,则投影到投影坐标系
            if (pGeo.SpatialReference is IGeographicCoordinateSystem)
            {
                ISpatialReferenceFactory srFactory = new SpatialReferenceEnvironment();
                IProjectedCoordinateSystem pcs = srFactory.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_World_Mercator);      //投影到 Mercator 坐标系
                pGeo.Project(pcs);
            }
            return pGeo;
        }