ArcGlobe二次开发,鼠标拾取点转换成地理坐标错误
第一次发帖,不知道有什么要注意的,有什么不足请大家多多指教。C#+ArcEngine Globe二次开发,通过鼠标拾取点转换得到地理坐标。看帮助文档和别人基本都是这么做的,直接利用WindowToGeographic函数就能从二维屏幕坐标转换到三维空间大地坐标,我的代码如下:
IGlobeViewUtil globeViewUtil = axGlobeControl1.GlobeCamera as IGlobeViewUtil;
IGlobeDisplay pGlobeDisplay = axGlobeControl1.GlobeDisplay;
double dLon = 0;
double dLat = 0;
double dAlt = 0;
globeViewUtil.WindowToGeographic(pGlobeDisplay, pGlobeDisplay.ActiveViewer, e.x, e.y,
true, out dLon, out dLat, out dAlt);//由屏幕获取经纬度和高程
这里我有点儿疑问。鼠标在屏幕上点击可获取一个二维坐标,映射到三维场景中其实就从观察点到屏幕坐标的一条射线,转换到三维空间不可能是一个特定的点,除非给定深度值或者说能严格限定视线长度的条件。我不知道这个函数是怎么确定的,猜想可能是得到视线和三维地形的交点,也就是说拾取的这个点在地面上。
但是我现在做这一步的时候,周围的地形高度都在100米左右,鼠标拾取的点地理坐标的高度有七百多米,使得相应的经纬度也成了错误的。如下图所示:
e是鼠标点取的位置(跟踪了下应该没问题),转换出来的应该是P的位置,但是实际上得到了P'的位置,由于高度不对,使得经纬度也有很大的偏差。直观的感受就是视线长度不对,还没有延伸到和地面的交点上。中间只用了一个函数,一直不知道为什么会出现这个问题。是不是有什么地方需要设置?菜鸟求指导,先谢谢了。 ArcEngine ArcGlobe WindowToGeographic 鼠标拾取 三维点 --------------------编程问答-------------------- 这个问题也是我比较关注的! --------------------编程问答--------------------
终于有一个人回我了,好开心~~~
你也遇到过类似问题吗? --------------------编程问答-------------------- 你如果了解3维空间的鼠标拾取事件就知道:
鼠标拾取点,就是二维坐标的屏幕鼠标点击点,垂直投影下的一条射线,射线(垂直于屏幕的平面法向量)有一系列的深度,拾取点就是这条射线与3维空间物体(在此处只有地形一种物体)第一个相交的点的3维坐标(X,Y,Z),即是(LON,LAT,HEIGHT),也就是输出值。
其实射线与物体(3维空间)相交可能不止一个点(如果只有一个地形地球,就有2个焦点),取第一个交点做为返回值;
如果还有其他的三维物体,相交就有可能有多个交点(这些交点会存储在一个path路径上(交点数组队列))返回值同样是默认为第一个交点;
如果你的3维空间还有如建筑物等,那这个默认的返回值就不是你想得到的地形的交点了;
但与地形交点已经存储在路径当中,可以通过其他方式排出,就可得到地形的正确交交点;
没有用过ArcEngine Globe不知道有没有排出如相交对象的函数;或是函数设置,通过给定路径当中的第几个点参数,等等...
--------------------编程问答--------------------
谢谢~
场景里没有其他的建筑物遮挡,人能直接看到地面。不知道是什么问题…… --------------------编程问答-------------------- 有几种可能性:
1.地形文件整体高程有偏移量(如加载是不是在(0,0,0),而是(0,0,Z);
2.有其它的物体:(在此高程位置)
A.如空间的点(比方是SHP文件的特征feature的图形、线、或者点)
B.如金子塔图片的组织图在此高度有设置图层;
C.有透明通道的图在此高程位置,如叠加的云层图等等
D.其它的不明显物体等等; --------------------编程问答--------------------
杨老师也有时间来这里逛啊
补充:企业软件 , 地理信息系统