WorldWind学习系列十二

上传人:飞*** 文档编号:36721210 上传时间:2018-04-01 格式:DOC 页数:35 大小:189.50KB
返回 下载 相关 举报
WorldWind学习系列十二_第1页
第1页 / 共35页
WorldWind学习系列十二_第2页
第2页 / 共35页
WorldWind学习系列十二_第3页
第3页 / 共35页
WorldWind学习系列十二_第4页
第4页 / 共35页
WorldWind学习系列十二_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《WorldWind学习系列十二》由会员分享,可在线阅读,更多相关《WorldWind学习系列十二(35页珍藏版)》请在金锄头文库上搜索。

1、WorldWind 学习系列十二:学习系列十二:Measure 插件学习插件学习 我在写自己的 WorldWind 插件时,遇到很大挫折,上周六本来想写个简单的画线的插件,费了九牛二虎之力终于画出了,如何以动画效果画出线的问题没解决。Direct3D 中画线本来是个简单的事,画到球面上也不难,但是实践告诉我:我前期学习 WW,又犯了眼高手低的毛病!改动人家写好的插件代码容易,但要把插件的整个流程都自己写,就没想象的简单啦,写代码不严谨的小问题就不说了,我周六画线的主要问题是 Direct3D 编程都浮在表面,连 PrimitiveType 中各类型的基元数和顶点的关系没搞清楚。(如想了解请参看

2、:http:/ 红色部分)自己在画线上体验,让我决定先学习 Measure 插件。另外,我一直想做个类似 VE 插件,支持加载 ArcGIS 切图方式的影像,自己想了很久,有几个主要困惑没解决:投影方式不同如何处理、只要部分影像(如何计算行列数)、切图的中心问题(VE 影像是全球的,切图中心经纬度为(0,0)等等。所以,前段 WW 实践,让我很受打击,博客就没心情更新啦!虽然理论和实践还有很大的距离,但是总结还是很重要的!上面都是题外话了,开始说说 Measure 插件吧!总体感觉 Measure 插件很强大,如果能搞清楚,在球面上画点、线、面都不是难事啦。(前提:要有点 DirectX 编程

3、基础)MeasureTool.cs 中有两个大类:MeasureTool(插件类)和 MeasureToolLayer(渲染对象类)。MeasureToolLayer 类中又包含五个内部类:MeasureLine、MeasureMultiLine 、MeasurePropertiesDialog、 MeasureState 、SaveMultiLine(如下图)MeasureTool 作为插件类,需要实现 Load() 和 Unload()方法,不详说。Load()中注册了一些事件。加载代码 public override void Load() /构造渲染对象layer = new Meas

4、ureToolLayer(this,ParentApplication.WorldWindow.DrawArgs );/设置纹理路径layer.TexturePath = Path.Combine(PluginDirectory,“PluginsMeasure“);ParentApplication.WorldWindow.CurrentWorld.RenderableObjects.Add(layer);menuItem = new MenuItem(“MeasuretM“);menuItem.Click += new EventHandler(menuItemClicked);Parent

5、Application.ToolsMenu.MenuItems.Add( menuItem );/ Subscribe events 注册了事件ParentApplication.WorldWindow.MouseMove += new MouseEventHandler(layer.MouseMove);ParentApplication.WorldWindow.MouseDown += new MouseEventHandler(layer.MouseDown);ParentApplication.WorldWindow.MouseUp += new MouseEventHandler(l

6、ayer.MouseUp);ParentApplication.WorldWindow.KeyUp +=new KeyEventHandler(layer.KeyUp);MeasureToolLayer 作为渲染对象类,是 WW 插件实现的重点。必须重载的方法Initialize()、Update()、Render()和 PerformSelectionAction(DrawArgs drawArgs)。我们先分别看看 MeasureToolLayer 的五个内部类。public enum MeasureStateIdle,Measuring,CompleteMeasureState 是个枚举

7、类型,存放 Measure 的当前状态的(空闲、测量中、完成)。从上图中,我们可看到 MeasurePropertiesDialog 和 SaveMultiLine 类。MeasurePropertiesDialog 继承自 Form,主要是设置画线的类型:单线、多条线。设置 MeasureMode 代码 private void okButton_Click(object sender, EventArgs e)if (lineModeButton.Checked = true) World.Settings.MeasureMode = MeasureMode.Single;else Wor

8、ld.Settings.MeasureMode = MeasureMode.Multi;this.Close();SaveMultiLine 类基础自 Form。主要实现将画出的多线,保存为 KML 或 Shp 格式。保存代码 private void saveButton_Click(object sender, System.EventArgs e)/ Heh.SaveFileDialog chooser = new SaveFileDialog();chooser.DefaultExt = “*.csv“;chooser.Filter = “kml files (*.kml)|*.kml

9、|Shape files(*.shp)|*.shp“;chooser.Title = “Save Multiline“;chooser.ShowDialog(MainApplication.ActiveForm);String filename = chooser.FileName;Console.WriteLine(filename);tryif(filename.EndsWith(“.kml“)StreamWriter writer = new StreamWriter(filename);string kml = writeKML();writer.WriteLine(kml);writ

10、er.Close();/need to be able to save to a network a shapefile accessibleif(filename.EndsWith(“.shp“)writeShape(filename);catch(Exception ex)MessageBox.Show(ex.Message);输出 KML 文件代码;KML 代码 private string writeKML()/construct XML to sendXmlDocument doc = new XmlDocument();XmlNode kmlnode = doc.CreateEle

11、ment(“kml“);XmlNode node = doc.CreateElement(“Placemark“);XmlNode name = doc.CreateElement(“name“);name.InnerText = “New Measurement“;node.AppendChild(name);XmlNode desc = doc.CreateElement(“description“);string description = “New Measurement“;desc.InnerXml = description;node.AppendChild(desc);XmlNo

12、de polygon = doc.CreateElement(“Polygon“);string request = “;foreach(MeasureLine line in m_multiline)Double lat = line.StartLatitude.Degrees;Double lon = line.StartLongitude.Degrees;request += lon+“,“+lat+“,100n“;request += “;polygon.InnerXml= request;node.AppendChild(polygon);kmlnode.AppendChild(no

13、de);doc.AppendChild(kmlnode);return doc.OuterXml;保存为 SHP 格式文件代码保存为 Shap 代码 private void writeShape(string filename)IntPtr shphandle = ShapeLib.SHPCreate(filename,ShapeLib.ShapeType.PolyLine);double lat = new doublem_multiline.Count;double lon = new doublem_multiline.Count;int i=0;foreach(MeasureLine

14、 line in m_multiline)lati = line.StartLatitude.Degrees;loni = line.StartLongitude.Degrees;i+;ShapeLib.SHPObject poly = ShapeLib.SHPCreateSimpleObject(ShapeLib.ShapeType.Polygon,m_multiline.Count,lon,lat,null);ShapeLib.SHPWriteObject(shphandle,0,poly);ShapeLib.SHPDestroyObject(poly);ShapeLib.SHPClose

15、(shphandle);上面是右键菜单的两个功能,如果实现添加右键菜单呢?很简单,MeasureToolLayer类只要重载 RenderObject 类的 BuildContextMenu(ContextMenu menu)方法。示例代码如下:添加右键菜单代码 / / Fills the context menu with menu items specific to the layer./ public override void BuildContextMenu(ContextMenu menu)menu.MenuItems.Add(“Properties“, new System.Ev

16、entHandler(OnPropertiesClick);menu.MenuItems.Add(“Save Multi-Point Line“, new System.EventHandler(saveLine);OnPropertiesClick 和 saveLine 就是用来调用两个窗体类的。MeasureMultiLine 继承自 ArrayList,主要是存放 MeasureLine 的集合。internal class MeasureMultiLine:ArrayList/添加线public void addLine(MeasureLine line)Add(line);/删除最后一条线public void deleteLine()RemoveAt(Count-1);/计算集合中线的总长度,我们关

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号