图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析

一 谷歌地球概述

谷歌地球(Google Earth,GE)是一款谷歌公司开发的虚拟地球仪软件,它把卫星照片、航空照相和GIS布置在一个地球的三维模型上。用户可以通过一个下载到自己电脑上的客户端软件,免费浏览全球各地的高清晰度卫星图片。Google地球分为免费版、专业版。

中文名 谷歌地球 原版名称 Google Earth 其他名称 Google地球


来源
Google Earth来源于Keyhole(锁眼)公司自家原有的旗舰软件。
Keyhole是一家卫星图像公司,总部位于美国加州山景城(Mountain View),成立于2001年,从事数字地图测绘等业务,它提供的Keyhole软件允许网络用户浏览通过卫星及飞机拍摄的地理图像,这一技术依赖于数以TB计的海量卫星影像信息数据库--而这正是Google Earth的前身。
2004年10月27日Google宣布收购了Keyhole公司,并于2005年6月推出了Google Earth系列软件。整体来说Google Earth和以前的Keyhole并没有什么太大的差别(影像数据、功能都差不多,只是界面作了调整)--但与Keyhole的运营思路不同的是,Google将最基本版本的Google Earth定义为Free软件,可以不限时间地自由使用,而相应的Keyhole以前只允许试用7天并且试用版面的主界面上一直有个大大的“TRIAL MODE”水印--在这二点上的确可以看出Google公司的远视之处。
特色
Google earth的卫星影像,并非单一数据来源,而是卫星影像与航拍的数据整合。其卫星影像部分来自于美国DigitalGlobe公司的QuickBird(快鸟)商业卫星与EarthSat公司(美国公司,影像来源于陆地卫星LANDSAT-7卫星居多),航拍部分的来源有BlueSky公司(英国公司,以航拍、GIS/GPS相关业务为主)、Sanborn公司(美国公司,以GIS、地理数据、空中勘测等业务为主)、美国IKONOS及法国SPOT5。其中SPOT5可以提供解析度为2.5米的影像、IKONOS可提供1米左右的影像、而快鸟就能够提供最高为0.61米的高精度影像,是全球商用的最高水平

。在卫星图像方面,美国五角大楼每年都会给予其三大主要合作伙伴DigitalGlobe、IKONOS和ORBIMAGoogle Earth数十亿美元的资助,作为回报自然是这些公司的卫星数据将在第一时间交给五角大楼作为军事应用,而且针对某些敏感区域在规定的时限内不允许商业化。当然,这些公司还是会将限制之外的影像出售,如Keyhole(后来的Google EARTH) 就是DigitalGlobe的一个买主,而中国很多和DG公司也有业务合作,如在的当地政府就跟该公司购买过本城市的某波段卫星图像(某个省会城市),整图大小共6GB多,耗资数十万元人民币。另广东2004年买的某地区共2500多平方公里卫星影像共耗资146万元人民币(快鸟的多波段彩色合成的现成影像针对大陆地区的价格约是30美元/平方公里,台湾地区的价格也是如此。如果是定购的话当然价格会更贵)。如果哪位同学有意向当然也可购买,这些公司在大陆都分别有了代理商,而且Google Earth中也为DG公司的卫星影像销售埋下了小小伏笔,后详。


二 使用谷歌地球

下载;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第1张图片


安装好后如下;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第2张图片


启动程序运行;没反应;界面如下图;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第3张图片


对此情况,网上多有论述;下面操作一遍;打开如下图位置;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第4张图片


把hosts文件清空,拷贝入下面内容;

127.0.0.1 Localhost

  173.194.64.141 www.panoramio.com

  173.194.46.19 www.google.com

  173.194.46.1 kh.google.com

  203.208.36.1 kh.google.com

  203.208.36.2 kh.google.com

  203.208.36.3 kh.google.com

  203.208.36.4 kh.google.com

  203.208.36.5 kh.google.com

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第5张图片


再打开,好了,地球出来了,可以玩儿了;更换hosts里的内容是由于:

在C:\Windows\System32\drivers\etc目录下,有个hosts文件,这个文件是google的专用设置文件(对其它软件不起作用,放心改),起配置IP的作用,这文件是玩Google earth必须要接触的文件,有以下两个原因。

   1、Google earth的服务器地址经常要变。Google在全世界有许许多多的服务器,因为国情的问题或IP被封杀等问题,会造成连不上服务器。那么,就需要手动改变服务器地址,
  2、某些软件看这个文件不顺眼,要改这文件。确定文件是否被修改,可以看hosts里面每行的内容,有的在IP地址前面被打上了#,或IP地址被删除。这是由于国内的某些杀毒软件常会偷偷地干这种事。为了应付被恶意修改,除了备份该文件外,有时还需要手工修改。


注意,有时打开时间会比较长,界面一直显示一片黑色,没什么反应,有时要相当的时间才能出来地球;因为连接谷歌地球服务器的应用程序太多;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第6张图片


三 谷歌地球 COM API 开发入门实例

进行谷歌地球 COM API 开发首先要安装谷歌地球,如上面二;


在VS2010中新建一个Winform项目,然后如下添加引用;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第7张图片

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第8张图片


如果出现下图错误;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第9张图片

将引用组件的嵌入互操作类型改为 false,如下图;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第10张图片


码码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using EARTHLib;

namespace Demo1
{
    public partial class Form1 : Form
    {
        
	/// 
	/// 用来关闭GoogleEarth的消息定义
	/// 
	static readonly Int32 WM_QUIT = 0x0012; 

	private IntPtr GEHWnd = (IntPtr)5;
	private IntPtr GEHrender = (IntPtr)5;
	private IntPtr GEParentHrender = (IntPtr)5;

	private int jstr1, jstr2, jstr3;
	private int wstr1, wstr2, wstr3;
	private double ilon, dlon, ilat, dlat;
	private const double GEPI = 3600.0;

	/// 
	/// 定义GE应用程序类
	/// 
	private ApplicationGEClass GeApp;

	public Form1()
	{
	    InitializeComponent();
	}

	protected override void OnLoad(EventArgs e)
	{
	    base.OnLoad(e);
    
	    //if (!this.DesignMode)
	    //{
	    try
	    {
	        GeApp = new ApplicationGEClass();
	        GeApp.OpenKmlFile(@"F:\VS2010Project\谷歌COM\Demo1\Demo1\火场标绘图140814135722.kml", 1);

 	       GEHWnd = (IntPtr)GeApp.GetMainHwnd();

	        NativeMethods.SetWindowPos(GEHWnd, NativeMethods.HWND_BOTTOM, 0, 0, 0, 0,
	            NativeMethods.SWP_NOSIZE + NativeMethods.SWP_HIDEWINDOW);

	        GEHrender = (IntPtr)GeApp.GetRenderHwnd();
	        GEParentHrender = (IntPtr)NativeMethods.GetParent(GEHrender);

	        NativeMethods.MoveWindow(GEHrender, 0, 0, this.Width, this.Height, true);

	        NativeMethods.SetParent(GEHrender, this.panel1.Handle);
	        GeApp.OpenKmlFile(@"F:\VS2010Project\谷歌COM\Demo1\Demo1\火场标绘图140814135722.kml", 1);
	    }
	    catch (Exception ex)
	    {
	        MessageBox.Show(ex.Message);
	    }
    
	    //}
	}
    
        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            NativeMethods.PostMessage(GeApp.GetMainHwnd(), WM_QUIT, 0, 0);
        }
   
    }
}

跑一下,地球出来了;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第11张图片


需要先如下注册googleearth.exe,不注册每次只能先运行谷歌地球再执行程序,每次只能执行程序一次;



如果不安装谷歌地球,直接执行代码,则可能出现下图的COM编程错误;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第12张图片


四 谷歌地球应用时初步的协议分析

看到上面,大家会想到一个问题,就是谷歌地球有时候会比较长时间刷不出来,界面一直就是纯黑色,没别的什么提示;那么此时如何知道程序是否在进行谷歌地球服务器的连接呢?可以使用协议分析的手段;下面先初步分析一下;

启动谷歌地球,同时启动Fiddler协议分析软件;


从启动,界面黑色,到显示出谷歌地球,期间捕获的http包如下;

很明显看到,

首先连接谷歌地球服务器使用的是443端口,下面是关于443端口的说明;

说明:网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。在一些对安全性要求较高的网站,比如银行、证券、购物等,都采用HTTPS服务,这样在这些网站上的交换信息其他人都无法看到,保证了交易的安全性。

还有使用的是HTTP隧道技术;

总之如果捕获时在Fiddler中一直看到tunnel to 这样的包,说明一直在连接谷歌地球服务器,程序没有挂掉;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第13张图片


粗略看下一个具体的包,此次的连接似乎是通过一个日本的代理进行的;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第14张图片


下面就是连到谷歌服务器了;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第15张图片

看一个具体包,似乎通过一个日本的代理连到谷歌服务器;

图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析_第16张图片


所用到的Win32 api类下载:

http://pan.baidu.com/s/1eSE1sd0

你可能感兴趣的:(原创教程,.Net,GIS,协议分析和开发)