作者:LX
背景
在前面的文章《SuperMap流数据技术及应用实践》中介绍流数据技术的时候提到了空间过滤器—地理围栏。因此很多小伙伴好奇地理围栏的作用是什么,在SuperMap产品中如何使用,应用的效果如何等。为了让大家对流数据分析中的地理围栏有更多的了解,本文将在上一篇文章的基础上详细介绍一下流数据分析的地理围栏及其应用。
一、 地理围栏简介
地理围栏是基于移动位置服务的一种新应用,即用一个虚拟的栅栏围出一个虚拟地理边界。SuperMap iServer Streaming Service通过地理围栏技术来判断流服务传输的对象是否在某个区域内,以及判断流服务对象和某个区域的空间关系状态变化。
二、 地理围栏应用实践
1、 数据准备
1)流数据来源:(通过WebSocket发送,模拟流数据)
2)围栏数据:
ps:数据可点击文末的链接下载
2、流数据服务中配置地理围栏
1)先按照《SuperMap流数据技术及应用实践》的“SuperMap流数据应用实践”部分,完成模拟器发送数据,以及流模型中的WebSocket接收器和WebSocket发送器的添加和配置。
2) 然后打开流处理模型,将“地理围栏转换器”拖到“节点编辑器”中,并将“WebSocket接收器”右侧的绿色方块拖出的箭头指向“地理围栏转换器”,然后将“WebSocket接收器”右侧的绿色方块拖出的箭头指向“WebSocket发送器”,如下图所示:
3) 鼠标单击“节点编辑器”中的“地理围栏转换器”,配置如下参数:
“节点名称”:可以自己更改
“节点描述”:可选填
“地理围栏数据”:必选,目前只有FeatureConnection类型。
“名称字段名”:必填,进入地理围栏对象的Name属性字段。
“ID字段名”:必填,进入地理围栏对象的ID字段,也就是唯一标识该对象的字段。
“进入地理围栏字段名”:必填,新增字段的字段名称,该字段用于记录当前对象是否在地理围栏内。
“状态字段名”:必填,新增字段的字段名称,该字段用于记录当前对象的状态是进入地理围栏还是离开地理围栏。
4)鼠标点击“FeatureConnection”,在随后显示的页面中,填写如下信息:
“数据源类型”:udb,目前只支持这一种类型
“数据源连接信息”:添加” DsInfo”,有多少个数据源就添加多少个” DsInfo”。
5)点击“DsInfo-0”标签,填写“数据源文件路径”和“数据集名称”如下:
6) 然后发布流模型,打开之前发布好的数据流服务,订阅到websocket推送过来的数据如下图:
添加地理围栏转换器之前流服务订阅的数据如下:
对比增加地理围栏之前,可以看出增加地理围栏之后推送的数据增加了地理围栏转换器配置的字段geoWithin 、geoStatus。
geoWithin:记录当前对象是否在地理围栏内,取值0和1。
0表示当前对象再地理围栏外
1表示表示当前对象再地理围栏内
geoStatus:记录当前对象的状态是进入地理围栏还是离开地理围栏,取值0、1、2、3。
0表示不知道当前对象的状态
1表示进入地理围栏
2表示离开地理围栏
3表示保持在地理围栏里面
附上流处理模型发布后生成的streaming文件,不想通过流模型编辑器创建的的小伙伴可以直接发布streaming文件:
{
"sparkParameter": {
"checkPointDir": "tmp",
"interval": 2000
},
"stream": {
"nodeDic": {
"WebSocketClientSender": {
"formatter": {
"className": "com.;
},
"path": "ws://localhost:8800/iserver/services/dataflow/dataflow/broadcast?token=-tDPP6TivAixmhgNik3eLWQnfuUImTou9MpVnUhDs9GAkhDISEZgRqRifQ7Puy9kn2yWggqiNTXXfWGCyS1ibA..",
"nextNodes": [],
"name": "WebSocketClientSender",
"prevNodes": [
"GeoTaggerMapper"
],
"caption": "WebSocket发送器",
"className": "com.;
},
"WebSocketReceiver": {
"metadata": {
"epsg": 3857,
"fieldInfos": [
{
"name": "id",
"source": "1",
"nType": "TEXT"
},
{
"name": "direction",
"source": "0",
"nType": "INT32"
},
{
"name": "x",
"source": "2",
"nType": "DOUBLE"
},
{
"name": "y",
"source": "3",
"nType": "DOUBLE"
}
],
"featureType": "POINT",
"idFieldName": "id"
},
"nextNodes": [
"GeoTaggerMapper"
],
"reader": {
"className": "com.;,
"separator": ","
},
"name": "WebSocketReceiver",
"prevNodes": [],
"caption": "WebSocket接收器",
"className": "com.;,
"url": "ws://127.0.0.1:8181"
},
"GeoTaggerMapper": {
"className": "com.;,
"caption": "地理围栏转换器",
"name": "GeoTaggerMapper",
"nextNodes": [
"WebSocketClientSender"
],
"prevNodes": [
"WebSocketReceiver"
],
"description": null,
"connection": {
"type": "udb",
"info": [
{
"server": "E:\Data\fencedata\",
"datasetNames": [
"regin"
]
}
]
},
"fenceName": "NAME",
"fenceID": "SmID",
"withinFieldName": "geoWithin",
"statusFieldName": "geoStatus"
}
}
},
"version": 9000
}
streaming文件中地理围栏相关参数说明:
connection:地理围栏对象的来源。
type——String类型。数据源类型
Info——Array[DsInfo]类型。数据源连接信息。
server:地理围栏数据的路径
datasetNames:用Array[String]类型。用于地理围栏的数据集名称
fenceName——String类型。进入地理围栏对象的Name属性字段。
fenceID——String类型。进入地理围栏对象的ID字段,也就是唯一标识该对象的字段。
withinFieldName——String类型。新增字段的字段名称,该字段用于记录当前对象是否在地理围栏内。
statusFieldName——String类型。新增字段的字段名称,该字段用于记录当前对象的状态是进入地理围栏还是离开地理围栏。
本文所用到的数据和流模型可访问下面的链接下载: