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: }
posted @ 2009-02-06 21:33 温伟鹏 阅读(5313) 评论(18) 编辑 收藏

 回复 引用   
#1楼2009-03-18 20:08 | xingpingz[未注册用户]
博主,我想在C#的一个Form中显示google earth, 并且能够根据我输入的经度纬度(高度),在地图上标记,(最好还能自动缩放)该如何入手?
 回复 引用   
#2楼2009-03-18 20:32 | xingpingz[未注册用户]
博主,补充一下,我指的是通过代码输入经度纬度(高度)
 回复 引用   
#3楼2009-05-18 15:17 | jlq[未注册用户]
我的装了google earth 5.0就是在com里找不到Google Earth 1.0 Type Library 是什么原因?版本不行?
 回复 引用 查看   
#4楼2009-05-22 23:26 | hai      
jlq你可以粘贴"C:\Program Files\Google\Google Earth\googleearth.exe" /RegServer 到运行里面。执行,就ok了。
 回复 引用   
#5楼2009-05-25 09:57 | jlq[未注册用户]
@hai
粘贴"C:\Program Files\Google\Google Earth\googleearth.exe" /RegServer 后还是没有出现 Google Earth 1.0 Type Library 。这下工作没法往下进行了

 回复 引用   
#6楼2009-05-25 16:21 | jlq[未注册用户]
谁能帮我解决一下这个问题啊?跟安装的 Google earth版本有关系吗?
 回复 引用 查看   
#7楼[楼主]2009-05-25 19:00 | 温伟鹏      
@jlq
没有找到COM注册不要紧,你可以直接引用googleearth.exe。
在“添加引用”对话框中选择“浏览”,然后找到googleearth.exe就可以添加了

 回复 引用   
#8楼2009-05-26 21:47 | jlq[未注册用户]
终于搞定了 我一直在工具栏中用添加项目来查找COM来着,直接右击应用后找打了。谢谢温伟鹏,谢谢各位。第四个例子我这里不能运行到 LoggingService.Info("正在启动应用程序..."); 就出现如下错:SharpPlatform.Core.Services.ServiceManager”的类型初始值设定项引发异常。"

 回复 引用 查看   
#9楼[楼主]2009-05-26 22:02 | 温伟鹏      
@jlq
此异常可能是因为Log4net配置不正确造成的。请修改项目中的App.config文件

 回复 引用   
#10楼2009-07-13 16:47 | ForestGump[未注册用户]
为什么截图出来是灰度影像?
 回复 引用 查看   
#11楼2010-10-14 15:45 | 徐晶晶      
楼主好厉害,佩服佩服~~~~
 回复 引用 查看   
#12楼2010-10-15 12:56 | 徐晶晶      
楼主,现在我做的项目是c#开发google earth相关的,可以加我qq:823733447吗?
 回复 引用 查看   
#13楼2010-10-15 12:58 | 徐晶晶      
@温伟鹏
此异常可能是因为Log4net配置不正确造成的。请修改项目中的App.config文件
楼主,Log4net配置我还是不太清楚~~~能否请教请教

 回复 引用 查看   
#14楼2011-01-24 16:34 | EricJaking      
@徐晶晶
同样问题,请教楼主

 回复 引用 查看   
#15楼2011-02-23 16:21 | @**      
运行代码,截图的时候提示一下错误。楼主帮忙看一下是什么原因啊。
======================================================
保存截屏图像时发生错误:无法将类型为“EARTHLib.ApplicationGEClass”的COM对象强制转换为接口类型“EARTHLib.IApplicationGE”。此操作失败的原因是对IID为“{2830837B一D4E8一48C6一B6EE一04633372ABE4}”的接口的COM组件调用Querylnterface因以下错误而失败:没有注册类(异常来自HRESULT:0x800040154(REGDB_E_CLASSNOTREG))。

 回复 引用 查看   
#16楼2011-05-30 17:37 | hyg0722      
博主你好,我用VS2005把文中整段代码拷贝进去运行,编译无法通过,有三个错误,问题都是集中在一行中,第一个是“找不到类型或命名空间文件名称“form1”(是否缺少using指令或程序集引用?)”这是什么问题啊?我是新手,见谅见谅~
 回复 引用 查看   
#17楼2011-08-21 15:39 | gis追梦者      
@hyg0722
我也遇到了这个问题,点击butten2时就没有反应,还出错。这是怎么回事呢?谢谢。

 回复 引用 查看   
#18楼2011-12-07 11:37 | 丶Y尐畅      
楼主你好,我最近也要做一个C#的项目,是关于google earth的,有很多问题想请教你,能否加一下QQ,很急,我的QQ是249845226,谢谢啦。