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

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

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

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

 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 TerraExplorerX; namespace HelloSkyline
{
public partial class CTerrainPolygon: Form
{
SGWorld65 sgworld = null;
String pbhander = "";
ITerrainPolygon65 pITPolygon = null;
List<double> ListVerticsArray = new List<double>(); public CTerrainPolygon()
{
InitializeComponent(); sgworld = new SGWorld65();
sgworld.OnLButtonDown += new _ISGWorld65Events_OnLButtonDownEventHandler(sgworld_OnLButtonDown);
sgworld.OnRButtonDown += new _ISGWorld65Events_OnRButtonDownEventHandler(sgworld_OnRButtonDown);
} bool sgworld_OnRButtonDown(int Flags, int X, int Y)
{
sgworld.Window.SetInputMode(MouseInputMode.MI_FREE_FLIGHT);
pbhander = "";
pITPolygon = null;
return true;
} bool sgworld_OnLButtonDown(int Flags, int X, int Y)
{
IWorldPointInfo65 pIWPInfo = sgworld.Window.PixelToWorld(X, Y, WorldPointType.WPT_TERRAIN);
IPosition65 pIPosition = sgworld.Navigate.GetPosition(AltitudeTypeCode.ATC_ON_TERRAIN); if (pbhander == "TerrainPolygon")
{
if (pITPolygon == null)
{
ILinearRing cRing = null;
double[] cVerticesArray = null;
cVerticesArray = new double[] {
pIPosition.X, pIPosition.Y, ,
pIWPInfo.Position.X, pIWPInfo.Position.Y, pIWPInfo.Position.Distance,
pIWPInfo.Position.X, pIWPInfo.Position.Y, pIWPInfo.Position.Distance,
};
cRing = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(cVerticesArray); uint nLineColor = 0xFF00FF00;
uint nFillColor = 0x7FFF0000;
AltitudeTypeCode eAltitudeTypeCode = AltitudeTypeCode.ATC_ON_TERRAIN;
string gid = CreateGroup("AnalysisTEMP");
pITPolygon = sgworld.Creator.CreatePolygon(cRing, nLineColor, nFillColor, eAltitudeTypeCode, gid, "Polygon"); IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
polygonGeometry.StartEdit();
foreach (ILinearRing ring in polygonGeometry.Rings)
{
double dx = pIWPInfo.Position.X;
double dy = pIWPInfo.Position.Y;
double dh = pIWPInfo.Position.Distance;
ring.Points.AddPoint(dx, dy, dh);
ring.Points.DeletePoint();
}
IGeometry editedGeometry = polygonGeometry.EndEdit();
pITPolygon.Geometry = editedGeometry;
}
else
{
IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
polygonGeometry.StartEdit();
foreach (ILinearRing ring in polygonGeometry.Rings)
{
double dx = pIWPInfo.Position.X;
double dy = pIWPInfo.Position.Y;
double dh = pIWPInfo.Position.Distance;
ring.Points.AddPoint(dx, dy, dh);
}
IGeometry editedGeometry = polygonGeometry.EndEdit();
pITPolygon.Geometry = editedGeometry;
}
}
return false;
} private void button1_Click(object sender, EventArgs e)
{
pbhander = "TerrainPolygon";
sgworld.Window.SetInputMode(MouseInputMode.MI_COM_CLIENT);
} private void button2_Click(object sender, EventArgs e)
{
string gid = sgworld.ProjectTree.FindItem("AnalysisTEMP");
if (gid != null && gid != "")
{
sgworld.ProjectTree.DeleteItem(gid);
}
} private String CreateGroup(String GroupName)
{
string gid = sgworld.ProjectTree.FindItem(GroupName);
if (gid != null && gid != "")
{
return gid;
}
else
{
return sgworld.ProjectTree.CreateLockedGroup(GroupName);
}
}
}
}

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. 【读书笔记】iOS-方法声明

    编译的时候 ,编译器会把方法前面的IBAction替换成void,把属性前面的IBOutlet移除掉,因为这些都 只是Interface Builder的标志而已.这个IBAction方法会被UI控件 ...

  2. 修改 this 指向

    封装函数 f,使 f 的 this 指向指定的对象 function bindThis(f, oTarget) { if(f.bind){ return f.bind(oTarget); }else{ ...

  3. “一切都是消息”--iMSF(即时消息服务框架)之【请求-响应】模式(点对点)

    MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately)消息,所以iMSF就是 immediately Message S ...

  4. [Linux.NET]在CentOS 7.x中编译方式安装Nginx

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄罗斯大型的 ...

  5. [20171211][转载]如何实现dbms_output输出没有打开serveroutput on.txt

    [20171211]如何实现dbms_output输出没有打开serveroutput on.txt http://orasql.org/2017/12/10/sqlplus-tips-8-dbms_ ...

  6. 洗礼灵魂,修炼python(17)--跨平台操作三剑客—os,os.path.sys模块

    os 1.作用: 因为客户基本都是使用不同的操作系统,在不同的系统下,要完成一个项目,那必须跨平台操作,而python本来就是一个跨平台的语言,而有了os模块,则不需要在意什么系统.并且os模块是用于 ...

  7. Sql Server 增加字段、修改字段、修改类型、修改默认值

    1.修改字段名: alter table 表名 rename column A to B 2.修改字段类型: alter table 表名 alter column 字段名 type not null ...

  8. 3星|《AI极简经济学》:AI的预测、决策、战略等方面的应用案例介绍

    AI极简经济学 主要内容是AI的各种应用案例介绍.作者把这些案例分到五个部分介绍:预测.决策.工具.战略.社会. 看书名和介绍以为会从经济学的角度解读AI,有更多的新鲜的视角和观点,读后比较失望,基本 ...

  9. Beta冲刺! Day2 - 砍柴

    Beta冲刺! Day2 - 砍柴 今日已完成 晨瑶:大致确定了文章推荐的算法思路(Content-based recommender):理清了不少feature的事宜 昭锡:修复了日期选择越界时导致 ...

  10. ECstore后台报表显示空白问题解决办法

    执行如下sql语句: INSERT INTO `sdb_ectools_analysis` (`id`, `service`, `interval`, `modify`) VALUES (1, 'b2 ...