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;
}