WorldWind系列十二:Measure插件学****上)来源:博客园 作者:无痕客我在写自己的WorldWind插件时,遇到很大挫折,上周六本来想写个简单的画线的插件,费了九牛二虎之力终于画出了,如何以动画效果画出线的问题没解决。Direct3D中画线本来是个简单的事,画到球面上也不难,但是实践告诉我:我前期学****WW,又犯了眼高手低的毛病!改动人家写好的插件代码容易,但要把插件的整个流程都自己写,就没想象的简单啦,写代码不严谨的小问题就不说了,我周六画线的主要问题是Direct3D编程都浮在表面,连PrimitiveType中各类型的基元数和顶点的关系没搞清楚。(如想了解请参看:红色部分) 自己在画线上体验,让我决定先学****Measure插件。另外,我一直想做个类似VE插件,支持加载ArcGIS切图方式的影像,自己想了很久,有几个主要困惑没解决:投影方式不同如何处理、只要部分影像(如何计算行列数)、切图的中心问题(VE影像是全球的,切图中心经纬度为(0°,0°))等等。所以,前段WW实践,让我很受打击,博客就没心情更新啦!虽然理论和实践还有很大的距离,但是总结还是很重要的! 上面都是题外话了,开始说说Measure插件吧!总体感觉Measure插件很强大,如果能搞清楚,在球面上画点、线、面都不是难事啦。(前提:要有点DirectX编程基础) :MeasureTool(插件类)和MeasureToolLayer(渲染对象类)。MeasureToolLayer类中又包含五个内部类:MeasureLine、MeasureMultiLine、MeasurePropertiesDialog、MeasureState、SaveMultiLine(如下图) MeasureTool作为插件类,需要实现Load()和Unload()方法,不详说。Load()中注册了一些事件。加载代码 public override void Load() { //构造渲染对象 layer = new MeasureToolLayer( this, ); //设置纹理路径 = (PluginDirectory,"Plugins\\Measure"); (layer); menuItem = new MenuItem("Measure\tM"); += new EventHandler(menuItemClicked); ( menuItem ); // Subscribe events注册了事件 += new MouseEventHandler(); += new MouseEventHandler(); += new MouseEventHandler(); +=new KeyEventHandler(); } MeasureToolLayer作为渲染对象类,是WW插件实现的重点。必须重载的方法Initialize()、Update()、Render()和PerformSelectionAction(DrawArgsdrawArgs)。我们先分别看看MeasureToolLayer的五个内部类。 publicenumMeasureState { Idle, Measuring, Complete } MeasureState是个枚举类型,存放Measure的当前状态的(空闲、测量中、完成)。 从上图中,我们可看到MeasurePropertiesDialog和SaveMultiLine类。 MeasurePropertiesDialog继承自Form,主要是设置画线的类型:单线、多条线。设置MeasureMode代码 private void okButton_Click(object sender, EventArgs e) { if ( == true) = ; else = ; (); } SaveMultiLine类基础自Form。主要实现将画出的多线,保存为KML或Shp格式。保存代码private void saveButton_
WorldWind系列十二:Measure插件学习 来自淘豆网www.taodocs.com转载请标明出处.