首页 / 浏览问题 / 桌面GIS / 问题详情
三维折线GeoLine3D按等分取线上的点
66EXP 2017年04月25日
三维组件开发一个动态可视域的功能,比如画一条折线(由5个点组成),写了一个timer,想要根据线上的点动态设置viewshed3D.ViewerPosition的位置,以达到动态可视域的功能,可是不知道如何获取GeoLine3D线上的点(比如100等分),请赐教.

1个回答

您好,一个GeoLine3D的节点可以通过GeoLine3D.item获取,示例代码如下所示:

for (int i = 0; i < geoLine3D.PartCount; i++)
            {
                Point3Ds point3Ds = geoLine3D[i];

                foreach (Point3D point3D in point3Ds)
                {
                    // point3D就是取到的节点
                }
            }
11EXP 2017年04月25日
非常感谢
但是这样写只能取出线上的节点,比如一条折线有5个点.并不能模拟动态可视域分析效果,我需要的是线上100等分(比如)的点,我随着时间推移,从第0个点一直取到第100个点,这样才能模拟动态可视域分析效果.
不客气。
不好意思,目前的方法还取不了, 除非您这个线本身就有100个节点,可以转二维的线先打断。
您好,做动态可视域你这个思路也是一个办法,不过有个更好的思路做动态可视域分析。

要用到节点动画配合才行。

具体思路:

您可以在场景中添加一个KML图层(Layer3DKML),再添加一个人的模型(3ds,sgm等格式),然后获取这个模型(Feature3D),再获取模型的节点动画(NodeAnimation),对节点动画设置一个运动轨迹(NodeAnimation.SetTrack(GeoLine3D)),然后让节点动画运动起来(NodeAnimation.IsEnabled = true)。节点动画有个属性(NodeAnimation.Postition)可以实时获取空间位置。您在节点动画事件里面实时获取这个位置,并修改您的Viewshed3D的ViewerPosition属性就达到动态可视域分析的目的啦。也不用分割线了哈。
英雄所见略同,我正打算这样做碰碰运气,你们就回复说可以了.非常好,超图的技术支持比ESRI强.
感谢您的支持
经测试,通过以上节点动画方式,可以实时获取节点动画的位置,并设置Viewshed3D的ViewerPosition属性,但是当一条折线(node1-node2-...-node5)有多个节点时,需要设置Viewshed3D的目标点(通过SetDistDirByPoint方法),可是不知道如何根据折线的节点来实时按顺序设置目标点,比如当节点动画在0-1段时,设置目标点为node1,在1-2段时,设置目标点为node2.
为啥还获取折线的节点?

直接通过节点动画来获取线上的节点啊。
我的场景如下:

1,对节点动画设置一个运动轨迹(NodeAnimation.SetTrack(GeoLine3D)),运动轨迹为一条折线,由5个节点组成(node1-node2-...-node5)

2,播放节点动画,并根据NodeAnimation.Postition设置Viewshed3D的ViewerPosition,但是可视域一直是朝着同一个方向的.而我想要的是可视域方向是沿着折线,所以需要设置Viewshed3D的目标点(通过SetDistDirByPoint方法)

另外一个问题是,如果开启第一人称模式及场景随视角移动?(这些功能在桌面有)
(1)您用了节点动画来改变位置,就没必要关心指定的轨迹的的节点了。

(2)视角也是需要调整的,桌面应该是另外写算法实现的,也是基于用到的类也是Viewshed3D,实时调整SetDistDirByPoint。
1,有必要,因为如果运动轨迹是折线的话,我需要根据下一个节点设置目标点,这样扇区才能以折线对折,计算分析出来的结果才是正确的.

2,第一人称模式及场景随视角移动如何通过组件代码实现?能给些思路或例子吗
目前没有哈,想到了告诉您。
...