用AE实现google earth的导航与跟踪条控制地图比例

在坛子上问了两天,结果没有人回答,心寒,没办法,靠自己。。嘿嘿,最后竟然也让我解决了。。开心一个。

下面把代码贴一下。

 

首先是地图向上,向下,向左,向右代码的实现:

 private void btright_Click(object sender, EventArgs e)
        {
            IEnvelope pEnv = new EnvelopeClass();
            double Xcenter = axMapControl.Extent.XMax - axMapControl.Extent.Width * 0.4;
            double Ycenter = axMapControl.Extent.YMax - axMapControl.Extent.Height / 2;
            IPoint pPoint = new PointClass();
            pPoint.X = Xcenter;
            pPoint.Y = Ycenter;
            axMapControl.CenterAt(pPoint);
        }

        private void btleft_Click(object sender, EventArgs e)
        {
            IEnvelope pEnv = new EnvelopeClass();
            double Xcenter = axMapControl.Extent.XMax - axMapControl.Extent.Width * 0.6;
            double Ycenter = axMapControl.Extent.YMax - axMapControl.Extent.Height / 2;
            IPoint pPoint = new PointClass();
            pPoint.X = Xcenter;
            pPoint.Y = Ycenter;
            axMapControl.CenterAt(pPoint);
         
        }

        private void btdown_Click(object sender, EventArgs e)
        {
            IEnvelope pEnv = new EnvelopeClass();
            double Xcenter = axMapControl.Extent.XMax - axMapControl.Extent.Width / 2;
            double Ycenter = axMapControl.Extent.YMax - axMapControl.Extent.Height * 0.6;
            IPoint pPoint = new PointClass();
            pPoint.X = Xcenter;
            pPoint.Y = Ycenter;
            axMapControl.CenterAt(pPoint);
        }

        private void btup_Click(object sender, EventArgs e)
        {
            IEnvelope pEnv = new EnvelopeClass();
            double Xcenter = axMapControl.Extent.XMax - axMapControl.Extent.Width / 2;
            double Ycenter = axMapControl.Extent.YMax - axMapControl.Extent.Height * 0.4;
            IPoint pPoint = new PointClass();
            pPoint.X = Xcenter;
            pPoint.Y = Ycenter;
            axMapControl.CenterAt(pPoint);
        }

其实原理是很简单的,向上的话,就是把地图中心的Y值加大一定的数值。(写到这里的时候突然发现我的实现方法太麻烦了。我的实现方法是获取当前视图的最大X值和最大Y值,然后通过计算X,Y与新的地图中心X,Y值的关系,确定出新的地图中心的X,Y值,然后定一个点,把这个X,Y值赋给它,最后利用MapControl的CenterAt(IPoint)方法即可。)

 

接下来实现的是利用TrackBar工具,控制地图的比例尺变化。

由于mapControl支持滚轮缩放,所以还要考虑一下,当用户进行滚轮缩放,或者是利用zoomin,zoomout工具进行地图缩放操作时,TrackBar的value值也要相应的有变化。

        private void axMapControl_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
        {
            //限制地图的最大最小比例,因为滚轮能够将地图的比例无限放大或放小,对于实际应用不利。
            double nowscale = axMapControl.MapScale;
            if (nowscale > 800000)
            {
                axMapControl.MapScale = 800000;
            }
            if (nowscale < 100)
            {
                axMapControl.MapScale = 100;
            }
            if (e.sizeChanged == true)
            //地图比例尺变动时,跟踪条的值跟着变化,各个比例我是根据我的底图进行设定的。
            {
                if (nowscale <800)
                {
                    scalebar.Value = 10;

                }
                else if (nowscale >= 800 && nowscale < 1500)
                {
                    scalebar.Value = 9;
                }
                else if (nowscale >= 1500 && nowscale < 3000)
                {
                    scalebar.Value =8;
                }
                else if (nowscale >= 3000 && nowscale < 6500)
                {
                    scalebar.Value = 7;
                }
                else if (nowscale >= 6500 && nowscale < 20000)
                {
                    scalebar.Value = 6;
                }
                else if (nowscale >= 20000 && nowscale < 35000)
                {
                    scalebar.Value =5;
                }
                else if (nowscale >=35000 && nowscale < 75000)
                {
                    scalebar.Value =4;
                }
                else if (nowscale >= 75000 && nowscale <100000)
                {
                    scalebar.Value =3;
                }
                else if (nowscale >= 100000 && nowscale < 200000)
                {
                    scalebar.Value = 2;
                }
                else if (nowscale >= 200000 && nowscale < 300000)
                {
                    scalebar.Value = 1;
                }
                else if (nowscale >= 300000)
                {
                    scalebar.Value = 0;
                }
            }
        
            cbscale.Text = "1:"+axMapControl.MapScale.ToString("F2");//在combobox中显示出当前的地图比例尺
        }

 

以上就实现了地图比例变化时,跟踪条的值相应的变化。接下来要实现的,是控制跟踪条的值,来控制地图比例尺。

由于在上一个阶段中,地图比例尺变化时,会触动Trackbar的valuechangedg事件,而利用Trackbar来控制地图比例尺时,也是要在Trackbar的valuechanged事件中编写,为了避免干扰,所以设一个判断语句,当在Trackbar上发生鼠标点击事件时,才会触动“由跟踪条值变化控制地图比例尺变化”的代码。

   bool i;

   private void scalebar_MouseDown(object sender, MouseEventArgs e)
        {
            i = true;

        }

 private void axMapControl_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e)
        {
            i = false;
        }

 

  private void scalebar_ValueChanged(object sender, EventArgs e)
        {
          if (i == true)
            {
                if (scalebar.Value == 0)
                {
                    axMapControl.MapScale = 300000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 1)
                {
                    axMapControl.MapScale = 200000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 2)
                {
                    axMapControl.MapScale = 100000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 3)
                {
                    axMapControl.MapScale = 75000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 4)
                {
                    axMapControl.MapScale = 35000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 5)
                {
                    axMapControl.MapScale = 20000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 6)
                {
                    axMapControl.MapScale = 10000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 7)
                {
                    axMapControl.MapScale = 5000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 8)
                {
                    axMapControl.MapScale = 2000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value == 9)
                {
                    axMapControl.MapScale = 1000;
                    axMapControl.ActiveView.Refresh();
                }
                else if (scalebar.Value ==10)
                {
                    axMapControl.MapScale = 800;
                    axMapControl.ActiveView.Refresh();
                }
              
            }
        }
以上就是整个事件的实现代码。写得很烦琐,肯定会有更精简的方法的,欢迎各位提出。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 自编码器(Autoencoder,简称AE)是一种无监督学习算法,它可以通过学习输入数据的特征来实现数据的降维和压缩。在运动跟踪领域,使用AE可以将图像序列进行压缩,从而减少跟踪时需要处理的数据量,缩短跟踪的时长。 具体来说,使用AE跟踪运动的步骤如下: 1.将图像序列输入到AE中进行训练,训练AE的目的是将图像序列压缩成较小的特征向量。 2.使用训练好的AE对新的图像序列进行编码,得到它们的特征向量。 3.使用跟踪算法对特征向量进行跟踪,而不是对原始图像进行跟踪。由于特征向量的维度较低,跟踪算法可以更快速地处理它们。 4.根据跟踪结果反向解码特征向量,得到对应的图像序列。 使用AE跟踪运动可以缩短跟踪的时长,但需要注意的是,AE的训练和编码过程可能会消耗较多的计算资源和时间。因此,在实际应用中需要权衡时间和精度的关系,选择合适的跟踪算法和AE模型。 ### 回答2: AE跟踪运动是指通过使用After Effects软件中的跟踪功能,将一个或多个图层与视频画面中的运动目标进行匹配,从而达到稳定追踪或添加特效的效果。 要缩短AE跟踪运动的时长,可以采取以下措施: 1. 选择合适的跟踪点:在运动开始之前,应该选择一个在整个场景中都能清晰可见且与目标物体运动一致的特征点,这样能够使跟踪更加精确快速。 2. 缩小跟踪区域:对于大规模的运动目标,可以在视频中选择一个较小的区域来进行跟踪,从而减少计算量,提高处理速度。 3. 使用高质量的视频:如果视频的质量较差,包含噪点、模糊或失真,将会增加跟踪的困难程度。因此,使用高质量的视频素材可以减少跟踪的时间。 4. 指定参考帧:对于较长的视频,可以手动指定参考帧,使软件只对该帧进行跟踪,从而减少计算量。 5. 使用GPU加速:在AE的设置中启用GPU加速可以提高软件的性能,加快跟踪的速度。 6. 调整跟踪设置:根据具体的跟踪需求,调整跟踪设置,如追踪方法、追踪对像的大小、搜索半径等参数,以获得更准确、更快速的跟踪结果。 综上所述,通过正确选择跟踪点、缩小跟踪区域、使用高质量的视频、指定参考帧、启用GPU加速以及调整跟踪设置,可以帮助缩短AE跟踪运动的时长,同时提高跟踪的准确性和效率。 ### 回答3: AE跟踪运动是指通过自动化软件Adobe After Effects中的跟踪功能,可以追踪视频画面中的动态物体,以便进行后续特效处理。在跟踪的过程中,减少跟踪的时长是非常重要的,以下是一些方法可以缩短AE跟踪运动的时长。 首先,选择合适的跟踪方法。AE提供了多种跟踪方法,包括点跟踪、平面跟踪和轨道跟踪等。根据视频画面的特点,选择最适合的跟踪方法。有时候,使用简单的点跟踪就可以满足需求,而不需要使用更复杂的跟踪方法。 其次,限制跟踪区域。在进行跟踪之前,可以通过遮罩或者裁剪等方式,限制跟踪的区域。这样可以减少AE在处理过程中的运算量,提高跟踪的速度。 另外,调整关键帧的距离。在跟踪过程中,可以在时间轴上调整关键帧的距离。将相邻的关键帧靠近,AE会更快地计算运动轨迹,从而减少跟踪的时间。 还可以降低曝光时间。在某些场景下,AE跟踪的时长可能受到曝光时间的限制。如果将曝光时间调低,可以减少画面中的动态变化,从而减少跟踪的时长。 最后,使用GPU加速。AE可以利用计算机的GPU进行加速处理。通过启用GPU加速选项,可以提高AE跟踪速度。确保计算机的硬件和软件都能够支持GPU加速功能。 综上所述,通过选择合适的跟踪方法、限制跟踪区域、调整关键帧的距离、降低曝光时间和使用GPU加速等方法,可以缩短AE跟踪运动的时长,提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值