用户操作
[即时聊天] [发私信] [加为好友]
粟卫民ID:suen
141282次访问,排名564好友37人,关注者81
爱好技术,爱好开源,在华工学过计算机,在武测学过GIS,国家认证系统分析师,曾负责或参与中国科学院开放基金、国家基础测绘科技计划、国家自然科学基金、××市人防指挥地理信息系统、境界数据建库、地图网站等多个项目。因热心GIS技术传播而获得“CSDN地理信息专家”称号,虽然自己觉得离专家的差距还很大,但一直在努力,^-^。
suen的文章
原创 39 篇
翻译 5 篇
转载 41 篇
评论 65 篇
小粟的公告
终于完成GeoWeb开源社区(http://www.gisdev.cn)的搭建和初步测试,请大家注册用户,测试,并提出宝贵意见。
最近评论
douweibin:我也建了一个群 群号是 51824242 也做您的后备群用吧 呵呵
sparkwong3:#common22 发表于2008-08-07 15:54:58 IP: 119.40.19.*
不知道你注意到没有 百度地图其实用的是mapbar的图片引擎

对的
chenshengbj:你好!我想问一下,怎么用GDAL类库对栅格影像进行矢量化?GDAL提供矢量多边形的最小外包矩形的接口吗?我的邮箱是chenshengbj@163.com,希望给我好消息。我继续这几个功能。
xbt746:呵呵,为什么不用postgresql试试
xbt746:呵呵,为什么不用postgresql试试
文章分类
收藏
    相册
    我的照片
    GIS
    .NET开源GIS翻译WiKi
    GeoWeb开源社区
    GIS空间站
    GIS论坛
    中科院地理所
    国家测绘局
    我的旧BLOG归档
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 GOOGLE地球浏览器分析(九):[转] GoogleEarth二次开发难点和技巧收藏

    新一篇: 谈谈地图在地震中的应用——以此来纪念“5.12汶川大地震” | 旧一篇: OpenLayers项目分析[转](十):OpenLayers事件机制分析

    GOOGLE地球浏览器分析(九):[] GoogleEarth二次开发难点和技巧

    粟卫民   http://www.gisdev.cn/   http://blog.csdn.net/suen/   日期:2007-5-18

    转载自:Start At SIOGRhttp://blog.163.com/lionyue@126/blog/static/1079307120082733754736/

     

    一、 基本步骤

    1、安装GoogleEarth程序

    2、对GoogleEarth activex控件进行注册(googleearth.exe /regserver

    3、在开发环境中引用googleearth activex

     

    二、 开发方式

    针对GE的开发有两种方式,一种是基于GEcom API,一种是基于KML。基于 Com API的开发方式主要用来控制GE的视角、实现动画效果,而基于KML的开发方式主要用来生成地理要素,实现数据的动态更新等。在实际应用中,需要结合这两种开发方式,这样才能得到比较理想的效果。

    1 基于ComAPI的开发

    GE 公布的API目前是1.0a版,数量比较少,所能实现的功能也不多,在实际开发中主要用来加载KML数据、控制视角和实现动画播放。

    A 加载KML数据

    IApplicationGE. OpenKmlFile(kmlFilePath),加载指定的kml文件到GE中;

    IApplicationGE.LoadKmlData(kmlData),加载kml文本流到GE

    B 控制视角

    IApplicationGE. SetCameraICameraInfoGE double ),设置GE当前的视角,第一个参数为视角参数,第二个参数为当前视角飞到这个视角的速度(取值范围为0--5)

    IApplicationGE .SetFeatureView(IFeatureGE,double),从当前视角飞到指定要素处的视角,第一个参数为指定的要素,这个要素的视角由KML中的<LookAt>标签来决定,第二个参数为飞行速度(取值范围为0—5)。

    C 动画效果

    GE中实现动画效果有两种方法,第一种是通过KML中的<Annimation>标签来实现,这个标签内部放置的是每一帧所代表的视图,第二种方式是通过API来实现某个父要素下的所有子要素的视图的轮流切换。

    ITimeIntervalGE.Play() 开始播放<Annimation>标签中的帧

    ITourControllerGE. PlayOrPause () 播放某个父要素下的子要素,或暂停播放

    2 基于KML的开发

    GE实际上就是一个浏览器,被浏览的数据是KMLKMLGMLSVG等表示矢量图形的标准类似,不过他所描述的是三维的数据结构,可以认为KML是基于XML的一种三维矢量图形标准。

    KML的结构组成可以参考

    http://code.google.com/apis/kml/documentation/kml_tags_beta1.html,从其结构图中可以看出,KML描述地物的方式和通用的GIS相类似,主要由要素、样式、视角、动画等部分组成。下面我说明KML中几个比较有难度的技术。

    A      LOD技术

    LODLevel Of Detail)地图分级加载技术,利用LOD技术可以在PC机上浏览海量的影像地图数据。有GIS平台使用经验的都知道,我们可以设置某个图层在某个比例尺范围之内显示,小于或者超过这个范围则不显示。LOD技术非常类似,比如说,在视角高度很大的时候,我只加载15000W的影像数据,在视角高度很小的时候,我只加载11000的数据,这样的话,视角高度越低,我们所能看到的地物越详细。

    KML中用来实现LOD技术的是<Region>标签,这个标签定义了在什么范围内,在什么像素级别范围内显示某个要素。

    B、动态数据更新技术

    GPS车辆监控系统中,需要对实时数据进行更新。利用KML中的<NetworkLink>< refreshMode>标签可以实现数据的实时更新。将refreshMode设置为onInterval模式,并在< refreshInterval >中设置间隔时间,那么GE将间隔指定的时间来刷新一下<href>标签中的链接地址,这个链接地址可以是本地磁盘上的一个文件,也可以是一个网络链接。(可以参照gpsrealtime.kml来理解)

    C      动画播放技术

    KML中的< TimeSpan >或者< TimeStamp >标签是用来控制动画播放的,< TimeSpan >< TimeStamp >都必须包含在在一个要素标签内,表示的是在某个时间点上,GE的视图转到当前要素标签所规定的视图上,并完成相应的动作。因此每一个包含时间戳标签的要素标签都表示动画过程中的一帧。(可以参照trackreplay.kml来理解)

    D      三维建模技术

    KML中的几何对象都包含三个属性:longitudelatitudealtitude,利用基本的几何图形(如点、线、面),加上高程数据,我们可以构建一些简单的三维图形。如果需要构建复杂的三维模型,可以借助三维建模工具,如3D maxgoogle sketch,AutoCAD,然后将得到的三维模型转成dae格式即可,这样就可以直接在GE中调用这些三维模型了(利用<Model>标签来引用模型文件的位置)

    三、几个技巧

    1、如何将GE的地图控件引用到自定义的窗体中?

             在一般情况下,我们针对GE的开发都只能基于GE程序本身来进行,所有的操作都必须在GE本身的框架上进行,不能将GE的地图控件像一般可拖放的控件来操作。怎么解决这个问题呢,这里要用到一下Win API,将GE中的地图部分hook过来。

                this._GEMainHandler = (IntPtr)this._googleEarth.GetMainHwnd();//获取GE程序的句柄

                SetWindowPos((int)this._GEMainHandler, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE + SWP_HIDEWINDOW);//GE窗体移到屏幕可视范围之外,使之不可见

                this._GEHrender = (IntPtr)_googleEarth.GetRenderHwnd();//获取GE的地图控件的句柄

                this._GEParentHrender = GetParent(this._GEHrender);//获取GE地图控件的父控件的句柄

                PostMessage((int)this._GEParentHrender, WM_HIDE, 0, 0);//发送消息到地图控件的父控件,使之不可见

                SetParent(this._GEHrender, customControl.Handle);//GE地图控件的父控件设置为我们指定的控件

     

    使用上面的代码,我们就可以将GE中的地图控件抢夺到我们自己的winform中。(参考utilities\GEHandler.cs

     

    2、如何为GE提供动态数据?

       GE提供动态数据,需要用到上面介绍的KML动态数据更新技术。在这里提供一个比较好的解决方案,架构动态数据提供服务器。这有点类似于B/S架构,browser就是GEServer就是我们要架设的服务器,Server提供的是动态的符合KML规范的数据,GE间隔一定时间去服务器上获取一下数据。

     

    3    如何得到GE中的指定要素?

    当我们需要对某个要素进行操作时,首先必须得到这个要素。当KML文件被加载进入GE中后,这个文件也被当作一个要素看待,文件中的这个几何图形、图片、链接等都被当成这个要素的子要素看待。在GE中获取某个要素只有两个途径:通过要素名称和通过要素的链接地址

    GetFeatureByNamename)通过要素名称来得到要素

    GetFeatureByHrefhref)通过链接地址来得到要素(得到的是从链接地址中代表的内容)

     

    附(此系列以前的文章的链接):

    GOOGLE地球浏览器分析(一):地图服务产业分析

    http://blog.csdn.net/suen/archive/2007/04/23/1575447.aspx

    GOOGLE地球浏览器分析(二):GOOGLE地球浏览器软件布局及最新进展

    http://blog.csdn.net/suen/archive/2007/05/15/1610119.aspx

    GOOGLE地球浏览器分析(三):KML文件的定义

    http://blog.csdn.net/suen/archive/2007/05/17/1613306.aspx

    GOOGLE地球浏览器分析(四):基于ServletGoogle Earth之旅

    http://blog.csdn.net/suen/archive/2007/05/18/1615282.aspx

    GOOGLE地球浏览器分析(五):KML文件基本格式

    http://blog.csdn.net/suen/archive/2007/07/05/1679983.aspx

    GOOGLE地球浏览器分析(六):AJAX支持的GOOGLE地图MASHUP教程

    http://blog.csdn.net/suen/archive/2007/07/05/1680012.aspx

    GOOGLE地球浏览器分析(七):开发人员讲述的Google Earth真正工作原理

    http://blog.csdn.net/suen/archive/2007/07/09/1683275.aspx

    GOOGLE地球浏览器分析(八):Google Earth 2007年最新进展

    http://blog.csdn.net/suen/archive/2007/10/16/1827859.aspx

     

     

    发表于 @ 2008年05月18日 22:47:00|评论(loading...)|编辑

    新一篇: 谈谈地图在地震中的应用——以此来纪念“5.12汶川大地震” | 旧一篇: OpenLayers项目分析[转](十):OpenLayers事件机制分析

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 小粟