实时数据流图层——DataFlowLayer

DataFlowLayer继承自DynamicLayer连接连续发出地理要素的服务,用于实时数据的展示。

案例展示:

1、获取全球航班实时数据,通过实时数据流图层可视化展示。


打开完整视频。来自优酷视频网。

2、获取航班实时数据,过滤出在首都机场起降航班,通过实时数据流图层进行可视化,并显示航班尾迹,实时跟踪首都机场航班情况。


打开完整视频。来自优酷视频网。

下面通过示例详细为您介绍如何使用DataFlowLayer实时数据流图层进行实时数据的显示。

这里假设已经存在可以发送实时数据的服务器,并且发送的实时数据为CSV格式的。

(一) 新建DataFlowLayer

在构造一个DataFlowLayer新实例时,通常要确定DataFlowLayer的网络模式:

public DataFlowLayer(DataFlowMode mode) { }

还可以通过接口DataFlowLayer.Mode获取DataFlowLayer网络模式。

DataFlowLayer的网络模式分为两种类型:

  • SocketServer:Socket服务端模式。
  • SocketClient:客户端模式。

示例代码:

//1.新建DataFlowLayer

DataFlowLayer m_dataflowlyr =newDataFlowLayer(DataFlowMode.SocketServer);

(二) 设置数据服务器

使用DataFlowLayer必须具有一个实时启动的数据服务器,可以连续、无限制的发送实时数据流,通过DataFlowLayer.IP和DataFlowLayer. Port接口设定图层所连接的实时数据服务器,接收实时数据流,当DataFlowLayer被添加到地图后,用户可以看到服务器推送的实时更新数据。

示例代码:

//2.设置数据服务器

m_dataflowlyr.IP ="127.0.0.1";

m_dataflowlyr.Port = 5565;

(三) 指定数据流格式

DataFlowLayer可以接收的数据流格式:

  • CSV:一种通用的、相对简单的文件格式,以纯文本形式存储表格数据(使用逗号分隔值)。
  • Json:JavaScript对象表示法(JavaScript Object Notation)。
  • GeoJson:一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理空间信息数据交换格式。GeoJSON对象可以表示几何、特征或者特征集合。
  • UserDefine:支持自定义数据形态。

DataFlowLayer可以接收的数据流格式,通过接口DataFlowLayer.MessageType指定。

示例代码:

//3.指定数据流格式

m_dataflowlyr.MessageType =DataFlowMessageType.CSV;

(四) 解析接收的数据流

DataFlowLayer接收的数据流,需要通过接口SetFormatDict提供数据流中的字段信息,系统才能正确解析。

public void SetFormatDict(Dictionary dicFormat)

该方法参数为一个字典类,其中:

  • 键:DataFlowLayer所接收的字段标识,对于CSV格式的数据流,键为数据流中字段的序号,从0开始。
  • 键值:键对应的字段信息,包括字段名称、字段类型、大小等。

指定了上述信息后,系统才可以将数据流解析为数据表,进而通过下面的步骤将具体字段指定给DataFlowLayer相关接口进行对象的显示。下面的设置中,DataFlowLayer识别的字段名称都为键,而非键值FieldInfo对象的Name属性。

假设DataFlowLayer连接的数据服务器将下面的csv表数据实时发送给DataFlowLayer,下文示例将解析这个csv格式的数据流:

实时数据流图层——DataFlowLayer_第1张图片

数据描述

数据为全球航班分布的点数据,包含5个字段:

1.   字段1:航班号

2.   字段2:日期和时间

3.   字段3:经度

4.   字段4:纬度

5.   字段5:类别信息

示例代码:

说明:SetFormatDict(Dictionary dicFormat)方法描述了数据流的字段,一个键值对描述了一个字段,键值对中的键为字段在csv表格中的序号,序号从0开始计数,例如,csv中记录航班号的第一个字段,其序号为0,那么键值对的键=“0”;记录经度的字段在csv表中是第三个字段,其序号为2,那么键值对的键=“2”;以此类推。

//4.解析接收的数据流

Dictionary<String,FieldInfo>m_formatDic =new Dictionary<String,FieldInfo>();

 

FieldInfo info = new FieldInfo();

 

info.Name ="ID";

info.Type =FieldType.Text;

info.MaxLength = 8;

m_formatDic.Add("0",info);//csv数据表的第1个字段,记录航班号

 

info.Name ="TimeStamp";

info.Type =FieldType.DateTime;

info.MaxLength = 64;

m_formatDic.Add("1",info);//csv数据表的第2个字段

 

info.Name ="X";

info.Type =FieldType.Double;

info.MaxLength = 8;

m_formatDic.Add("2",info);//csv数据表的第3个字段,存储点的经度

 

info.Name ="Y";

info.Type =FieldType.Double;

info.MaxLength = 8;

m_formatDic.Add("3",info);//csv数据表的第4个字段,存储点的纬度

 

info.Name ="4";

info.Type =FieldType.Int32;

info.MaxLength = 8;

m_formatDic.Add("4",info);//csv数据表的第5个字段

 

m_dataflowlyr.SetFormatDict(m_formatDic);

 

(五) 指定对象信息字段

上述解析了数据流为数据表后,就可以将相关字段指定给DataFlowLayer,包括对象的经纬度坐标信息、显示风格信息等。对象信息的指定通过DataFlowLayer如下属性完成。

  • XFieldName:指定一个字段,该字段存储了对象的经度。
  • YFieldName:指定一个字段,该字段存储了对象的纬度。
  • KeyFieldName:指定一个字段,该字段为对象的唯一标识。
  • DefaultStyle:指定对象的统一显示风格。另外,对象的风格还可以依比例尺设定,也可以制作单值专题图,具体请参见下文。

SetFormatDict(Dictionary dicFormat)方法描述了数据流的字段,一个键值对描述了一个字段,这里的属性赋值都将给定一个字段,而字段的指定通过键值对中的键来实现。

示例代码:

说明:下面的属性都是接收一个字段,但属性值非字段名称,而是SetFormatDict(Dictionary dicFormat)方法设置的描述字段的键值对中的键。

//5.指定对象信息字段

m_dataflowlyr.KeyFieldName ="0";

m_dataflowlyr.XFieldName ="2";

m_dataflowlyr.YFieldName ="3";

 

(六) 设置对象显示风格

DataFlowLayer类的如下方法指定了一个临界比例尺,当小于该比例尺时,所有的对象都将以原始点显示,当大于等于该比例尺时,将按照设定的统一风格或者单值专题图风格显示。

public void SetSimplifyScale (Double dScale){}

示例代码:

//6.设置对象显示风格

//设置临界比例尺

m_dataflowlyr.SetSimplifyScale(0.00000001);

 

1.   单值专题图风格:

首先,通过接口DataFlowLayer.UniqueField指定一个单值字段;然后,通过DataFlowLayer. SetUniqueStyles方法,设置每个单值对应的几何对象风格。

public voidSetUniqueStyles(Dictionary dicStyle) {}

上述方法的参数为一个字段类,键为单值字段中的某个单值;键值为该单值对应的几何对象风格。

示例代码:

//6.设置对象显示风格

m_dataflowlyr.UniqueField ="4";//指定一个字段作为单值字段

 

Dictionary<String,GeoStyle>m_uniqueStyles =newDictionary<String,GeoStyle>();

 

GeoStyle m_style0 = new GeoStyle();

m_style0.MarkerSymbolID = 1002;

m_style0.MarkerSize =newSize2D(10, 10);

m_uniqueStyles.Add("0",m_style0);

 

GeoStyle m_style1 = new GeoStyle();

m_style1.MarkerSymbolID = 1003;

m_style1.MarkerSize =newSize2D(10, 10);

m_uniqueStyles.Add("1",m_style1);

 

m_dataflowlyr.SetUniqueStyles(m_uniqueStyles);

2.   统一风格

如果用户同没有指定单值专题图风格,那么DataFlowLayer图层中的对象将使用统一风格进行显示。统一风格通过接口DataFlowLayer.DefaultStyle指定。

示例代码:

//6.设置对象显示风格

GeoStyle m_defaultstyle = new GeoStyle();

m_defaultstyle.MarkerSymbolID = 0;

m_defaultstyle.MarkerSize =newSize2D(2, 2);

m_defaultstyle.LineColor =Color.LightGray;

m_dataflowlyr.DefaultStyle =m_defaultstyle;

 

此外,还可以设置符号自动旋转角度,例如,实时数据图层显示航班数据,可以通过符号自动旋转角度设置,自动计算飞机的行驶方向并通过符号的方向来展示,还可以显示飞机的尾迹线。

示例代码:

//开启符号自动旋转角度

m_dataflowlyr.AutoSymbolAngle = true;

//显示尾迹线

m_dataflowlyr.LineWakeNodeNumber = 50;

m_dataflowlyr.PointWakeNumber = 5;

实时数据流图层——DataFlowLayer_第2张图片

自动旋转角度及显示尾迹线

到此,DataFlowLayer.接收的实时数据流就可以显示在地图窗口了。

示例代码:

//地图窗口中显示实时数据

Map m_map =m_mapControl.Map;

m_map.DynamicLayers.Add(m_dataflowlyr,true);

m_mapControl.Map.Refresh();

m_mapControl.Refresh();

 

你可能感兴趣的:(SuperMap地图技术专栏)