转:C#调用GoogleEarth COM API开发(一、二)

来源:互联网 发布:苹果电脑游戏知乎 编辑:程序博客网 时间:2024/05/22 17:40

原文地址:http://www.cnblogs.com/wpwen/archive/2009/02/06/1385570.html

一、准备

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

 

继《C#调用GoogleEarth Com API开发(一)》,我Neil又带给大家第二篇文章。这一篇文章在第一篇的基础上,展示如何调用Windows API将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