如何在ArcGIS Engine的Globe中进行三维定位

来源:互联网 发布:西安网络电视台 编辑:程序博客网 时间:2024/06/05 22:55

有不少初学者想知道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未必稳妥。

原创粉丝点击