随着提供实时数据流的数据源数量增加,您的应用程序能够使用并立即显示此事件数据,这一点变得越来越重要。传统上,延迟是在企业级地理数据库中要素类内首次存储该事件数据的过程中被引入,以使客户端可定期对要素服务进行轮询以检索数据用于显示,但现已证明延迟存在问题,尤其是在使用大量的数据流的情况下。
现有模式需要改变。数据持久性需要作为存档任务与实时传入客户端的时间数据并行处理。Esri 以新型 ArcGIS for Server 服务 - 流服务作为解决方案。
什么是流服务?
流服务是一种新的 ArcGIS for Server 服务类型,这种服务类型侧重于客户端/服务器数据流的低延迟和实时数据传播。连接到流服务的客户端将在订阅服务后立即开始接收数据。客户端可指定并重新配置空间和属性约束,无需事先取消订阅,然后再重新连接到服务。
要使用流服务,必须在您的企业 GIS 上安装已获许可的 ArcGIS GeoEvent Extension for Server。在首发版本中,可将流服务内容并入至 ArcGIS Online 和 Portal for ArcGIS Web 地图中,并可通过使用 ArcGIS API for JavaScript 开发的客户端进行显示。未来版本将支持更多种类的客户端订阅。
流服务使用 WebSocket 技术,支持全双工、双向式通信。这使客户端可在无需取消订阅和重新建立到服务的连接的情况下指定想要接收的数据。通过指定空间或属性约束,客户端可过滤流服务数据。
通过连接到流服务来接收实时数据源允许您将即时事件可视化的基本需求与保留数据库中的数据的需求区分开来。通过配置 GeoEvent 扩展模块 输出以便通过流服务广播事件数据,您可以选择在企业级数据存储或时空大数据存储中存储最新事件数据,但这些操作不是数据可视化的必要步骤。
下图将接收、处理以及使用要素数据的传统方式与使用流服务接收并广播实时数据的方式进行了对比。
在本图中可以看到,在流服务之前实时 GIS 数据为何最初必须在要素类中,并需要企业级地理数据库。想要显示数据的客户端应用程序必须定期对要素服务执行轮询以获取新增和更新的要素。
图的下部分显示了如何通过流服务接收实时 GIS 数据并使用 WebSocket 立即将数据传送至客户端。
发布流服务
在 GeoEvent Manager 中,使用“发送要素到流服务输出连接器”创建和发布流服务。
配置“发送要素到流服务输出连接器”时,必须指定默认已注册的 ArcGIS Server 连接、服务文件夹以及要接收输出发送的事件数据的流服务。您即可选择现有流服务也可发布新的流服务。配置后,需要将输出并入至 GeoEvent 服务,操作过程与并入任何其他输出方法相似。
注:
流服务只能通过默认已注册的 ArcGIS Server 连接进行发布。
有关在 GeoEvent 扩展模块中创建和发布流服务的详细信息,请参阅 GeoEvent 扩展模块 教程中的流服务教程。
ArcGIS REST 服务目录中的流服务
流服务与任何其他 ArcGIS for Server 服务一样,在 ArcGIS REST 服务目录中列出。用户可单击查看流服务的属性。在 ArcGIS REST 服务目录中流服务页面的底部是广播事件数据的链接和订阅流服务以接收事件数据的链接。
单击广播打开可输入一个或多个要素的 Esri 要素 JSON 制图表达的 Web 页面,然后将要素发送到连接到流服务的客户端。
单击订阅打开可连接到流服务的 Web 页面以查看所有正在进行流处理的要素。如果数据流量较大,则该页面将迅速变为过载;该页面仅适用于在较短时间内确认订阅流服务的客户端可接收的数据。
有关 ArcGIS REST 服务目录中的流服务的详细信息,请参阅流服务。
使用流服务
在上图流服务的 REST 页面中,注意顶部的链接,通过该链接可查看 ArcGIS JavaScript 地图中的流服务内容,该选项常用于地图服务。
单击 ArcGIS JavaScript 生成动态 HTML 页面,可在其中查看正在由流服务广播的数据。
如果右键单击 ArcGIS JavaScript 并单击查看源,则可查看 JavaScript 代码。开发人员可使用和自定义该代码以创建 Web 应用程序从而使用流服务。
也可通过将流服务并入至 Web 地图对其进行使用。
过滤流服务
每个客户端都可以对流服务进行过滤。数据从流服务中发送之前,每个客户端均可要求对数据进行过滤。此过滤不会影响任何流向其他客户端的数据。可在建立连接时或在建立连接后对过滤器进行指定。
通过打开 WebSocket 连接建立连接后即可应用这些设置及其他设置。
为数据流设置空间参考
流服务具有默认空间参考,可在 ArcGIS Server Manager 的服务描述页面查看该参考。如果客户端想要接收默认参考以外的其他空间参考中的数据,则必须在连接时对其进行设置。设置空间参考后,在整个连接过程中都不可对其进行更改。要更改空间参考,需创建新的 WebSocket 连接。要覆盖默认空间参考,您需要使用关键字 outSR 并知晓所需空间参考的熟知 ID (WKID),然后将 outSR=<WKID> 添加到 URL。例如,要将默认值设置为 WGS 1984 Web Mercator(辅助球体),其 WKID 为 3857,则将 outSR=3857 添加到如以下 URL:ws://HOSTNAME:6180/arcgis/services/Vehicles/StreamService/0/subscribe?outSR=3857
配置过滤器
流服务过滤器可包括空间组件、类似 SQL 的查询组件以及输出字段组件。可单独设置和清除每个过滤器,这样它们在任何时间都不会对彼此产生任何影响。要设置过滤器的一部分,只需指定该部分并忽略剩余部分。这样过滤器的其他部分将保持不变。
几何过滤器
过滤器的几何部分与 ArcGIS REST API 返回的 JSON 几何对象的结构相同。为保持流服务的性能,只有包络矩形被视为几何类型。
过滤器也可包括通过关键字 spatialRel 来识别的空间关系。这表示在执行查询时应用到输入几何上的空间关系。唯一受支持的空间关系是相交,这是默认设置 (esriSpatialRelIntersects)。
假设几何过滤器与连接同在一个空间参考中,只能在连接时对其进行覆盖。如果将其他空间参考指定为几何的一部分,则在过滤数据流中的要素时包络矩形将被投影到连接的空间参考以便使用。
where 过滤器
where 过滤器类似 SQL 表达式,通过检查要素属性与指定的 where 子句是否匹配来过滤数据流的要素。表达式应为带引号的 JSON 字符串值。支持的运算包括 AND、OR、NOT、=、!=、<、<=、>、>=、IS NULL、IS NOT NULL、IN 以及 LIKE。可对字段和文本值(例如 'field1 > 1')或两个相似类型的字段(例如 'field1 >field2')进行比较。可添加括号以明确优先执行。
- 数值比较 - 如比较字段(高度)与数值:"Altitude < 1000"。
- 字段比较 - 如比较两个字段:"speed > maxSpeed"。
- 字符串比较 - 还可比较字符串。比较始终区分大小写,且文本值应使用单引号括起。例如:"Departure_Airport='KZSE'"。
- LIKE 语句 - 通过 LIKE 语句可使用通配符比较字符串。百分号 (%) 是任意数目的字符,下划线 (_) 可以是任意单个字符。以下示例将接受人名中第二个和第三个字符与 Samantha 和 James 中的第二个字符和第三个字符相同的人:"name LIKE '_am%'"。
- IN 语句 - IN 语句允许指定文本值列表。如果字段与列表中的任意值匹配,则要素将通过流进行传送。
- 以下为字符串列表的示例:"name IN ('Bob','Jane','Henry')"。
- 以下示例为使用数值列表的 IN 语句:"alertCode IN (404,500,505)"。
- 也可使用布尔型字段代替布尔表达式。例如,如果您的要素中包含一个名为 active 的布尔型字段,则可编写一个 where 子句,该子句可传递任意 active 字段设置为 true 的要素,如:"active"。
输出字段过滤器
使用由关键字 outFields 标识的输出字段过滤器可逐一过滤数据流中的字段。所需字段将使用字段名称的逗号分隔列表来定义。