zoukankan      html  css  js  c++  java
  • C# 调用 Google Earth Com API开发(四)

    原文地址:http://www.cnblogs.com/wpwen/archive/2009/05/25/1489144.html

    本篇继续介绍Google Earth COM API开发的基础知识,相对第三篇的改进如下:

    1)增加鼠标滚轮支持,可以实现放大、缩小。此功能利用上一篇提供的HookAPI.dll实现

    2)读取PlaceMarks(Google Earth界面中的位置)并显示、隐藏

    3)读取所有图层,显示并隐藏

    下面,继续放代码:

    1、鼠标滚轮事件,实现放大、缩小

       1: ...
       2: // 放大
       3: private const long ZoomIn = 0x00780000;
       4: // 缩小
       5: private const long ZoomOut = 0xFF880000;
       6: ...
       7: mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel);
       8: ...
       9: /// <summary>
      10: /// 鼠标钩子。鼠标滚动事件
      11: /// </summary>
      12: /// <param name="sender"></param>
      13: /// <param name="e"></param>
      14: void mouseHook_MouseWheel(object sender, MouseEventArgs e)
      15: {
      16:     IntPtr hWnd = NativeMethods.WindowFromPoint(e.Location);
      17:     if (hWnd == this.GeRenderHWnd)
      18:     {
      19:         Point point = this.Control.PointToClient(e.Location);
      20:         // 如果鼠标位置在控件内部,则说明鼠标在GoogleEarth视图范围内进行了滚动
      21:         if (this.Control.ClientRectangle.Contains(point))
      22:         {
      23:             NativeMethods.PostMessage(GeRenderHWnd, (int)WM_MOUSE.WM_MOUSEWHEEL, e.Delta == 120 ? ZoomIn : ZoomOut, 0);
      24:         }
      25:     }
      26: }

    2、读取PlaceMarks

    Google Earth COM API中提供了两个读取PlaceMarks的函数。一个是GetTemporaryPlaces(),用来读取临时位置;另一个是GetMyPlaces(),用来读取自定义位置,即GoogleEarth中显示的“我的位置”。呵呵

       1: ...
       2: /// <summary>
       3: /// 显示位置“PlaceMarks”。位置分为两种,一种时TemporaryPlaces,另一种为MyPlaces
       4: /// </summary>
       5: protected void ShowPlaces()
       6: {
       7:     Thread.Sleep(500);
       8:     // 获取MyPlaces
       9:     FeatureGE myPlace = GeApp.GetMyPlaces();
      10:     // 获取临时位置
      11:     FeatureGE temporaryPlace = GeApp.GetTemporaryPlaces();
      12:     // 
      13:     List<FeatureGE> places = new List<FeatureGE>();
      14:     places.Add(myPlace);
      15:     places.Add(temporaryPlace);
      16:  
      17:     // 获取工具面板
      18:     GEToolPad toolPad = GetToolPad();
      19:     // 显示所有位置
      20:     toolPad.ShowPlaces(places);
      21: }
      22: ...
      23: /// <summary>
      24: /// 显示所有PlaceMarks(位置)
      25: /// </summary>
      26: /// <param name="places"></param>
      27: public void ShowPlaces(List<FeatureGE> places)
      28: {
      29:     if (this.InvokeRequired)
      30:     {
      31:         Action method = delegate {
      32:             InternalShowPlaces(places);
      33:         };
      34:  
      35:         try
      36:         {
      37:             this.Invoke(method);
      38:         }
      39:         catch { }
      40:     }
      41:     else
      42:     {
      43:         InternalShowPlaces(places);
      44:     }
      45: }
      46: /// <summary>
      47: /// 显示所有PlaceMarks(位置)。被ShowPlaces函数调用
      48: /// </summary>
      49: /// <param name="places"></param>
      50: protected void InternalShowPlaces(List<FeatureGE> places)
      51: {
      52:     this.tvPlaces.Nodes.Clear();
      53:  
      54:     if (places == null || places.Count <= 0)
      55:         return;
      56:  
      57:     foreach (FeatureGE place in places)
      58:     {
      59:         TreeNode node = new TreeNode(place.Name);
      60:         node.Checked = place.Visibility > 0;
      61:         node.Tag = place;
      62:  
      63:         ShowChildrenPlaces(place, node);
      64:  
      65:         node.Expand();
      66:  
      67:         this.tvPlaces.Nodes.Add(node);
      68:     }
      69: }
      70: /// <summary>
      71: /// 显示指定PlaceMark的子PlaceMark
      72: /// </summary>
      73: /// <param name="place">父PlaceMark</param>
      74: /// <param name="node">父节点</param>
      75: protected void ShowChildrenPlaces(FeatureGE place, TreeNode node)
      76: {
      77:     FeatureCollectionGE places = place.GetChildren();
      78:  
      79:     foreach (FeatureGE child in places)
      80:     {
      81:         TreeNode tn = new TreeNode(child.Name);
      82:         tn.Checked = child.Visibility > 0;
      83:         tn.Tag = child;
      84:  
      85:         ShowChildrenPlaces(child, tn);
      86:  
      87:         node.Nodes.Add(tn);
      88:     }
      89: }

    3、读取图层

       1: ...
       2: /// <summary>
       3: /// 显示图层
       4: /// </summary>
       5: protected void ShowLayers()
       6: {
       7:     Thread.Sleep(500);
       8:     // 获取所有图层信息
       9:     FeatureCollectionGE layers = GeApp.GetLayersDatabases();
      10:     // 获取工具面板
      11:     GEToolPad toolPad = GetToolPad();
      12:     // 显示所有图层
      13:     toolPad.ShowLayers(layers);
      14: }
      15: ...
      16: /// <summary>
      17: /// 将给定的图层集合显示在“图层”选项卡的树形控件中
      18: /// </summary>
      19: /// <param name="layers">图层集合</param>
      20: public void ShowLayers(FeatureCollectionGE layers)
      21: {
      22:     if (this.InvokeRequired)
      23:     {
      24:         Action method = delegate {
      25:             InternalShowLayers(layers);
      26:         };
      27:         try
      28:         {
      29:             this.Invoke(method);
      30:         }
      31:         catch { }
      32:     }
      33:     else
      34:     {
      35:         InternalShowLayers(layers);
      36:     }
      37: }
      38: /// <summary>
      39: /// 将给定的图层集合显示在“图层”选项卡的树形控件中.被公共函数ShowLayers调用
      40: /// </summary>
      41: /// <param name="layers"></param>
      42: protected void InternalShowLayers(FeatureCollectionGE layers)
      43: {
      44:     this.tvLayers.Nodes.Clear();
      45:  
      46:     if (layers == null || layers.Count <= 0)
      47:     {
      48:         return;
      49:     }
      50:  
      51:     foreach (FeatureGE layer in layers)
      52:     {
      53:         TreeNode node = new TreeNode(layer.Name);
      54:         node.Checked = layer.Visibility > 0;
      55:         node.Tag = layer;
      56:  
      57:         ShowChidrenLayers(layer, node);
      58:  
      59:         node.Expand();
      60:  
      61:         this.tvLayers.Nodes.Add(node);
      62:     }
      63: }
      64: /// <summary>
      65: /// 显示指定图层的子图层
      66: /// </summary>
      67: /// <param name="layer">当前图层</param>
      68: /// <param name="node">当前节点</param>
      69: protected void ShowChidrenLayers(FeatureGE layer, TreeNode node)
      70: {
      71:     FeatureCollectionGE layers = layer.GetChildren();
      72:  
      73:     foreach (FeatureGE child in layers)
      74:     {
      75:         TreeNode tn = new TreeNode(child.Name);
      76:         tn.Checked = child.Visibility > 0;
      77:         tn.Tag = child;
      78:  
      79:         ShowChidrenLayers(child, tn);
      80:  
      81:         node.Nodes.Add(tn);
      82:     }
      83: }

    呵呵,代码很简单。按照此代码修改第三篇的源程序就可以实现本篇的功能了。

    GoogleEarthDemo

  • 相关阅读:
    剑指Offer——构建乘积数组
    剑指Offer——把二叉树打印成多行
    剑指Offer——二叉树的下一个结点
    剑指Offer——二叉搜索树与双向链表
    剑指Offer——二叉搜索树的后序遍历序列
    LeetCode——Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode——Construct Binary Tree from Preorder and Inorder Traversal
    剑指Offer——重建二叉树2
    C++ STL基本容器的使用
    mysql中模糊查询的四种用法介绍
  • 原文地址:https://www.cnblogs.com/cpcpc/p/2123105.html
Copyright © 2011-2022 走看看