DataFlowLayer继承自DynamicLayer连接连续发出地理要素的服务,用于实时数据的展示。
案例展示:
1、获取全球航班实时数据,通过实时数据流图层可视化展示。
打开完整视频。来自优酷视频网。
2、获取航班实时数据,过滤出在首都机场起降航班,通过实时数据流图层进行可视化,并显示航班尾迹,实时跟踪首都机场航班情况。
打开完整视频。来自优酷视频网。
下面通过示例详细为您介绍如何使用DataFlowLayer实时数据流图层进行实时数据的显示。
这里假设已经存在可以发送实时数据的服务器,并且发送的实时数据为CSV格式的。
在构造一个DataFlowLayer新实例时,通常要确定DataFlowLayer的网络模式:
public DataFlowLayer(DataFlowMode mode) { }
还可以通过接口DataFlowLayer.Mode获取DataFlowLayer网络模式。
DataFlowLayer的网络模式分为两种类型:
示例代码:
//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可以接收的数据流格式:
DataFlowLayer可以接收的数据流格式,通过接口DataFlowLayer.MessageType指定。
示例代码:
//3.指定数据流格式 m_dataflowlyr.MessageType =DataFlowMessageType.CSV; |
DataFlowLayer接收的数据流,需要通过接口SetFormatDict提供数据流中的字段信息,系统才能正确解析。
public void SetFormatDict(Dictionary
该方法参数为一个字典类,其中:
指定了上述信息后,系统才可以将数据流解析为数据表,进而通过下面的步骤将具体字段指定给DataFlowLayer相关接口进行对象的显示。下面的设置中,DataFlowLayer识别的字段名称都为键,而非键值FieldInfo对象的Name属性。
假设DataFlowLayer连接的数据服务器将下面的csv表数据实时发送给DataFlowLayer,下文示例将解析这个csv格式的数据流:
数据描述
数据为全球航班分布的点数据,包含5个字段:
1. 字段1:航班号
2. 字段2:日期和时间
3. 字段3:经度
4. 字段4:纬度
5. 字段5:类别信息
示例代码:
说明:SetFormatDict(Dictionary
//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如下属性完成。
SetFormatDict(Dictionary
示例代码:
说明:下面的属性都是接收一个字段,但属性值非字段名称,而是SetFormatDict(Dictionary
//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
上述方法的参数为一个字段类,键为单值字段中的某个单值;键值为该单值对应的几何对象风格。
示例代码:
//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.接收的实时数据流就可以显示在地图窗口了。
示例代码:
//地图窗口中显示实时数据 Map m_map =m_mapControl.Map; m_map.DynamicLayers.Add(m_dataflowlyr,true); m_mapControl.Map.Refresh(); m_mapControl.Refresh(); |