VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c# 调用 Google Earch Com API开发四

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

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

 

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

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

  图片看不清楚?请点击这里查看原图(大图)。

  系列文章:

C#调用 GoogleEarth COM API开发(一)

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

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

 

 

  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: }



相关教程