资源描述
类作战指挥电子沙盘的方预案管理初探(原创)
一、前言
近年来GIS飞速发展,在各个行业担负着重要角色。其中电子沙盘,有些行业又叫作战指挥
或者方预案管理,在行业应用中发挥着很大的作用,如军事行业,公安警用系统等等。
下面本人对电子沙盘一些开发实施做一些探讨。以ESRI的AE为例。
二、电子沙盘中的具体功能
可以进行标绘,方案编排,方案预演等,具体有标绘指挥部,进攻路线,围堵方案,保存
方案,打开方案,方案的动画预演,开始、结束、后退、前进等预案操作。
三、具体实现
可以使用元素进行绘制,也可以直接进行DrawShape,其区别是元素绘制不用刷新重绘,
DrawShape需要在MapControl_OnAfterDraw事件中进行重绘。现在以元素为例。
(1)符号的绘制,如进攻路线符号,解决方法为使用图片点符号。
首先是使用图片生成点符号,或者直接做成符号库文件进行读取,该符号具有一定的方向。
然后是解决方向和大小的问题,在进攻路线绘制的时候,会有一个首尾点,根据首尾点得到路线方位角:
IConstructAngle pConstructAngle = new GeometryEnvironmentClass();
double angle = pConstructAngle.ConstructLine(pNewLine);
根据方位角设置符号旋转方向:IMarkerSymbol.Angle
最后是根据绘制的起始点算出符号的长宽,并定制好符号。
(2)进攻路线元素点的绘制:
经过(1)的处理,现在就剩下在指定的位置加入指定大小的元素了。可以使用点要素,或者面要素。这里以面要素为例,建议以点要素绘制。
//元素大小
IPolygon pPoly = pntColl as IPolygon;
m_pGeometry = (IGeometry)pPoly;
IFillShapeElement pFillShapeElement = new PolygonElementClass();
pFillShapeElement.Symbol = pFillSymbol as IFillSymbol ;
IElement pElement2 = pFillShapeElement as IElement ;
pElement2.Geometry = m_pGeometry;
IElementProperties elementProperty = pElement2 as IElementProperties;
elementProperty.Type = "进攻路线";
(IGraphicsContainer)m_pMapControl.Map).AddElement(pElement2, 0);
这样就对进攻路线进行了绘制。如图:
(3)绘制指挥部,围堵障碍点
这些比较简单,是点要素的添加,对于围堵障碍点的获取算法不在本篇介绍范围内,以后将详细给出。
IElement pElement = null;
IPoint pPoint = New PointClass();
pPoint.X = X;
pPoint.Y =Y;
pElement.Geometry = pPoint;
(IGraphicsContainer)m_pMapControl.Map).AddElement(pElement, 0);
(4)对于动态追踪线的处理
所谓动态追踪线,就是给出指定路线,模拟车辆的行进过程,算法分析如下:
首先:获取动态追踪线
//动态追踪线
IPolyline pPolyline = pElement.Geometry as IPolyline;
然后提取追踪绘制点:,iSplitEvenly为动态追踪绘制点的个数
public static IPointCollection GetMultiPointSplitPolyLine(IPolyline pPolyline, int iSplitEvenly)
{
object objMiss = System.Reflection.Missing.Value;
IPointCollection pPointColl = new MultipointClass();
double dSplitPercentLength = 1.0 / iSplitEvenly;
double dAccumulativePercent = dSplitPercentLength;
pPointColl.AddPoint(pPolyline.FromPoint, ref objMiss, ref objMiss);
for(int i = 1;i < iSplitEvenly; i++)
{
IPoint pSplitPoint = new PointClass(); Polyline.QueryPoint(esriSegmentExtension.esriExtendAtFrom,dAccumulativePercent, true, pSplitPoint);
pPointColl.AddPoint(pSplitPoint, ref objMiss,ref objMiss);
dAccumulativePercent = dAccumulativePercent + dSplitPercentLength;
}
pPointColl.AddPoint(pPolyline.ToPoint, ref objMiss, ref objMiss);
return pPointColl;
}
最后是进行追踪绘制点的绘制,其方法同元素点的绘制。
(5)方案的保存与打开
本过程是做出类型播放器的动画效果,利用时间间隔绘制相关的方案要素。效果如下图:
首要要解决的是方案要素点的保存与打开,就是序列化问题,前面博文中有提到AE对象的序列化,下面给出链接:http://gis-
这是单个对象的序列化成文件,对于多个对象,注意不能使用平台语言的类:Ilist,Array类,因为这些类不能进行进行序列化的。元素可以使用IElementCollection,该接口支持序列化。对于Geometry的处理比较麻烦,需要首先将对象转换为String类型,然后借助IStringArray类进行序列化,具体过程以后博文具体给出。
序列化成文件后对于打开和保存,都比较简单了。
然后是制作播放效果的方案预演:
具体原理是,已经知道所有要绘制的元素,根据方案制作中设置的汇报演示时间和演示时长,利用timer1_Tick事件在指定的时刻进行元素的绘制和删除。而前进和后退效果是在绘制停止时根据元素绘制时间的参数进行绘制和删除,以达到理想的效果。对于时间和各个参数的设置,比较麻烦,这里不具体给出,请独自自行设计。
四、总结
本篇是本人做的一些研究探讨,并为使用到具体的项目实践中,如在实现过程中有什么问题,请交流指正,
展开阅读全文