有不少初学者想知道ArcGIS Engine的GlobeControl中如何实现类似于ArcGlobe里鼠标三维定位的功能,也就是如何获得鼠标点击位置的X,Y,Z。
这个问题要分两个步骤实现,首先是通过IGlobeDisplay.Locate方法获得屏幕坐标的X,Y对应的地理坐标X,Y,第二步是通过地理坐标X,Y求解到地形影响下对应的高程值。
代码如下:
public static IPoint GlobeToDD(IGlobeDisplay globeDisplay, int X, int Y, bool maxResolution)
{
IPoint point;
System.Object objectOwner;
System.Object objectObject;
globeDisplay.Locate(globeDisplay.ActiveViewer, X, Y, false, true, out point, out objectOwner, out objectObject); //获得屏幕坐标的X,Y对应的地理坐标点point
if (point == null)
{
return null;
}
else
{
if (point.IsEmpty == true)
{
return null;
}
else
{
point.Z = GetGlobeElevation(globeDisplay, point.X, point.Y, maxResolution); //结合地形求解该点对应的Z值
return point;
}
}
}
//结合地形求解该点对应的Z值的函数
public static double GetGlobeElevation(IGlobeDisplay globeDisplay, double longitude, double latitude, bool maxResolution)
{
IUnitConverter unitConverter = new UnitConverterClass();
double doubleZ = 0;
globeDisplay.GetSurfaceElevation(longitude, latitude, maxResolution, out doubleZ);
return unitConverter.ConvertUnits(doubleZ, esriUnits.esriMeters, globeDisplay.Globe.GlobeUnits); //高程值单位转换
}
其实Globe开发中还是有不少细节要注意的,比如获得了对应点的高程值以后,你需要考虑一下返回的是什么单位,默认情况下返回高程单位是千米,示例代码中利用IUnitConverter单位转换类将其转换为米。这里也不建议通过简单的乘以1000的方法进行单位转换,因为不排除该场景之前被设置成米或其他单位,盲目的乘以1000未必稳妥。