在Skyline的TEPro软件中,我们可以很容易地绘制出多边形。

那么,在二次开发过程中,该如何绘制一个简单的多边形呢?

通过下面的示例代码,我们可以很容易完成这一项工作。

其中,重点需要了解Geometry对象的定义和使用。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using TerraExplorerX;
  10.  
  11. namespace HelloSkyline
  12. {
  13. public partial class CTerrainPolygon: Form
  14. {
  15. SGWorld65 sgworld = null;
  16. String pbhander = "";
  17. ITerrainPolygon65 pITPolygon = null;
  18. List<double> ListVerticsArray = new List<double>();
  19.  
  20. public CTerrainPolygon()
  21. {
  22. InitializeComponent();
  23.  
  24. sgworld = new SGWorld65();
  25. sgworld.OnLButtonDown += new _ISGWorld65Events_OnLButtonDownEventHandler(sgworld_OnLButtonDown);
  26. sgworld.OnRButtonDown += new _ISGWorld65Events_OnRButtonDownEventHandler(sgworld_OnRButtonDown);
  27. }
  28.  
  29. bool sgworld_OnRButtonDown(int Flags, int X, int Y)
  30. {
  31. sgworld.Window.SetInputMode(MouseInputMode.MI_FREE_FLIGHT);
  32. pbhander = "";
  33. pITPolygon = null;
  34. return true;
  35. }
  36.  
  37. bool sgworld_OnLButtonDown(int Flags, int X, int Y)
  38. {
  39. IWorldPointInfo65 pIWPInfo = sgworld.Window.PixelToWorld(X, Y, WorldPointType.WPT_TERRAIN);
  40. IPosition65 pIPosition = sgworld.Navigate.GetPosition(AltitudeTypeCode.ATC_ON_TERRAIN);
  41.  
  42. if (pbhander == "TerrainPolygon")
  43. {
  44. if (pITPolygon == null)
  45. {
  46. ILinearRing cRing = null;
  47. double[] cVerticesArray = null;
  48. cVerticesArray = new double[] {
  49. pIPosition.X, pIPosition.Y, ,
  50. pIWPInfo.Position.X, pIWPInfo.Position.Y, pIWPInfo.Position.Distance,
  51. pIWPInfo.Position.X, pIWPInfo.Position.Y, pIWPInfo.Position.Distance,
  52. };
  53. cRing = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(cVerticesArray);
  54.  
  55. uint nLineColor = 0xFF00FF00;
  56. uint nFillColor = 0x7FFF0000;
  57. AltitudeTypeCode eAltitudeTypeCode = AltitudeTypeCode.ATC_ON_TERRAIN;
  58. string gid = CreateGroup("AnalysisTEMP");
  59. pITPolygon = sgworld.Creator.CreatePolygon(cRing, nLineColor, nFillColor, eAltitudeTypeCode, gid, "Polygon");
  60.  
  61. IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
  62. polygonGeometry.StartEdit();
  63. foreach (ILinearRing ring in polygonGeometry.Rings)
  64. {
  65. double dx = pIWPInfo.Position.X;
  66. double dy = pIWPInfo.Position.Y;
  67. double dh = pIWPInfo.Position.Distance;
  68. ring.Points.AddPoint(dx, dy, dh);
  69. ring.Points.DeletePoint();
  70. }
  71. IGeometry editedGeometry = polygonGeometry.EndEdit();
  72. pITPolygon.Geometry = editedGeometry;
  73. }
  74. else
  75. {
  76. IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
  77. polygonGeometry.StartEdit();
  78. foreach (ILinearRing ring in polygonGeometry.Rings)
  79. {
  80. double dx = pIWPInfo.Position.X;
  81. double dy = pIWPInfo.Position.Y;
  82. double dh = pIWPInfo.Position.Distance;
  83. ring.Points.AddPoint(dx, dy, dh);
  84. }
  85. IGeometry editedGeometry = polygonGeometry.EndEdit();
  86. pITPolygon.Geometry = editedGeometry;
  87. }
  88. }
  89. return false;
  90. }
  91.  
  92. private void button1_Click(object sender, EventArgs e)
  93. {
  94. pbhander = "TerrainPolygon";
  95. sgworld.Window.SetInputMode(MouseInputMode.MI_COM_CLIENT);
  96. }
  97.  
  98. private void button2_Click(object sender, EventArgs e)
  99. {
  100. string gid = sgworld.ProjectTree.FindItem("AnalysisTEMP");
  101. if (gid != null && gid != "")
  102. {
  103. sgworld.ProjectTree.DeleteItem(gid);
  104. }
  105. }
  106.  
  107. private String CreateGroup(String GroupName)
  108. {
  109. string gid = sgworld.ProjectTree.FindItem(GroupName);
  110. if (gid != null && gid != "")
  111. {
  112. return gid;
  113. }
  114. else
  115. {
  116. return sgworld.ProjectTree.CreateLockedGroup(GroupName);
  117. }
  118. }
  119. }
  120. }

SkylineGlobe 6.5 如何实现简单多边形的动态绘制 C#示例代码的更多相关文章

  1. SkylineGlobe 6.6 三维地图上实现自定义右键菜单示例代码

    1.OnRButtonDown.htm <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...

  2. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  3. 【译】用Fragment创建动态的界面布局(附Android示例代码)

    原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...

  4. C# 动态绘制任务栏图标的实现

    通常我们在做一个应用时会遇到这样的需求:将收到的消息条数显示到任务栏,比如如下的效果 怎么实现呢? 答案是采用WindowsAPICodePack实现,具体参见:Windows 7 任务栏开发 之 覆 ...

  5. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  6. 教你怎么用Mono Cecil - 动态注入 (注意代码的注释)

    原文 教你怎么用Mono Cecil - 动态注入 (注意代码的注释) 使用 Mono Cecil 进行反编译:using Mono.Cecil; using Mono.Cecil.Cil; //.. ...

  7. golang动态加载原生代码思路

    golang动态加载原生代码思路(非plugin,非so文件.使用mmap形式运行机器码,可释放) 1.用go tool objdump,可以看到任意函数的机器码.汇编指令.偏移.(go源码下面有一个 ...

  8. iOS可视化动态绘制连通图(Swift版)

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  9. SkylineGlobe TerraExplorer Pro 7.0 Web 控件版 第一行示例代码

    SkylineGlobe TerraExplorer Pro 7.0 是原生的64位应用程序,在Web端用插件方式开发的第一行示例代码如下: 常规代码,需要IE64位: <!DOCTYPE ht ...

随机推荐

  1. phothoshop 快捷键

    界面构成: 1 菜单栏 2 工具箱 3 工具属性栏 4 悬浮面板(辅助作用) CTRL + N 新建对话框(对画布进行设置) 回车确定 CTRL + O (字母) 打开对话框(选择图片) 画布的三种显 ...

  2. 【读书笔记】iOS-PhoneGap

    以前,用PhoneGap平台创建的应用在提交到AppStore中的时候可能会遇到一些问题,不过PhoneGap 0.8.0版本已经很好地解决了这个问题,而且苹果公司也允许将通过PhoneGap构建的应 ...

  3. (网页)textarea去掉回车换行

    转自CSDN: 1,把textarea内输入的内容中有回车换行的转成<br />传给后台, var content = $("#text").val().replace ...

  4. weblogic系列漏洞整理 -- 4. weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271、CVE-2017-3506)

    目录 四. weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271) 0. 漏洞分析 1. 利用过程 2. 修复建议 一.weblogic安装 http://www.cnb ...

  5. mongodb 配置文件

    本文档是在mongodb为3.4下编写的,仅作为参考,详细内容请参考:https://docs.mongodb.com/manual/reference/configuration-options/# ...

  6. BootStrap DateTimePicker的使用

    使用方法 1. 添加资源 2. 编写代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...

  7. SQL Server 临时表和表变量系列之选择篇

    原文地址:https://yq.aliyun.com/articles/69187 摘要: # 摘要 通过前面的三篇系列文章,我们对临时表和表变量的概念.对比和认知误区已经有了非常全面的认识.其实,我 ...

  8. oracle启动的三个阶段

    startup nomount 时,数据库状态为 started; alter database mount 时, 状态为 mounted; alter database open 时,状态为 ope ...

  9. windows 2003 IIS 设置 FTP被动模式

    IIS FTP 将21端口更改为xx123端口: 更改数据端口: cd c:/Inetpub/AdminScripts cscript.exe adsutil.vbs set /MSFTPSVC/Pa ...

  10. Linux 小知识翻译 - 「Linux的吉祥物企鹅叫什么名字?」

    这次说说Linux的吉祥物 *企鹅* 都知道Linux的吉祥物是企鹅,但是这个企鹅叫什么名字呢? 它的名字就是「Tux」,注意可不是「Tax」(税收). 具体参考 wiki:中文解释  英文的解释更为 ...