C# 调用 Google Earth Com API开发(四)

本篇继续介绍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

posted @ 2009-05-25 21:16  温伟鹏  阅读(10900)  评论(36编辑  收藏  举报