C#调用GoogleEarth COM API开发

一、准备

Google Earth提供了个人免费版、Plus版、Pro版,个人开发只安装个人免费版就可以了,如果需要更多的功能,那么只有每年上交$400购买专业版了

到目前为止,GoogleEarth的二次开发接口还比较少,功能太弱,仅仅提供了1.0的类库。

GoogleEarth COM API参考文档可以在这里找到:http://earth.google.com/comapi/index.html

C#调用COM的参考资料多如牛毛,大家可以到网上搜一下

二、例子

这里提供一个利用VS2008 + Google Earth 5.0开发一个“Hello world”程序

首先,确保已经正确安装GE,打开VS2008 ,新建一个Windows应用程序项目,在“项目”菜单中选择“添加引用…”,切换到“COM”选项卡,选择“Google Earth 1.0 Type Library”,其实就是Google Earth的主程序

在项目的引用中你可以看到已经添加了一个EARTHLib的引用,然后我们就可以调用其中的接口进行开发了。

下面就是小例子的代码,打开GE,然后让GE保存一张截图,然后可以打开这个截图。

 

1.// 功能:GE实例
   2: // 描述:GE COM API 网址:http://earth.google.com/comapi/index.html
   3: // 作者:温伟鹏
   4: // 日期:2008-01-20
   5:  
   6: using System;
   7: using System.Collections.Generic;
   8: using System.ComponentModel;
   9: using System.Data;
  10: using System.Drawing;
  11: using System.Text;
  12: using System.Windows.Forms;
  13: using EARTHLib;
  14: using System.Runtime.InteropServices;
  15: using System.IO;
  16: using System.Diagnostics;
  17:  
  18: namespace GEDemo
  19: {
  20:     public partial class Form1 : Form
  21:     {
  22:         /// <summary>
  23:         /// 标记GE是否已经启动
  24:         /// </summary>
  25:         private bool isGeStarted = false;
  26:         /// <summary>
  27:         /// 定义GE应用程序类
  28:         /// </summary>
  29:         private ApplicationGEClass GeApp;
  30:  
  31:         public Form1()
  32:         {
  33:             InitializeComponent();
  34:         }
  35:  
  36:         private void button1_Click(object sender, EventArgs e)
  37:         {
  38:             StartGE();
  39:         }
  40:  
  41:         /// <summary>
  42:         /// 启动GE
  43:         /// </summary>
  44:         private void StartGE()
  45:         {
  46:             if (isGeStarted)
  47:             {
  48:                 return;
  49:             }
  50:  
  51:             try
  52:             {
  53:                 GeApp = (ApplicationGEClass)Marshal.GetActiveObject("GoogleEarth.Application");
  54:  
  55:                 isGeStarted = true;
  56:             }
  57:             catch
  58:             {
  59:                 GeApp = new ApplicationGEClass();
  60:  
  61:                 isGeStarted = true;
  62:             }
  63:         }
  64:  
  65:         private void button2_Click(object sender, EventArgs e)
  66:         {
  67:             string ssFile = Path.Combine(Application.StartupPath, "ScreenShot.jpg");
  68:  
  69:             try
  70:             {
  71:                 //quality的取值范围在(0,100)之间,质量越高,quality越大
  72:                 GeApp.SaveScreenShot(ssFile, 100);
  73:  
  74:                 MessageBox.Show("成功保存截屏图像:" + ssFile);
  75:             }
  76:             catch(Exception ex)
  77:             {
  78:                 MessageBox.Show("保存截屏图像时发生错误:" + ex.Message);
  79:             }
  80:         }
  81:  
  82:         private void button3_Click(object sender, EventArgs e)
  83:         {
  84:             string ssFile = Path.Combine(Application.StartupPath, "ScreenShot.jpg");
  85:  
  86:             if (!File.Exists(ssFile))
  87:             {
  88:                 MessageBox.Show("未能找到保存的截屏图像!");
  89:                 return;
  90:             }
  91:  
  92:             Process.Start(ssFile);
  93:         }
  94:  
  95:         private void button4_Click(object sender, EventArgs e)
  96:         {
  97:             this.Close();
  98:             Application.Exit();
  99:         }
 100:  
 101:     }
 102: }

将GoogleEarth的界面隐藏掉,并将GoogleEarth的地图显示在自定义的窗体上。

1。主窗口代码

1: // 功能:GE实例(二)
   2: // 描述:GE COM API 网址:http://earth.google.com/comapi/index.html
   3: // 作者:温伟鹏
   4: // 日期:2009-02-08
   5:  
   6: using System;
   7: using System.Collections.Generic;
   8: using System.ComponentModel;
   9: using System.Data;
  10: using System.Drawing;
  11: using System.Text;
  12: using System.Windows.Forms;
  13: using EARTHLib;
  14:  
  15: namespace GEDemo
  16: {
  17:     public partial class Form2 : Form
  18:     {
  19:         /// <summary>
  20:         /// 用来关闭GoogleEarth的消息定义
  21:         /// </summary>
  22:         static readonly Int32 WM_QUIT = 0x0012; 
  23:  
  24:         private IntPtr GEHWnd = (IntPtr)5;
  25:         private IntPtr GEHrender = (IntPtr)5;
  26:         private IntPtr GEParentHrender = (IntPtr)5;
  27:         /// <summary>
  28:         /// 定义GE应用程序类
  29:         /// </summary>
  30:         private ApplicationGEClass GeApp;
  31:  
  32:         public Form2()
  33:         {
  34:             InitializeComponent();
  35:         }
  36:  
  37:         protected override void OnLoad(EventArgs e)
  38:         {
  39:             base.OnLoad(e);
  40:  
  41:             if (!this.DesignMode)
  42:             {
  43:                 GeApp = new ApplicationGEClass();
  44:  
  45:                 GEHWnd = (IntPtr)GeApp.GetMainHwnd();
  46:  
  47:                 NativeMethods.SetWindowPos(GEHWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0,
  48:                     NativeMethods.SWP_NOSIZE + NativeMethods.SWP_HIDEWINDOW);
  49:  
  50:                 GEHrender = (IntPtr)GeApp.GetRenderHwnd();
  51:                 GEParentHrender = (IntPtr)NativeMethods.GetParent(GEHrender);
  52:  
  53:                 NativeMethods.MoveWindow(GEHrender, 0, 0, this.Width, this.Height, true);
  54:  
  55:                 NativeMethods.SetParent(GEHrender, this.Handle);
  56:             }
  57:         }
  58:  
  59:         protected override void OnClosing(CancelEventArgs e)
  60:         {
  61:             base.OnClosing(e);
  62:  
  63:             NativeMethods.PostMessage(GeApp.GetMainHwnd(), WM_QUIT, 0, 0);
  64:         }
  65:     }
  66: }

2、NativeMethods类定义:

 

1: // 功能:Windows API调用
   2: // 描述:大家可以参照MSDN
   3: // 作者:温伟鹏
   4: // 日期:2009-02-08
   5:  
   6: using System;
   7: using System.Collections.Generic;
   8: using System.Text;
   9: using System.Runtime.InteropServices;
  10:  
  11: namespace GEDemo
  12: {
  13:     public class NativeMethods
  14:     {
  15:         [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  16:         public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, UInt32 uflags);
  17:  
  18:         [DllImport("user32.dll", CharSet = CharSet.Auto)]
  19:         public static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam);
  20:  
  21:         #region 预定义
  22:  
  23:         public static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
  24:         public static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
  25:         public static readonly IntPtr HWND_TOP = new IntPtr(0);
  26:         public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
  27:         public static readonly UInt32 SWP_NOSIZE = 1;
  28:         public static readonly UInt32 SWP_NOMOVE = 2;
  29:         public static readonly UInt32 SWP_NOZORDER = 4;
  30:         public static readonly UInt32 SWP_NOREDRAW = 8;
  31:         public static readonly UInt32 SWP_NOACTIVATE = 16;
  32:         public static readonly UInt32 SWP_FRAMECHANGED = 32;
  33:         public static readonly UInt32 SWP_SHOWWINDOW = 64;
  34:         public static readonly UInt32 SWP_HIDEWINDOW = 128;
  35:         public static readonly UInt32 SWP_NOCOPYBITS = 256;
  36:         public static readonly UInt32 SWP_NOOWNERZORDER = 512;
  37:         public static readonly UInt32 SWP_NOSENDCHANGING = 1024;
  38:  
  39:         #endregion
  40:  
  41:         public delegate int EnumWindowsProc(IntPtr hwnd, int lParam);
  42:  
  43:         [DllImport("user32", CharSet = CharSet.Auto)]
  44:         public extern static IntPtr GetParent(IntPtr hWnd);
  45:  
  46:         [DllImport("user32", CharSet = CharSet.Auto)]
  47:         public extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
  48:  
  49:         [DllImport("user32", CharSet = CharSet.Auto)]
  50:         public extern static IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
  51:  
  52:         [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
  53:         public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);
  54:  
  55:         public static int GW_CHILD = 5;
  56:         public static int GW_HWNDNEXT = 2;
  57:     }
  58: }

3、执行效果:

image

主要改进了三个方面。

1) 实现GoogleEarth显示画面随窗口大小改变而改变

2) 截获GoogleEarth鼠标消息,实现单击、双击功能;鼠标滚轮缩放现在只能放大!O(∩_∩)O~

3) 实现GoogleEarth彩色截图(测试环境:Windows 2003 Server ,Vista与Win7中不可用,XP未测)

下面还是继续看代码:

1、GoogleEarth动态改变大小

1: /// <summary>
   2: /// 重新改变GoogleEarth视图的大小
   3: /// </summary>
   4: private void ResizeGoogleControl()
   5: {
   6:     NativeMethods.SendMessage(GEHWnd, (uint)NativeMethods.WM_COMMAND, NativeMethods.WM_PAINT, 0);
   7:     NativeMethods.PostMessage(GEHWnd, NativeMethods.WM_QT_PAINT, 0, 0);
   8:  
   9:     RECT mainRect = new RECT();
  10:     NativeMethods.GetWindowRect(GEHWnd, out mainRect);
  11:     clientRect = new RECT();
  12:     NativeMethods.GetClientRect(GEHrender, out clientRect);
  13:  
  14:     int offsetW = mainRect.Width - clientRect.Width;
  15:     int offsetH = mainRect.Height - clientRect.Height;
  16:  
  17:     int newWidth = this.Control.Width + (int)offsetW;
  18:     int newHeight = this.Control.Height + (int)offsetH;
  19:  
  20:     NativeMethods.SetWindowPos(GEHWnd, NativeMethods.HWND_TOP,
  21:         0, 0, newWidth, newHeight, 
  22:         NativeMethods.SWP_FRAMECHANGED);
  23:  
  24:     NativeMethods.SendMessage(GEHWnd, (uint)NativeMethods.WM_COMMAND, NativeMethods.WM_SIZE, 0);
  25: }
2、鼠标消息

此例子中对于鼠标消息到处理使用了钩子,调用HookAPI.dll实现。

1:          /// <summary>
   2:          /// 鼠标钩子
   3:          /// </summary>
   4:          private MouseHook mouseHook;
   5:   
   6:          // 设置鼠标钩子
   7:          mouseHook = new MouseHook();
   8:          mouseHook.MouseClick += new MouseEventHandler(mouseHook_MouseClick);
   9:          mouseHook.MouseDbClick += new MouseEventHandler(mouseHook_MouseDbClick);
  10:          mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel);
  11:         // 启动鼠标钩子
  12:          mouseHook.StartHook(HookType.WH_MOUSE_LL, 0);
单击事件:
1: /// <summary>
   2: /// 鼠标钩子。鼠标单击事件
   3: /// </summary>
   4: /// <param name="sender"></param>
   5: /// <param name="e"></param>
   6: void mouseHook_MouseClick(object sender, MouseEventArgs e)
   7: {
   8:     IntPtr hWnd = NativeMethods.WindowFromPoint(e.Location);
   9:     if (hWnd == this.GeRenderHWnd)
  10:     {
  11:         Point point = this.Control.PointToClient(e.Location);
  12:         // 如果鼠标击点位置在控件内部,则说明鼠标点击了GoogleEarth视图
  13:         if (this.Control.ClientRectangle.Contains(point))
  14:         {
  15:             Console.WriteLine("点击了GoogleEarth...");
  16:  
  17:             DoublePoint dp = ((GERenderPanel)Control).DetermineScreenCoordinates(point.X, point.Y);
  18:  
  19:             ParameterizedThreadStart pts = new ParameterizedThreadStart(ShowMouseClickPoint);
  20:  
  21:             Thread thread = new Thread(pts);
  22:             thread.Start(dp);
  23:  
  24:         }
  25:     }
  26: }
  27:  
  28: protected void ShowMouseClickPoint(object obj)
  29: {
  30:     //Thread.Sleep(20);
  31:     DoublePoint dp = (DoublePoint)obj;
  32:     PointOnTerrainGE pGe = GeApp.GetPointOnTerrainFromScreenCoords(dp.X, dp.Y);
  33:     Console.WriteLine("鼠标点击了:Lnt=" + pGe.Longitude.ToString() 
  34:         + ";Lat=" + pGe.Latitude.ToString());
  35: }

双击事件:

1: /// <summary>
   2:  /// 鼠标钩子。鼠标双击事件
   3:  /// </summary>
   4:  /// <param name="sender"></param>
   5:  /// <param name="e"></param>
   6:  void mouseHook_MouseDbClick(object sender, MouseEventArgs e)
   7:  {
   8:      IntPtr hWnd = NativeMethods.WindowFromPoint(e.Location);
   9:      if (hWnd == this.GeRenderHWnd)
  10:      {
  11:          Point point = this.Control.PointToClient(e.Location);
  12:          // 如果鼠标击点位置在控件内部,则说明鼠标点击了GoogleEarth视图
  13:          if (this.Control.ClientRectangle.Contains(point))
  14:          {
  15:              Console.WriteLine("xx双击了GoogleEarth...");
  16:  
  17:              DoublePoint dp = ((GERenderPanel)Control).DetermineScreenCoordinates(point.X, point.Y);
  18:  
  19:              ParameterizedThreadStart pts = new ParameterizedThreadStart(ShowMouseDbClickPoint);
  20:  
  21:              Thread thread = new Thread(pts);
  22:              thread.Start(dp);
  23:  
  24:          }
  25:      }
  26:  }
  27:  
  28:  protected void ShowMouseDbClickPoint(object obj)
  29:  {
  30:      //Thread.Sleep(20);
  31:      DoublePoint dp = (DoublePoint)obj;
  32:      PointOnTerrainGE pGe = GeApp.GetPointOnTerrainFromScreenCoords(dp.X, dp.Y);
  33:      Console.WriteLine("xx鼠标双击了:Lnt=" + pGe.Longitude.ToString()
  34:          + ";Lat=" + pGe.Latitude.ToString());
  35:  
  36:      MessageBox.Show("我还是出来一下吧!省得你不知道你已经双击了鼠标!");
  37:  }

3、截图

程序中有两种截图功能,一种是GoogleEarth自带的截图功能,只能截取黑白图片;另一种为彩色截图,但是Vista以上操作系统不支持,还未找到合适的方法实现Vista与Win7兼容。

1) GoogleEarth自带截图功能:

1: GEViewContent view = GetGEView();
   2:  
   3: if (view != null)
   4: {
   5:     ApplicationGE ge = view.GeApplication;
   6:     if (ge != null && ge.IsInitialized() > 0)
   7:     {
   8:         using (SaveFileDialog sfd = new SaveFileDialog())
   9:         {
  10:             sfd.Filter = "jpg图片|*.jpg";
  11:             sfd.AddExtension = true;
  12:             sfd.CheckPathExists = true;
  13:             sfd.Title = "保存Google Earth截图";
  14:  
  15:             if (sfd.ShowDialog() == DialogResult.OK)
  16:             {
  17:                 ge.SaveScreenShot(sfd.FileName, 100);
  18:             }
  19:         }
  20:     }
  21: }

2) 彩色截图:

1: GEViewContent view = GetGEView();
   2: if (view != null)
   3: {
   4:     int nWidth = view.Control.Width;
   5:     int nHeight = view.Control.Height;
   6:     Point pt = view.Control.PointToScreen(view.Control.Location);
   7:     int nXSrc = pt.X;
   8:     int nYSrc = pt.Y;
   9:  
  10:     IntPtr hRender = view.GeRenderHWnd;
  11:  
  12:     if (hRender != IntPtr.Zero)
  13:     {
  14:         // 取得Render DC
  15:         IntPtr hRenderDC = NativeMethods.GetWindowDC(hRender);
  16:         // 创建hBitmap
  17:         IntPtr hBitmap = NativeMethods.CreateCompatibleBitmap(hRenderDC, nWidth, nHeight);
  18:         // 创建MEM DC
  19:         IntPtr hMemDC = NativeMethods.CreateCompatibleDC(hRenderDC);
  20:         // 将Bitmap Select到MemDC
  21:         NativeMethods.SelectObject(hMemDC, hBitmap);
  22:         // 直接拷屏
  23:         NativeMethods.BitBlt(hMemDC, 0, 0, nWidth, nHeight,
  24:             hRenderDC, 0, 0, 13369376);
  25:  
  26:         using(Bitmap bmp = Bitmap.FromHbitmap(hBitmap))
  27:         {
  28:             using(SaveFileDialog sfd = new SaveFileDialog())
  29:             {
  30:                 sfd.Filter = "JPG图片|*.jpg|PNG图片|*.png";
  31:                 sfd.AddExtension = true;
  32:                 sfd.CheckPathExists = true;
  33:                 sfd.Title = "保存Google Earth截图";
  34:  
  35:                 if (sfd.ShowDialog() == DialogResult.OK)
  36:                 {
  37:                     ImageFormat imgFormat = null;
  38:                     // 默认选择JPG
  39:                     if (sfd.FilterIndex == 0)
  40:                     {
  41:                         imgFormat = ImageFormat.Jpeg;
  42:                     }
  43:                     // 选择PNG
  44:                     else
  45:                     {
  46:                         imgFormat = ImageFormat.Png;
  47:                     }
  48:                     bmp.Save(sfd.FileName, imgFormat);
  49:                 }
  50:             }
  51:             
  52:             //销毁资源
  53:             NativeMethods.DeleteDC(hRenderDC);
  54:             NativeMethods.DeleteDC(hMemDC);
  55:         }
  56:     }

 https://files.cnblogs.com/wpwen/GEDemo_2009-05-22.rar

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

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界面中的位置)并显示、隐藏

3)读取所有图层,显示并隐藏,读取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、读取图层

   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 @ 2013-09-16 23:14  vstion  阅读(6651)  评论(0编辑  收藏  举报