R ICMS System Design Description SDD 1.0
R ICMS System Design Description SDD 1.0
Version: 1.0
Modified By:
Table of Contents
1 Overview ......................................................................................... 1
1.1 Identification ........................................................................................ 1
1.2 System Overview ................................................................................. 1
2 Reference Documents ................................................................... 2
3 Design............................................................................................. 2
3.1 System Context ................................................................................... 2
3.2 Design Assumptions and Constraints [by Category] ....................... 3
3.2.1 Operational Assumptions................................................... 4
3.2.2 Non-operational Design ..................................................... 4
3.2.3 System Inputs and Outputs ................................................ 4
3.2.4 Behavior and Performance ................................................ 5
3.2.5 User View of Data .............................................................. 6
3.2.6 Safety, Security, and Privacy .............................................. 6
3.2.7 Third Party Components .................................................... 7
3.3 System Architecture.......................................................................... 15
3.4 System Components ......................................................................... 17
3.4.1 DFE Layers and Components ............................................ 18
3.4.1.1 Drivers.................................................................................. 19
3.4.1.2 Pipelines............................................................................... 59
3.4.1.3 Data Store............................................................................ 63
3.4.1.4 Data Services ....................................................................... 71
3.4.2 DSS/Business Services ...................................................... 84
3.4.2.1 Session Authentication (SA-BS) ........................................... 84
3.4.2.2 User Personalization (UP-BS)............................................... 84
3.4.2.3 Admin (ADM-BS) .................................................................. 84
3.4.2.4 Alert (ALT-BS)....................................................................... 84
3.4.2.5 Orchestration (ORC-BS) ....................................................... 84
3.4.2.6 Reporting (RPT-BS) .............................................................. 85
3.4.2.7 Business Rules Engine (BRE-BS) ........................................... 85
3.4.2.8 Predictive Engine (PRE-BS) .................................................. 85
3.4.2.9 Evaluation Engine (EVE-BS) ................................................. 85
3.4.2.10 Event (EM-BS) ...................................................................... 85
3.4.2.11 Response Plan (RP-BS) ......................................................... 86
List of Tables
Table 1 - R-ICMS Fundamental Capabilities ................................................................... 5
Table 2 - Third Party Components .................................................................................. 8
Table 3 – ITSIQA Ingestion ........................................................................................... 26
Table 4 – Transit Location Specification........................................................................ 46
Table 5 – Basemap Specification .................................................................................. 54
Table 6 – RCI # Lanes at Intersection Specification ...................................................... 54
Table 7 – School Zones Specification ........................................................................... 55
Table 8 – School Zones Specification ........................................................................... 56
Table 9 – Emergency Responder Specification ............................................................ 58
Table 10 – Data Source Storage ................................................................................... 64
Table 11 - SQL vs NoSQL............................................................................................. 67
Table 12 - Generic Data Services ................................................................................. 72
Table 13 - ITSIQA API Details....................................................................................... 73
Table 14 - GIS Data Services ........................................................................................ 77
Table 15 - Stream Service Details ................................................................................. 79
Table 16 - ArcGIS Feature Service API Details ............................................................. 80
Table 17 - ArcGIS Vector Layer Server API .................................................................. 82
Table 18 - R-ICMS Data Services ................................................................................. 83
Table 19 - Hardware Configuration ............................................................................. 108
Table 20 - Use Case View Map Details ....................................................................... 118
Table 21 - View GIS Layers Use Case Details ............................................................ 119
Table 22 - View Details Use Case Details ................................................................... 120
Table 23 - Receive Statis Data Use Case Details ....................................................... 121
Table 24 - Receive Dynamic Data Use Case Details .................................................. 122
Table 25 - Optimize Corridor Use Case Details .......................................................... 146
List of Figures
Figure 1 - R-ICMS Context Diagram ............................................................................... 3
Figure 2 - R-ICMS High-Level Diagram......................................................................... 16
Figure 3 - Color Scheme ............................................................................................... 18
Figure 4 – Ingestion Flow .............................................................................................. 20
Figure 5 – FTP Workflow............................................................................................... 23
Figure 6 – SunGuide Data Ingestion Process ............................................................... 25
Figure 7 – SunGuide Data Flow .................................................................................... 25
Figure 8 – ITSIQA Data Flow ........................................................................................ 31
Figure 9 – R-ICMS Data Streaming Workflow ............................................................... 63
Figure 10 – GIS Data Store ........................................................................................... 69
Figure 11 - Geodata Shape File Data Flow ................................................................... 70
Figure 12 - Map Layer Shape File ................................................................................. 71
Figure 13 – GeoEvent Server Flow ............................................................................... 78
Figure 14 – ITSIQA GeoEvent Data Flow ..................................................................... 79
Figure 15 – Angular MVC .............................................................................................. 94
Figure 16 – User Interface Navigation Hierarchy .......................................................... 94
BS ...........................................................................................................................................................Business Service
CC ..............................................................................................................................................................Common Core
DR ................................................................................................................................................................. Driver layer
DS ................................................................................................................................................................. Data Service
GW .....................................................................................................................................................................Gateway
PL ............................................................................................................................................................... Pipeline layer
ST .................................................................................................................................................................... Data Store
UI .............................................................................................................................................................. User Interface
Component Abbreviations
1 Overview
This System Design Document (SDD) establishes the detailed design for iteration 1 of 4 for the
Regional – Integrated Corridor Management System (R-ICMS). This document includes all of the
Preliminary Design elements as well as the iteration 1 Critical Design elements. Specific areas
addressed in Iteration 1 include:
• Static data ingestion, storage, and display on a map.
• Intelligent Transportation System Input Quality Assurance (ITSIQA) traffic data ingestion,
storage, and display on a map.
• Dynamic Message Sign (DMS) data ingestion, storage, and display on a map.
• The intended mechanism used to wrap the HCS Tool for system use.
This document enables a system developer to understand how to further design and implement
the R-ICMS, and this document is a communication tool for stakeholder concurrence and a record
of how the system will meet system requirements.
1.1 Identification
The project for which this document was created is identified by the following:
2 Reference Documents
The following documents, of the exact issue shown, form a part of this document to the extent
specified herein. In the event of a conflict between the documents referenced herein and the
contents of this document, this document shall be considered the superseding requirement.
System and Subsystem Requirements Southwest Research Institute
Specification for R-ICMS for: Regional FDOT R-ICMS Project SharePoint Site
Integrated Corridor Management System:
R-ICMS-REQ-0.2
BE521 - Executed Contract Florida Department of Transportation
[email protected]
*Data Sets Needed by ICMS - ICMS Southwest Research Institute
Requirements Table 7 FDOT R-ICMS Project SharePoint Site
*This spreadsheet originated from the requirements, was modified in the negotiations and
project requirements definition processes and remains a part of the SharePoint project website
until the completion of the project where the final version will be put into the design document
as a revision at the final Iteration.
3 Design
This section documents the system design.
support basic access to the data stored in the DFE both by other R-ICMS subsystems and by
external users.
Figure 1 - R-ICMS Context Diagram provides an overview of the TSMO environment and the place
of the R-ICMS and its DFE in that environment.
Signal Plan Changes
SunGuide
Origin Destination
Connected Vehicle
Ramp Meter
Response Plans
Express Lanes
Events
Traffic / Turning Counts
Parking
DMS
CCTV
ITSIQA
Transit Loc.
GTFS (TBD)
Vehicle Loc.
GTFS-RT (TBD)
Requested Data
National Weather Service
Weather
R-ICMS 3rd Party Applications
Roadway Data
RCI
Video
iVEDDS
Modelling Results
Optimization Results
Environment Data
Environment Data
Legend
R-ICMS Incoming Data R-ICMS Outgoing Data
The following paragraphs describe high-level design assumptions and constraints considered in
developing the architecture.
The Data Sources table (see Appendix A) provides the specification of the set of inputs to be
received. The contract provides notional representations of the user interaction screens for some
of the user interactions. Additional details of the interactions are being provided as a part of the
detailed design. Additional information specifying the formats and protocols of the system
interactions are being provided on an ongoing basis by FDOT.
data from the traffic network sensors is a major focus of the system and therefore a major
influence on the architectural decisions. As proposed, ArcGIS is being used as the basis of the
map user interface. The use of ArcGIS has significant impact on the overall architecture of the
system.
The contract provides a base set of behavioral and performance requirements. Updates to those
requirements are included in the SDD. One of the architecturally significant performance
requirements is the requirement to provide data on the users’ screens within 3 seconds of
receiving the data (System Requirement 1.42). Based on that requirement, ArcGIS functionality
that allows the addition of attributes (such as colors of polygons and appearance of icons) will be
separated from the generation of the base tiles of the map and done using functionality available
in the ArcGIS Software Development Kit to knit together the basemap tiles and the attributes
derived from user layer selection and real-time data updates.
To ensure that real-time updates are consistently available to both the business services and the
data services that provide updates to the user interfaces, a pipeline architecture has been
selected for delivering real-time updates from the external systems to the update consumers
including the data stores.
To facilitate performance, especially in data updates, it is anticipated that the data services will
provide a “publish-subscribe” mechanism for access to streaming data.
Service Gateway
Signal Timings Reporting Agency Ops
Timing, Signal
Signal
... ITS Device Timing DS ME
Timings GIS DB
Current Status
Intersection Notifications Responders
Intersection Intersection Movement SOT BS
movement Transit AVL Movement Count DS Alerts
counts counts HCS7 Traffic P.E.
Intersection Traffic
Movement (Rolling 5 min GIS DS (x2) Events
Reporting
counts Avg)
CRT
...
... ... ... ...
...
External Systems
Common Core
Authorization Logging Monitoring Alerting
R-ICMS Infrastructure
(Hardware, Software and Network)
Streaming data will pass from the drivers into the pipeline layer of the architecture. The pipeline
layer will be used to facilitate rapid throughput of streaming updates throughout the system.
Streaming data pipelines will be consumed by data services, as well as the business services. The
data services will publish the data to consumers who have been authenticated, authorized, and
who have subscribed to the data. Business services will consume the data from the pipelines to
make the real-time decisions needed to respond to events and evaluate the status of the traffic
network. The streaming data pipelines will also be consumed by the data stores so that the
incoming data is stored for later use and analysis.
Non-streaming data, otherwise known as batch, static or, more appropriately, slowly changing
data, will not be entered through the pipelines. Non-streaming data will be entered into the
system using processes executed by a system administrator. Where the data is available in files
with standard formats and available via a standard protocol such as File Transport Protocol /
Secure File Transport Protocol (FTP/SFTP), a standardized generated script process will be used
to retrieve the data. Where the data can be acquired through standardized interfaces, those
interfaces will be used. However, non-streaming data sources that do not have standard
interfaces for collecting the data will require additional customization. Once the data has been
collected, it will be placed into the data stores using scripts. The data services will access the data
stores to provide data to business services.
Data will be stored in different types of data stores depending on its user, volume, age, and
nature. Response plan elements, response plans, user actions, system recommendations, signal
timing plans, and other transactional data will be stored in a MS SQL database. Streaming data,
modeling results, and other large, complex sets of data will be stored in NoSQL databases such
as HDFS, Mongo, or Elastic Search. Data to be used to display maps and the data on maps will be
stored in an ArcGIS Database.
• Data Services, which provide filtered access to data for authorized users and provide
caching of data so that users can initialize access to data streams
The Business Services layer contains much of the functionality of the DSS and the User Interface
layer contains much of the functionality of the IEN.
Drivers and Pipelines
The colors in the high-level diagram are shown in Figure 3 - Color Scheme
Services
and indicate current expectation for the locations within the physical
architectures of the layers and components illustrated. The layers and
components shown in green, i.e., the Drivers, Pipelines, and Data Stores, are
COTS Components expected to reside in the “Big Data” environment. The layers and
components shown in purple, i.e., the Data Services and the Business
Data Stores Services, are expected to reside in the standard FDOT services physical
servers. The common components shown in blue are also expected to
primarily reside in the standard FDOT services physical servers. The
User Interfaces
components shown in brown are expected to reside in the user’s systems.
As mentioned above, the DSS is made up of the Business Services layer.
External Actors
Likewise, the IEN is made up of the User Interface layer.
In addition to names used where they provide better understanding, R-ICMS
Common Components
components are assigned an identifier based on the name and the layer in
which they reside. The suffix of the component IDs is based on the layer the
Figure 3 - Color
Scheme
component been assigned to as follows:
• Driver layer component names end in “-DR”
• Pipeline layer component names end in “-PL”
• Data Store layer components end in “-ST”
• Data Service layer components end in “-DS”
• Business Service Layer components end in “-BS”
• User Interface Layer components end in “-UI”
• Common Core components end in “-CC”
The following subsections list and describe the components identified for inclusion in the R-ICMS.
• Multi-destination Pattern is used to transport data to multiple components like HDFS, GIS,
IN-memory data service (for real-time), NoSQL
• Real-Time Streaming Pattern is used for real-time streaming of data to the web user
interface
• Just-in-Time Transformation Pattern is used to upload large files (GIS Shape files)/large
quantities of data in batch mode or using traditional Extract, Transform, Load (ETL)
methods only when required to save compute time.
The following subsections list the components in each of the layers of the DFE.
3.4.1.1 Drivers
The following components are assigned to the Driver layer of the architecture. Drivers are
responsible for initiating, monitoring, and maintaining links to external systems. The drivers will
be responsible for adding the “Received Time” to data received by the R-ICMS. If a connection to
an external system is lost, the driver is responsible for reconnecting to the external system and,
where feasible, requesting data missed while the connection was down. The drivers are also
responsible for informing the monitoring service of connection status.
entry level to suit the intended destinations. Also, same data will be structured in
different ways depending on the needs of the R-ICMS application.
4. When data is received/retrieved and when it is passed to other layers, a log entry is
generated using the common logging service including begin, end timestamps, elapsed
time, status of the process, and data size / volume. This information is needed for picking
up from where the previous processes left off, as well as providing vital statistics about
the data processed and resource usage.
5. The process will also incorporate retry / recovery options when exceptions are
encountered and will log such incidents through the logging mechanism.
6. All these process steps will be encapsulated into script/(s) and the script execution will be
automated using a job scheduler at pre-defined intervals depending on the data
availability frequency.
In addition to the above steps, a separate process will be established to send notifications to the
configured users about job failure. The process will be driven by a configuration mechanism
mapping the data load jobs and the users to be notified. Metadata with the job information will
be stored in the NoSQL to help map notifications with the intended users.
• Define one configuration per individual data source with all necessary parameters
required.
• Store the configuration in the NoSQL database using the JSON document model.
• Build a common utility script to fetch the configuration for the source.
• Create initial configuration, build scripts and make them part of code deployment.
methodology to get the data from the source location. To use the FTP/SFTP process the following
criteria should be true for the data source.
• The source location where the file is located should be fixed
• The file should be available in the same location at all times
• The target location where the file will be stored should be fixed
• Credentials to the source system shall be provided if authentication is required
The FTP/SFTP process will incorporate a script to transfer the intended file from the source
location to the target destination. The script will be generic in nature and will drive the process
using a pre-defined configuration for the file transfer jobs. The same common processes can be
reused for other FTP/SFTP jobs as well. The process will carry out the following instructions:
1. Read the configuration from the NoSQL metadata to get the details for the transfer
(Source location, target location, login credentials)
2. Establish a connection to the source location
3. Perform authentication when required
4. Retrieve the file details (name and timestamp)
5. Retrieve the last retrieval details (date and timestamp) from the target location
6. Verify if the source file is newer
7. If the file is newer, continue with the transfer to the target location
8. Call the logging function to log the process; relevant information will be specified in the
configuration (Begin and end times, elapsed time, volume of data transferred, volume of
records where applicable, status and any exceptions / errors encountered)
9. If the file is not newer, call the logging function add a log entry for the job execution with
appropriate status (This entry is needed for identifying any missing data when a scheduled
job did not get the configured data)
10. If the file is supposed to contain periodic data and there are gaps in the data that meet
the identified criteria, log the gap and call the notification function to send notifications
11. For errors, call the notification function to send notifications; relevant information will be
specified in the configuration
12. Exit the process
13. Schedule a job to process the specific data file at configured intervals
SunGuide Databus subsystem. Configuration data for specific data types (such as DMS) will be
requested and subscribed from the representative subsystem through communication with
Databus. Status data will be collected directly from Databus via status update messages. To
receive data from the Databus, the RICMS is responsible for executing the following series of
steps.
1. Initiate a socket connection to SunGuide Databus.
2. Authenticate to appropriate subsystems (DMS, CCTV, etc).
3. Subscribe to receive configuration data from the appropriate subsystems.
4. Retrieve data from appropriate subsystems to get current configuration and status
information.
5. Subscribe to Databus to receive status information for appropriate subsystems.
6. From that point onwards, any updates from SunGuide will be pushed to the client which
will then be forwarded to the appropriate destinations.
7. The process will also incorporate a mechanism to re-establish the connection in case of
connectivity loss, performing necessary authentication, restart the subscription and
continue to receive the data.
8. After receiving the data / updates, the client process will redirect the data flow to the
appropriate destinations per the design.
Below are the steps describing the ingestion process implementation in general. There might be
additional steps specific to individual data types and are documented with the respective data
type ingestion process where applicable.
1. Build a process encapsulating the steps outlined above.
2. The driver / client process will also encapsulate the mechanism to re-establish the
connectivity to Databus, re-authenticate, and resume data reception activity.
3. Each time a data update is received from the server, performs any additional process
specific to the data set (Ex. validations / filtering etc.).
4. Publish the data to the Pipeline / streaming application (Kafka) after transforming to
intended format. Each data set will have one or more Kafka topics (message queues)
designed and the data forwarding will be aligned with the respective data set / topic(s)
a. Down the process flow, another process (Consumer) will retrieve the data from
the streaming pipeline and sends to the NoSQL database storage.
5. Store a copy of the data received onto the HDFS.
a. Create an additional process to read the data files from the HDFS, consolidate /
aggregate the data into a suitable format and store in the HDFS.
b. Remove the smaller XML files from HDFS
6. Add a log entry in to the log database using the common logging framework (Function or
API).
7. This client process is deployed to run in background so that it will continuously receive
the data updates from SunGuide and redirect the flow appropriately.
Kafka
Kafka
Send a authentication request to the sub-system Cluster
Kafka Producer
Receive authentication success message with Security Token To Data
Services
Kafka Consumers And other
Send a subscribe request to the sub-system Kafka destinations
SunGuide
SunGuide Data Ingestion
Process
Database
Send a retrieve data request to the sub-system (config data) Store to • Data Services
HDFS • R-ICMS Sub-Systems
Receive data retrieve response • MongoDB Store
• GeoEvent Server
SunGuide SunGuide
Databus Data Ingestor
API Client
SunGuide Data flow
APIs
SG DataBus
Server
Notes Currently, Classification Data is being published as a separate feed associated with Link
Identifier (ID). If the classification data is going to be used for traffic analysis / evaluation by
business services along with the speed / volume provided by TrafficData feed, then it will
make more sense to combine this information into traffic data as a single message. This can be
addressed when the data request requirements are clearly defined.
"_id": {
"link_id": "", /* String */
"update_timestamp": "" /* DateTime */
},
"road": "", /* String */
"direction": "", /* String */
"cross_street": "", /* String */
"county": "", f /* String */
"lane_count": , /* Integer */
"speed_limit": , /* Integer */
"length": , /* Float */
"link_type": "", /* String */
"start_location": { /* Sub-document */
"latitude": , /* Double */
"longitude": /* Double */
},
"end_location": { /* Sub-document */
"latitude": , /* Double */
"longitude": /* Double */
},
"mid_points": [ /* Array of sub-documents */
{
"latitude": , /* Double */
"longitude": /* Double */
}
],
"upstream_link": "", /* String */
"downstream_link": "" /* String */
}
Indexes:
Default unique index on
_id.link_id and _id.update_timestamp
Additional indexes on
county
road
JSON model for TrafficData:
Database Name: itsiqa
Collection Name: traffic_conditions
{
"_id": {
"link_id": "", /* String */
"update_timestamp": "" /* DateTime */
},
"speed": , /* Integer */
"speed_data_quality": , /* Integer */
"volume": , /* Integer */
"volume_data_quality": , /* Integer */
"occupancy": , /* Integer */
"occupancy_data_quality": , /* Integer */
"travel_time": , /* Integer */
"travel_time_data_quality": /* Integer */
}
Indexes:
Default unique index on
_id.link_id and _id.update_timestamp
JSON document model for ClassData:
Database Name: itsiqa
Collection Name: classification
{
"_id": {
"link_id": "", /* String */
"update_timestamp": "" /* DateTime */
},
"class1": , /* Integer */
"class2": , /* Integer */
"class3": , /* Integer */
"class4": , /* Integer */
"class5": , /* Integer */
"class6": , /* Integer */
"class7": , /* Integer */
"class8": /* Integer */
}
Indexes:
Default unique index on
_id.link_id and _id.update_timestamp
In addition to the feed specific collections, merged storage will support queries for the
applications.
JSON document model for traffic data with link config:
Database Name: traffic_conditions
Collection Name: traffic_data_with_link_config
{
"_id": {
"link_id": "", /* String */
"update_timestamp": "" /* DateTime */
},
"dateparts" : {
"date": "", /* Date */
"year": , /* Integer */
"month": , /* Integer 1-12 */
"day": , /* Integer 1-31 */
"weekday": , /* Integer 1-7 (1 = Sunday)*/
"hour": , /* Integer 0-24 */
"minute": , /* Integer 0-59 */
},
"speed": , /* Integer */
"speed_data_quality": , /* Integer */
"volume": , /* Integer */
"volume_data_quality": , /* Integer */
"occupancy": , /* Integer */
"occupancy_data_quality": , /* Integer */
"travel_time": , /* Integer */
"travel_time_data_quality": , /* Integer */
"link_config": {
"road": "", /* String */
"direction": "", /* String */
"cross_street": "", /* String */
"county": "", /* String */
"lane_count": , /* Integer */
"speed_limit": , /* Integer */
"length": , /* Float */
"link_type": "", /* String */
"start_location": { /* Sub-document */
"latitude": , /* Double */
"longitude": /* Double */
},
"end_location": { /* Sub-document */
"latitude": , /* Double */
"longitude": /* Double */
},
"mid_points": [ /* Array of sub-documents */
{
"latitude": , /* Double */
"longitude": /* Double */
}
],
"upstream_link": "", /* String */
"downstream_link": "" /* String */
}
}
API Client
APIs
ITSIQA Server
Multiple instances of the SunGuide driver may be used to interact with multiple SunGuide
instances, as well as, potentially, to separate data collection from response plan activation.
Interface Control Documents (ICD) for SunGuide drivers and other SunGuide documents are
available at: http://sunguidesoftware.com/document-library.
Schemas location:
http://sunguidesoftware.com/sunguidesoftware/documentlibrary/ICD/7_1/SunGuide%207.1
%20Schemas.zip
Locations of the schemas within the ZIP folder
Schema Folder Location
dms - authenticateReq common/requests
dms - authenticateResp common/responses
dms - subscribeReq dms/requests
dms - subscribeResp
dms - addDmsResp
dms/responses
dms - modifyDmsResp
dms - deleteDmsResp
Updates are pushed when status changes or when signs are polled by SunGuide Databus.
Process <TBD: In later iteration>
Notifications
Logging All data receiving events will be logged into the NoSQL database with details about the time,
and data being received.
Notes Since there are multiple data sets from SunGuide that need to be tapped into, a single driver /
client process will be deployed which will subscribe to all data streams that are intended to be
brought over to R-ICMS. Each data set will be redirected to the appropriate destination per
the flow design.
The source data attributes are available as part of SunGuide ICD documentation which are
located at http://sunguidesoftware.com/document-library
"type": "object",
"properties": {
"dms_address": {
"$id": "/properties/dms_comm/properties/dms_address",
"type": "object",
"properties": {
"$id":
"/properties/dms_comm/properties/dms_address/properties/pmpp_address",
"type": "object",
"properties": {
"port_server_udp_address": {
"$id":
"/properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_ud
p_address",
"type": "object",
"properties": {
"address": {
"$id":
"//properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_u
dp_address/properties/address",
"type": "integer"
},
"port_server_ip": {
"$id":
"//properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_u
dp_address/properties/port_server_ip",
"type": "string"
},
"port_server_port_number": {
"$id":
"//properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_u
dp_address/properties/port_server_port_number",
"type": "integer"
}
}
}
}
}
},
"protocol": {
"$id": "/properties/dms_comm/properties/protocol",
"type": "string"
},
"poll_process_name": {
"$id": "/properties/dms_comm/properties/poll_process_name",
"type": "string"
},
"packet_timeout": {
"$id": "/properties/dms_comm/properties/packet_timeout",
"type": "integer"
},
"packet_retry_limit": {
"$id": "/properties/dms_comm/properties/packet_retry_limit",
"type": "integer"
},
"command_retry_limit": {
"$id": "/properties/dms_comm/properties/command_retry_limit",
"type": "integer"
},
"poll_cycle": {
"$id": "/properties/dms_comm/properties/poll_cycle",
"type": "integer"
},
"op_status": {
"$id": "/properties/dms_comm/properties/op_status",
"type": "integer"
}
}
},
"dms_config": {
"$id": "/properties/dms_config",
"type": "object",
"properties": {
"dms_type": {
"$id": "/properties/dms_config/properties/dms_type",
"type": "string"
},
"manufacturer": {
"$id": "/properties/dms_config/properties/manufacturer",
"type": "string"
},
"lines": {
"$id": "/properties/dms_config/properties/lines",
"type": "integer"
},
"columns": {
"$id": "/properties/dms_config/properties/columns",
"type": "integer"
},
"has_beacons": {
"$id": "/properties/dms_config/properties/has_beacons",
"type": "boolean"
},
"brightness_level_day": {
"$id": "/properties/dms_config/properties/brightness_level_day",
"type": "object",
"properties": {
"brightness_level": {
"$id":
"/properties/dms_config/properties/brightness_level_day/properties/brightness_level",
"type": "integer"
}
}
},
"brightness_level_night": {
"$id": "/properties/dms_config/properties/brightness_level_night",
"type": "object",
"properties": {
"brightness_level": {
"$id":
"/properties/dms_config/properties/brightness_level_night/properties/brightness_level",
"type": "integer"
}
}
},
"location": {
"$id": "/properties/dms_config/properties/location",
"type": "object",
"properties": {
"description": {
"$id":
"/properties/dms_config/properties/location/properties/description",
"type": "string"
},
"roadway": {
"$id":
"/properties/dms_config/properties/location/properties/roadway",
"type": "string"
},
"direction": {
"$id":
"/properties/dms_config/properties/location/properties/direction",
"type": "string"
},
"latitude": {
"$id":
"/properties/dms_config/properties/location/properties/latitude",
"type": "number"
},
"longitude": {
"$id":
"/properties/dms_config/properties/location/properties/longitude",
"type": "number"
}
}
},
"sign_type": {
"$id": "/properties/dms_config/properties/sign_type",
"type": "string"
},
"font_id": {
"$id": "/properties/dms_config/properties/font_id",
"type": "object",
"properties": {
"$id": "/properties/dms_config/properties/font_id/properties/id",
"type": "object",
"properties": {
"id": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/id",
"type": "integer"
},
"provider_name": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/provider_name",
"type": "string"
},
"resource_type": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/resource_type",
"type": "string"
},
"center_id": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/center_id",
"type": "string"
}
}
}
},
"font_type": {
"$id": "/properties/dms_config/properties/font_type",
"type": "string"
},
"sign_use": {
"$id": "/properties/dms_config/properties/sign_use",
"type": "string"
},
"can_publish": {
"$id": "/properties/dms_config/properties/can_publish",
"type": "boolean"
},
"color_support": {
"$id": "/properties/dms_config/properties/color_support",
"type": "boolean"
},
"graphic_support": {
"$id": "/properties/dms_config/properties/graphic_support",
"type": "boolean"
},
"default_auto_merge": {
"$id": "/properties/dms_config/properties/default_auto_merge",
"type": "boolean"
}
}
}
}
}
2. sunguide_dms_status – This will store the DMS message status and update history
{
"$id": "http://example.com/example.json",
"type": "object",
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"_id": {
"$id": "/properties/_id",
"type": "object",
"properties": {
"dms_id": {
"$id": "/properties/_id/properties/dms_id",
"type": "integer"
},
"update_timestamp": {
"$id": "/properties/_id/properties/update_timestamp",
"type": "string",
"description": "Date and time when message was received from sunguide"
}
}
},
"op_status": {
"$id": "/properties/op_status",
"type": "string"
},
"control_mode": {
"$id": "/properties/control_mode",
"type": "string"
},
"power_status": {
"$id": "/properties/power_status",
"type": "string"
},
"temperature": {
"$id": "/properties/temperature",
"type": "object",
"properties": {
"temperature": {
"$id": "/properties/temperature/properties/temperature",
"type": "integer"
},
"temperature_error": {
"$id": "/properties/temperature/properties/temperature_error",
"type": "boolean"
}
}
},
"brightness_mode": {
"$id": "/properties/brightness_mode",
"type": "integer"
},
"brightness_level": {
"$id": "/properties/brightness_level",
"type": "integer"
},
"pixel_failure": {
"$id": "/properties/pixel_failure",
"type": "boolean"
},
"lamp_error": {
"$id": "/properties/lamp_error",
"type": "boolean"
},
"fan_status": {
"$id": "/properties/fan_status",
"type": "object",
"properties": {
"fan_error": {
"$id": "/properties/fan_status/properties/fan_error",
"type": "boolean"
},
"fan_status_array_length": {
"$id": "/properties/fan_status/properties/fan_status_array_length",
"type": "integer"
},
"fan_status_array": {
"$id": "/properties/fan_status/properties/fan_status_array",
"type": "string"
}
}
},
"multi_msg": {
"$id": "/properties/multi_msg",
"type": "object",
"properties": {
"multi_text": {
"$id": "/properties/multi_msg/properties/multi_text",
"type": "string"
},
"owner": {
"$id": "/properties/multi_msg/properties/owner",
"type": "string"
},
"priority": {
"$id": "/properties/multi_msg/properties/priority",
"type": "integer"
},
"duration": {
"$id": "/properties/multi_msg/properties/duration",
"type": "integer"
},
"beacons_enabled": {
"$id": "/properties/multi_msg/properties/beacons_enabled",
"type": "boolean"
},
"pixel_service_enabled": {
"$id": "/properties/multi_msg/properties/pixel_service_enabled",
"type": "boolean"
}
}
},
"last_successful_poll": {
"$id": "/properties/last_successful_poll",
"type": "string",
"description": "Date and time of last successful poll"
},
"last_successful_message": {
"$id": "/properties/last_successful_message",
"type": "string",
"description": "Date and time of last successful message"
},
"last_communication_attempt": {
"$id": "/properties/last_communication_attempt",
"type": "string",
"description": "Date and time of last communication attempt"
}
}
}
3. sunguide_dms_current – This will store the combined config and message status at it
latest state. This collection will only store the current snapshot, not the history
{
"$id": "http://example.com/example.json",
"type": "object",
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"_id": {
"$id": "/properties/_id",
"type": "object",
"description": "The unique key of the document",
"properties": {
"dms_id": {
"$id": "/properties/_id/properties/dms_id",
"type": "integer"
},
"update_timestamp": {
"$id": "/properties/_id/properties/update_timestamp",
"type": "string",
"description": "The date and time when the message was received from
sunguide"
}
}
},
"is_current": {
"$id": "/properties/is_current",
"type": "boolean"
},
"dateparts": {
"$id": "/properties/dateparts",
"type": "object",
"properties": {
"date": {
"$id": "/properties/dateparts/properties/date",
"type": "string",
"description": "The date portion of the update_timestamp"
},
"year": {
"$id": "/properties/dateparts/properties/year",
"type": "integer",
"description": "The year portion of the update_timestamp"
},
"month": {
"$id": "/properties/dateparts/properties/month",
"type": "integer",
"description": "The month (number) portion of the update_timestamp"
},
"day": {
"$id": "/properties/dateparts/properties/day",
"type": "integer",
"description": "The day number of the month of the update_timestamp"
},
"weekday": {
"$id": "/properties/dateparts/properties/weekday",
"type": "integer",
"description": "The day of the week (1 = Sunday) of the update_timestamp"
},
"hour": {
"$id": "/properties/dateparts/properties/hour",
"type": "integer",
"description": "The hour portion of the update_timestamp"
},
"minute": {
"$id": "/properties/dateparts/properties/minute",
"type": "integer",
"description": "The minute portion of the update_timestamp"
}
}
},
"data": {
"$id": "/properties/data",
"type": "object",
"properties": {
"dms_comm": {
"$id": "/properties/dms_comm",
"type": "object",
"properties": {
"dms_address": {
"$id": "/properties/dms_comm/properties/dms_address",
"type": "object",
"properties": {
"$id":
"/properties/dms_comm/properties/dms_address/properties/pmpp_address",
"type": "object",
"properties": {
"port_server_udp_address": {
"$id":
"/properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_ud
p_address",
"type": "object",
"properties": {
"address": {
"$id":
"//properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_u
dp_address/properties/address",
"type": "integer"
},
"port_server_ip": {
"$id":
"//properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_u
dp_address/properties/port_server_ip",
"type": "string"
},
"port_server_port_number": {
"$id":
"//properties/dms_comm/properties/dms_address/properties/pmpp_address/properties/port_server_u
dp_address/properties/port_server_port_number",
"type": "integer"
}
}
}
}
}
},
"protocol": {
"$id": "/properties/dms_comm/properties/protocol",
"type": "string"
},
"poll_process_name": {
"$id": "/properties/dms_comm/properties/poll_process_name",
"type": "string"
},
"packet_timeout": {
"$id": "/properties/dms_comm/properties/packet_timeout",
"type": "integer"
},
"packet_retry_limit": {
"$id": "/properties/dms_comm/properties/packet_retry_limit",
"type": "integer"
},
"command_retry_limit": {
"$id": "/properties/dms_comm/properties/command_retry_limit",
"type": "integer"
},
"poll_cycle": {
"$id": "/properties/dms_comm/properties/poll_cycle",
"type": "integer"
},
"op_status": {
"$id": "/properties/dms_comm/properties/op_status",
"type": "integer"
}
}
},
"dms_config": {
"$id": "/properties/dms_config",
"type": "object",
"properties": {
"dms_type": {
"$id": "/properties/dms_config/properties/dms_type",
"type": "string"
},
"manufacturer": {
"$id": "/properties/dms_config/properties/manufacturer",
"type": "string"
},
"lines": {
"$id": "/properties/dms_config/properties/lines",
"type": "integer"
},
"columns": {
"$id": "/properties/dms_config/properties/columns",
"type": "integer"
},
"has_beacons": {
"$id": "/properties/dms_config/properties/has_beacons",
"type": "boolean"
},
"brightness_level_day": {
"$id": "/properties/dms_config/properties/brightness_level_day",
"type": "object",
"properties": {
"brightness_level": {
"$id":
"/properties/dms_config/properties/brightness_level_day/properties/brightness_level",
"type": "integer"
}
}
},
"brightness_level_night": {
"$id": "/properties/dms_config/properties/brightness_level_night",
"type": "object",
"properties": {
"brightness_level": {
"$id":
"/properties/dms_config/properties/brightness_level_night/properties/brightness_level",
"type": "integer"
}
}
},
"location": {
"$id": "/properties/dms_config/properties/location",
"type": "object",
"properties": {
"description": {
"$id":
"/properties/dms_config/properties/location/properties/description",
"type": "string"
},
"roadway": {
"$id":
"/properties/dms_config/properties/location/properties/roadway",
"type": "string"
},
"direction": {
"$id":
"/properties/dms_config/properties/location/properties/direction",
"type": "string"
},
"latitude": {
"$id":
"/properties/dms_config/properties/location/properties/latitude",
"type": "number"
},
"longitude": {
"$id":
"/properties/dms_config/properties/location/properties/longitude",
"type": "number"
}
}
},
"sign_type": {
"$id": "/properties/dms_config/properties/sign_type",
"type": "string"
},
"font_id": {
"$id": "/properties/dms_config/properties/font_id",
"type": "object",
"properties": {
"$id":
"/properties/dms_config/properties/font_id/properties/id",
"type": "object",
"properties": {
"id": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/id",
"type": "integer"
},
"provider_name": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/provider_name",
"type": "string"
},
"resource_type": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/resource_type",
"type": "string"
},
"center_id": {
"$id":
"/properties/dms_config/properties/font_id/properties/id/properties/center_id",
"type": "string"
}
}
}
},
"font_type": {
"$id": "/properties/dms_config/properties/font_type",
"type": "string"
},
"sign_use": {
"$id": "/properties/dms_config/properties/sign_use",
"type": "string"
},
"can_publish": {
"$id": "/properties/dms_config/properties/can_publish",
"type": "boolean"
},
"color_support": {
"$id": "/properties/dms_config/properties/color_support",
"type": "boolean"
},
"graphic_support": {
"$id": "/properties/dms_config/properties/graphic_support",
"type": "boolean"
},
"default_auto_merge": {
"$id": "/properties/dms_config/properties/default_auto_merge",
"type": "boolean"
}
}
}
},
"status": {
"$id": "/properties/status",
"type": "object",
"properties": {
"op_status": {
"$id": "/properties/status/properties/op_status",
"type": "string"
},
"control_mode": {
"$id": "/properties/status/properties/control_mode",
"type": "string"
},
"power_status": {
"$id": "/properties/status/properties/power_status",
"type": "string"
},
"temperature": {
"$id": "/properties/status/properties/temperature",
"type": "object",
"properties": {
"temperature": {
"$id":
"/properties/status/properties/temperature/properties/temperature",
"type": "integer"
},
"temperature_error": {
"$id":
"/properties/status/properties/temperature/properties/temperature_error",
"type": "boolean"
}
}
},
"brightness_mode": {
"$id": "/properties/status/properties/brightness_mode",
"type": "integer"
},
"brightness_level": {
"$id": "/properties/status/properties/brightness_level",
"type": "integer"
},
"pixel_failure": {
"$id": "/properties/status/properties/pixel_failure",
"type": "boolean"
},
"lamp_error": {
"$id": "/properties/status/properties/lamp_error",
"type": "boolean"
},
"fan_status": {
"$id": "/properties/status/properties/fan_status",
"type": "object",
"properties": {
"fan_error": {
"$id":
"/properties/status/properties/fan_status/properties/fan_error",
"type": "boolean"
},
"fan_status_array_length": {
"$id":
"/properties/status/properties/fan_status/properties/fan_status_array_length",
"type": "integer"
},
"fan_status_array": {
"$id":
"/properties/status/properties/fan_status/properties/fan_status_array",
"type": "string"
}
}
},
"multi_msg": {
"$id": "/properties/status/properties/multi_msg",
"type": "object",
"properties": {
"multi_text": {
"$id":
"/properties/status/properties/multi_msg/properties/multi_text",
"type": "string"
},
"owner": {
"$id":
"/properties/status/properties/multi_msg/properties/owner",
"type": "string"
},
"priority": {
"$id":
"/properties/status/properties/multi_msg/properties/priority",
"type": "integer"
},
"duration": {
"$id":
"/properties/status/properties/multi_msg/properties/duration",
"type": "integer"
},
"beacons_enabled": {
"$id":
"/properties/status/properties/multi_msg/properties/beacons_enabled",
"type": "boolean"
},
"pixel_service_enabled": {
"$id":
"/properties/status/properties/multi_msg/properties/pixel_service_enabled",
"type": "boolean"
}
}
},
"last_successful_poll": {
"$id": "/properties/status/properties/last_successful_poll",
"type": "string",
"description": "Date and time of last successful poll"
},
"last_successful_message": {
"$id": "/properties/status/properties/last_successful_message",
"type": "string",
"description": "Date and time of last successful message"
},
"last_communication_attempt": {
"$id": "/properties/status/properties/last_communication_attempt",
"type": "string",
"description": "Date and time of last communication attempt"
}
}
}
}
}
}
Indexes:
Default unique index on
_id.dms_id and _id.update_timestamp
Additional indexes on
Location.roadway and
Location.diection
MongoDB location:
Database: gtfs_transit_avl
Collections:
gtfs_feeds
Target CSV (HDFS) and JSON (NoSQL)
Format
Data load This iteration will only handle static data related to the SunRail and Lynx GTFS feeds which are
mechanis available for manual download via their respective websites and will be loaded manually. The
m into R- later iterations will create the scripts to automate the process to get the data from the GTFS API
ICMS calls and loading into R-ICMS.
Download the file and load the data into HDFS and NoSQL manually or making use of scripts
wherever possible.
Frequency <TBD>
Process <TBD>
Notificatio
ns
Logging <TBD>
Notes For the 1st iteration the following static data will be loaded into R-ICMS environment from the
currently available SunRail and Lynx GTFS feeds
1. Agency
2. Routes
3. Stops
4. Trips
Currently, there are no API feeds for this data and the data will be loaded manually downloading
from the source and store in HDFS and NoSQL database with the help of scripts.
This data source has no accepted ICD. This data source’s attributes are documented in the Data
Sources Spreadsheet.
The GTFS static feed data is infrequently updated and not available through any API feeds, but
via manual download from the SunRail website. A manual process with the help of scripts to load
the data into the HDFS and NoSQL database will be used in iteration 1.
The R-ICMS designated system administrator will perform the following functions.
• Identify when an update is available for this dataset by checking the SunRail and Lynx
websites and comparing the available version to the previously loaded version in the data
dictionary
• Download the GTFS zip file from the SunRail and Lynx websites and place it in a specified
staging location (server and folder) within the DFE (the specified staging location data will
be stored in the configuration database)
• An automated script will read the GTFS zip file from the configured staging location,
transform the data as needed, and load it into both HDFS and the NoSQL data store
• The script will perform the following tasks
o Read the data and transform into the NoSQL document model per design and
store into NoSQL database
o Store the files in HDFS with date and timestamps appended to the filenames in a
pre-defined folder structure
o Log the execution using the common logging function
o
},
"update_timestamp": {
"$id": "/properties/_id/properties/update_timestamp",
"type": "string"
}
}
},
"agency_id": {
"$id": "/properties/agency_id",
"type": "string"
},
"agency_url": {
"$id": "/properties/agency_url",
"type": "string"
},
"agency_timezone": {
"$id": "/properties/agency_timezone",
"type": "string"
},
"agency_phone": {
"$id": "/properties/agency_phone",
"type": "string"
},
"agency_lang": {
"$id": "/properties/agency_lang",
"type": "string"
},
"stops": {
"$id": "/properties/stops",
"type": "array",
"items": {
"$id": "/properties/stops/items",
"type": "object",
"properties": {
"stop_id": {
"$id": "/properties/stops/items/properties/stop_id",
"type": "integer"
},
"stop_name": {
"$id": "/properties/stops/items/properties/stop_name",
"type": "string"
},
"stop_desc": {
"$id": "/properties/stops/items/properties/stop_desc",
"type": "string"
},
"stop_lat": {
"$id": "/properties/stops/items/properties/stop_lat",
"type": "number"
},
"stop_lon": {
"$id": "/properties/stops/items/properties/stop_lon",
"type": "number"
},
"zone_id": {
"$id": "/properties/stops/items/properties/zone_id",
"type": "integer"
},
"stop_url": {
"$id": "/properties/stops/items/properties/stop_url",
"type": "string"
},
"location_type": {
"$id": "/properties/stops/items/properties/location_type",
"type": "string"
},
"parent_station": {
"$id": "/properties/stops/items/properties/parent_station",
"type": "integer"
},
"stop_timezone": {
"$id": "/properties/stops/items/properties/stop_timezone",
"type": "string"
},
"wheelchair_boarding": {
"$id": "/properties/stops/items/properties/wheelchair_boarding",
"type": "integer"
}
}
}
},
"routes": {
"$id": "/properties/routes",
"type": "array",
"items": {
"$id": "/properties/routes/items",
"type": "object",
"properties": {
"route_id": {
"$id": "/properties/routes/items/properties/route_id",
"type": "integer"
},
"agency_id": {
"$id": "/properties/routes/items/properties/agency_id",
"type": "string"
},
"route_short_name": {
"$id": "/properties/routes/items/properties/route_short_name",
"type": "string"
},
"route_long_name": {
"$id": "/properties/routes/items/properties/route_long_name",
"type": "string"
},
"route_desc": {
"$id": "/properties/routes/items/properties/route_desc",
"type": "string"
},
"route_type": {
"$id": "/properties/routes/items/properties/route_type",
"type": "integer"
},
"route_url": {
"$id": "/properties/routes/items/properties/route_url",
"type": "string"
},
"route_color": {
"$id": "/properties/routes/items/properties/route_color",
"type": "string"
},
"route_text_color": {
"$id": "/properties/routes/items/properties/route_text_color",
"type": "string"
},
"route_sort_order": {
"$id": "/properties/routes/items/properties/route_sort_order",
"type": "integer"
}
}
}
},
"trips": {
"$id": "/properties/trips",
"type": "array",
"items": {
"$id": "/properties/trips/items",
"type": "object",
"properties": {
"route_id": {
"$id": "/properties/trips/items/properties/route_id",
"type": "integer"
},
"service_id": {
"$id": "/properties/trips/items/properties/service_id",
"type": "integer"
},
"trip_id": {
"$id": "/properties/trips/items/properties/trip_id",
"type": "string"
},
"trip_headsign": {
"$id": "/properties/trips/items/properties/trip_headsign",
"type": "string"
},
"trip_short_name": {
"$id": "/properties/trips/items/properties/trip_short_name",
"type": "string"
},
"direction_id": {
"$id": "/properties/trips/items/properties/direction_id",
"type": "integer"
},
"block_id": {
"$id": "/properties/trips/items/properties/block_id",
"type": "string"
},
"shape_id": {
"$id": "/properties/trips/items/properties/shape_id",
"type": "integer"
},
"wheelchair_accessible": {
"$id":
"/properties/trips/items/properties/wheelchair_accessible",
"type": "integer"
},
"bikes_allowed": {
"$id": "/properties/trips/items/properties/bikes_allowed",
"type": "integer"
}
}
}
}
}
}
}
Indexes:
agency_name
update_timestamp
The R-ICMS designated system administrator will perform the following functions.
• Identify when a basemap data update is available.
• Collect the data file and upload to the staging server at a designated location.
• Update the basemap on the GIS server using appropriate tools.
Location
Target Location 1. Publish the data to GIS server
2. Store the binary ZIP file in the HDFS
HDFS File store location:
/user/dev/gis/rci_number_of_lanes/<year>/<month>/<day>/number_of_lanes_<date>_<time>.zip
Target Format 1. GIS server database
2. Binary ZIP file in the HDFS
Data load 1. FTP process to bring the data into R-ICMS
mechanism into 2. Manual process to publish the data into GIS Server
R-ICMS
Frequency Weekly (The dataset is updated every Saturday)
Process <TBD>
Notifications
Logging A log record will be created in the NoSQL database each time a job is executed with the date and
timestamp details.
Notes The loading of the data into R-ICMS GIS is assumed to be a manual process. Once the file is loaded
into R-ICMS, a notification would be sent to the appropriate audience which can be configured in
the application.
This data source has no accepted ICD. The data attributes for this data source are documented
in work sheet with a name corresponding to this data source of the spreadsheet used to track
the status of the required data sources spreadsheet.
Such items can be evaluated during the project construction and consider
adding them in the final iteration.
This data source has no accepted ICD. This data source’s attributes are documented in the Data
Sources Spreadsheet.
This data source has no accepted ICD. The data attributes for this data source are documented
in work sheet with a name corresponding to this data source of the spreadsheet used to track
the status of the required data sources spreadsheet.
Such items can be evaluated during the project construction and consider adding them in
the final iteration.
This data source has no accepted ICD. This data source’s attributes are documented in the Data
Sources Spreadsheet.
3.4.1.2 Pipelines
The R-ICMS application will need to handle various data sources that flow in near real-time and
the flow should reach data consumers at the same frequency. This requirement necessitates
using a component to accomplish this within the R-ICMS environment.
Apache Kafka, a distributed streaming platform which is part of the Cloudera Hadoop stack, will
be used as the streaming component for the R-ICMS application. This component is supported
by the Cloudera license agreement. Kafka can be scaled into a cluster when workloads demand
more streaming resources.
The Apache Kafka platform will be used for building real-time data pipelines and streaming
applications within the R-ICMS application. Kafka works with the concept of Producers and
Consumers. Producers are applications that publish data to topics. The published data (often
called messages or records) is maintained in the order it was received within Kafka. Consumers
are applications that read data from topics. Multiple consumers may read from the same topic
from any starting point. For example, one consumer may feed a real-time dashboard via web
sockets and another consumer may transform and save the data to a NoSQL data store. Multiple
consumers can also be used to process data on a single topic. If a single consumer falls behind in
reading a topic, then scaling up can be achieved by increasing the number of consumers. For
example, if the consumer is doing something resource intensive with the data then the consumer
may fall behind. Increasing the number of consumers may help in this situation provided the
consumers don’t contend with each other for resources.
Within the R-ICMS environment, Kafka will be used in situations where it makes sense to do so:
• When the data source is a stream: For example, if the source is a web socket then Kafka
could be used to buffer the data for the downstream consumers
• When the message size is small: While Kafka can be configured to handle large messages,
it works best with messages that are around 10KB in size. Note that in the case of semi-
structured data, it may be possible to split the source data into smaller chunks. For
example, if the source is a REST API that returns a 10MB JSON array of objects, but each
object is only 1KB, it may be reasonable to split the array into separate objects and publish
each object to Kafka. On the other hand, if the source is a 10MB GIS shape file it would
be best not to publish that to Kafka.
• When a downstream system requires a stream: For example, a real-time dashboard
should not poll for new data but should instead be pushed new data typically via web
sockets which in turn may consume data from Kafka
• When multiple consumers need to process the same source data: For example, one
consumer may write to a NoSQL data store while another consumer may write to a
relational database while another may post to a REST API. The data need only be
published once. New consumers may be easily added to support new uses for the source
data.
Pipelines will be responsible for further storage / distribution to the other client processes as
designed by the system workflow.
a. Depending on the nature of the data, it will be transformed and stored into a
database (SQL or NOSQL)
b. One of the following approaches will be implemented to copy RAW data to HDFS
to accommodate optimal usage of HDFS block storage size and data retrieval
performance
i. A copy of the RAW data will be transformed into a suitable storage file
format for HDFS and stored on a staging HDFS server to accommodate the
configured HDFS block size. A batch job will be configured into the
Cloudera which will load the RAW block data into HDFS. The staging data
will be removed once loaded into HDFS.
ii. A copy of the RAW data will be transformed into a suitable file format for
HDFS and the data will be appended to the configured block file in HDFS
which will help in utilizing maximum block size.
iii. A copy of the RAW data will be transformed into a suitable file format for
HDFS and will be stored as archival files
c. Wherever applicable, the data will also be distributed to other clients through the
streaming component Kafka. (Ex. user interface and internal sub-components like
Modeling Engine, Rules Engine)
With a critical requirement of real-time data flow within the R-ICMS application, Kafka will be the
ideal component for implementation.
1. Each ISTIQA data source will be read by a python script, minimally transformed, and
published to its own Kafka topic. Each of these python scripts functions as a producer.
2. The only transformation that will be performed is converting the single XML document
into individual JSON objects (one per ITSIQA link), propagating the timestamp from the
XML root element into each JSON object.
3. These producers will be scheduled to run at a frequency to match the data source’s
update frequency. The ITSIQA link data producer will run daily. The traffic and
classification data producers will run every 60 seconds.
4. After the ITSIQA data has been published to Kafka topics, consumers that are aligned to
each destination will perform any additional transformations on the data and write the
data to the appropriate destinations:
a. MongoDB
Service Layer:
The GeoEvent Server will be configured to consume directly from the Kafka traffic topic to
support real-time updates in the map/UI. The GeoEvent Server will process the real-time dynamic
traffic data to sync with the pre-configured map application, which in turn will feed the user
interface.
FDOT has deployed a variety of ITS Devices which produce status updates in near real-time and
the data collected from these devices is funneled through the SunGuide system. Once received
within R-ICMS, this data needs to be distributed to various sub-systems within R-ICMS as well as
stored in the database for operational purposes.
The following are the device types from which the SunGuide will provide the status feeds.
1. Dynamic Message Signs (DMS)
2. CCTV
3. Ramp meters
Device data feeds will provide the configuration of the device and the current status of the
respective devices. Kafka streaming will be used to distribute the dynamic data in R-ICMS in the
following layers:
1. SunGuide Databus driver / client process (described in section - 3.4.1.1.1.2.3) will fetch
the data from SunGuide and publish to the Kafka streaming aligned with the respective
data topic as part of the data ingestion process. This will be the producer for the Kafka
streaming.
a. This process will be continuously receiving updates from SunGuide Databus.
2. The ingestion process will perform any necessary validations and add missing data before
publishing to the Kafka topics. The process will also perform transformations converting
the single XML document into individual JSON objects, propagating the timestamp from
the XML root element into each JSON object.
3. After the data has been published to Kafka topics, consumers that are aligned to each
destination will perform any additional transformations on the data and write the data to
the appropriate destinations:
a. MongoDB
Service Layer:
The geo event server will be configured to consume directly from the Kafka traffic topic to
support real-time updates in the map/UI. The Geo Event Server will process the real-time
dynamic data to sync with the pre-configured map application which in turn feeds to the user
interface.
GTFS - SunRail Set of HDFS CSV Files All static Transit data will be
individual stored in HDFS stored in MongoDB. A separate
CSV files within the database will be used for this
designated source.
folder Database Name:
structure gtfs_transit_location
identified by Collection Name: gtfs_feeds
data source /
sub-set name
and
chronological
order. File
names
appended
with date and
timestamp of
the process
ITSIQA Traffic Set of HDFS XML Files Real-time data will get
conditions individual stored in HDFS transformed into Document
XML files within the model and stored in NoSQL
designated database.
folder Database Name:
structure traffic_conditions
identified by Collections:
data source /
sub-set name 1. link_config
and 2. traffic_conditions
chronological 3. classification_data
order. File
names
appended
with date and
timestamp of
the process
• Next, the environment will be designated to identify which stage of the data is being
stored. This allows the same cluster for multiple environments like dev, uat and prod.
• The environment can be driven with configuration parameters within the application.
• The base Uniform Resource Locator (URL) for storage will be based on the parameters
listed above
• Each data source will be designated as a separate folder with the data source name which
will group the data files together. Within the data source, chronological order will be
assigned with sub-folders (year, month and day)
For example, ITSIQA traffic conditions files typical storage file names include:
/user/dev/traffic_conditions/2018/07/25/LinkConfig_20180725_161020.xml
/user/prod/traffic_conditions/2018/07/25/TrafficData_20180725_161020.xml
/user/dev/traffic_conditions/2018/07/25/ClassificationData_20180725_161020.xml
Each time new data is received a new file is written to HDFS and the file name will contain the
date and timestamp of that new data consistent with the examples above.
For GIS data files, the base URL will be
/user/dev/GIS/number_of_lanes/<year-month-day>/
The storage locations will be listed under each data source description.
Row Documents
Group By Aggregation
• Link_config
• Traffic_data
• Class_data
In addition, additional collections will be created to store merged / reformatted data to
support queries needed by the APIs and other clients. These collections will evolve during the
course of later iterations and will be documented within the respective iteration.
The “Store Latest” option will enable the user to either choose from an existing feature or publish
a new feature service, to use as a cache for maintaining the most recent event record for each
uniquely received LINKID. To make use of this capability, the ArcGIS Server will use a managed
enterprise geodatabase which will be created using ArcGIS Desktop or a spatiotemporal, big data
store as a module of the ArcGIS Enterprise edition.
A projection is the means by which the data will be displayed using a coordinate system and data
on a flat surface. Mathematical calculations will be used to convert the coordinate system used
on the curved surface of earth to one for a flat surface. The shape files from the FDOT ftp site
(https://ftp.fdot.gov/file/d/FTP/FDOT/co/planning/transtat/gis/shapefiles/) uses the ‘NAD 1983
UTM Zone_17n’ projection system. Therefore, all shape files used in R-ICMS will be converted to
use the same “NAD 1983 UTM Zone_17n” projection system before publishing to the ArcGIS
server.
The data flow for shape files and Geodata stores is illustrated in Figure 11 - Geodata Shape File
Data Flow:
Download Shape
files from FDOT’s Manually Import Files into Filter the FDOT shapefiles and
FTP ArcMap tools. display data for D5 district
There are three types of data services within the R-ICMS architecture. Generic Data Services
provide access to the raw, transformed, or combined data collected from the data sources. GIS
Data Services provide access to data that can be easily displayed on a map by the user interface.
R-ICMS Data Services provide access to data generated by the R-ICMS itself (including data
generated by the Modeling Engine, where appropriate).
Title GetTrafficConditions
URL
/ GetTrafficConditions/ begin_date/ end_date/include_class_data/county
URL If URL params exist, specify them in accordance with the name mentioned in the URL section. Separate into
Params optional and required.
Required:
begin_date =[date time string]
example: begin_date = ’06-10-2018 02:30 AM’
Optional
include_class_data = Boolean
example: include_class_data = true
County = []
example: [‘seminole,’orange’]
Data
NA
Params
Success
Response Example:
Code: 200
Content: {
{
"update_timestamp": "", /* Date Time */
"traffic_conditions": { /* Sub-document */
"speed": , /* Integer */
"speed_data_quality": , /* Integer */
"volume": , /* Integer */
"volume_data_quality": , /* Integer */
"occupancy": , /* Integer */
"occupancy_data_quality": , /* Integer */
"travel_time": , /* Integer */
"travel_time_data_quality": /* Integer */
},
"live_class": { /* Sub-document */
"class1": , /* Integer */
"class2": , /* Integer */
"class3": , /* Integer */
"class4": , /* Integer */
"class5": , /* Integer */
"class6": , /* Integer */
"class7": , /* Integer */
"class8": /* Integer */
}
}
]
}
}
Error
{Records not found.}
Response
});
Notes Assumptions:
• Request always specifies a date and time range for the query – mandatory
• Other filters will be used to filter the data within the specified date and time range
• Security related items will be added in the later iterations.
Title GetGTFSdata
URL
/GetGTFSdata /AgencyName/begin_date/end_date/
URL If URL params exist, specify them in accordance with name mentioned in URL section. Separate into optional
Params and required.
Required:
AgencyName = String
Example: Agency = SunRail
Data
NA
Params
Success
Response Example:
Code: 200
Content:
{
(Returned GTFS JSON objects)
} }
Error
{Records not found.}
Response
Sample Call Var response = $http.get(config.serviceUrl + '/ GetGTFSdata /' + begindate + '/' +
enddate + '/' + Agency+ ‘).error(function (data, status, headers, config) {
});
Notes Assumptions:
• Request always specifies Agency Name for the query.
• Request specifies optional date range for historic data
• When no date range is specified, then the current state of data will be made available
• Security related items will be added in the later iterations.
Title GetDMSdata
URL
/ GetDMSdata/ begin_date/ end_date/current/roadway
URL If URL params exist, specify them in accordance with name mentioned in URL section. Separate into optional
Params and required.
Optional
begin_date =[date time string]
example: begin_date = ’06-10-2018 02:30 AM’
current = Boolean
example: current = true
This is also default when date range is not present
roadway = []
example: [‘I-4’,’408’]
Data
NA
Params
Success
Response Example:
Code: 200
Content: {
(Returned DMS JSON objects)
}
}
Error
{Records not found.}
Response
Sample Call Var response = $http.get(config.serviceUrl + '/ GetDMSdata /' + begindate + '/' +
enddate + '/' + current + '/' + roadway).error(function (data, status, headers, config) {
});
Notes Assumptions:
• Request specifies optional date and time range for the query
• Request specifies optional current parameter. This will be defaulted to True, when a date range is
not specified.
• Current = True will provide the current status of the DMS signs and messages
• Other filters will be used to filter the data within the specified criteria being applied.
• Security related items will be added in the later iterations.
Once the feed definition is created, an output connector will be created to push data from
the Kafka feed into the stream service. The default update interval (in seconds) of 0.01
seconds specifies that events routed to the stream service will be batched and
broadcasted one hundred times each second, which has to be updated on the map within
3 seconds for the ITSIQA data.
A stream service will be published and an output connector will be created.
After creating the input and output connectors, a GeoEvent service will be published. The ITSIQA
data will flow from Kafka to the service layer and will be consumed by the GeoEvent service.
Figure 14 – ITSIQA GeoEvent Data Flow is the dataflow diagram for ITSIQA data.
Configure Processor to
enrich the
GeoEvents(like Field
Calculator, Buffer
Creator)
Table 15 - Stream Service Details shows the stream service API details:
Table 15 - Stream Service Details
Title StreamLayer
URL Params If URL params exist, specify them in accordance with the name mentioned in the URL
section. Separate into optional and required.
Required:
url=[string]
example: url=
https://geoeventsample1.esri.com:6443/arcgis/rest/services/LABus/StreamServer
Optional
options=[array]
example: options=
{
outFields: [ "route_id" ],
infoTemplate: new PopupTemplate({
title: "Route {route_id}",
description: "This bus is {expression/arcade-distance} miles from the convention
center.",
fieldInfos: [{
fieldName: "expression/arcade-distance",
format: {
digitSeparator: true,
places: 2
}
Data Params NA
Success What should the status code be on success and is there any returned data? This is useful
Response when people need to know what their callbacks should expect!
Example:
Code: 200
Content: { StreamLayer }
Error Response There is a problem on loading the layer. Please refresh the page and try again.
Notes None.
Title FeatureLayer
URL If URL params exist, specify them in accordance with the name mentioned in the URL section.
Params Separate into optional and required.
Required:
url=[string]
example: url=
https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Landscape_Trees/FeatureSer
ver/0
Optional
options=[array]
example: options=
{
mode: FeatureLayer.MODE_SNAPSHOT,
outFields: ["NAME", "POP2000", "POP2007", "POP00_SQMI", "POP07_SQMI"]
}
Data
NA
Params
Success What should the status code be on success and is there any returned data? This is useful when
Respons people need to to know what their callbacks should expect!
e Example:
Code: 200
Content: { FeatureLayer }
Error
Respons There is a problem on loading the layer. Please refresh the page and try again.
e
Sample
Call
var southCarolinaCounties = new
FeatureLayer("https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_C
ensus_USA/
MapServer/3",
{s
mode: FeatureLayer.MODE_SNAPSHOT,
});
Notes None.
Basemaps published in the ArcGIS server will provide the foundation to visualize and analyze data
using the ArcGIS JavaScript API from the user interface. Basemaps will be configured as a vector
tile service, which will be an ArcGIS Server web service originating from a vector tile package
in ArcGIS Pro. This vector tile service (also known as vector tile layers) will be used to share and
consume vector tiles to the map page in a web user interface. Table 17 - ArcGIS Vector Layer
Server API describes the API.
VectorTileLayer
Title
URL
/ VectorTileLayer/url/options
URL If URL params exist, specify them in accordance with the name mentioned in the URL section. Separate into
Params optional and required.
Required:
url=[string]
example: url= https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer
Optional
options=[array]
example: options=
{
maxScale:map.getScale();
}
NA
Data
Params
What should the status code be on success and is there any returned data? This is useful when people need to to
Success know what their callbacks should expect!
Example:
Response
Code: 200
Content: { VectorTileLayer }
There is a problem on loading the layer. Please refresh the page and try again.
Error
Response
None.
Notes
containers running on the nodes. In the critical design phase, it will be determined if application
management including high-availability deployment may benefit from using open source
enterprise containerization and management, such as Docker and Kubernetes, possibly re-using
the Executive Handler functionality from SunGuide, or whether to create custom orchestration
modules for this system.
Business Service will be the business interface for response plan selection, agency approval, and
activation.
While HCS7 is being evaluated as part of iteration 1, end user requirements for SOT have not yet
been finalized. As user needs are confirmed, selection and evaluation of other COTS packages
may be required to meet required needs. This evolution of SOT requirements requires a flexible
design for the SOT-BS.
The design process for SOT includes:
• Ongoing review and refinement of the SOT user requirements
• Ongoing review and evaluation of the HCS7 software
• Definition of user interactions and system functionality
• Definition of input data stores and raw data sources
• Definition of operational and output data stores
• Specification of APIs, logic, and control flow for the business service layer
• Specification of APIs, stores, and schemas for data services layer
• Selection of implementation and deployment frameworks and tools
3.4.2.12.2 Operations
Sequence diagrams have been created to illustrate the overall design of the SOT system
operations, including user interaction, API calls and control flow of the SOT-BS, and interfaces to
data stores via R-ICMS data services layer. The following sequence diagrams show detailed design
of the R-ICMS SOT system:
Figure 52 – SOT Detailed Create Corridor Sequence Diagram
Figure 53 – SOT Detailed SOT-DS Intersection Geometry Diagram
Figure 54 – SOT Detailed Modify Corridor Sequence Diagram
Figure 55 – SOT Detailed Corridor Optimization 1
Figure 56 – SOT Detailed Corridor Optimization 2
Figure 57 – SOT Detailed Deploy Corridor
Figure 58 – SOT Detailed SOT-BS Logging
Figure 73 – Timing Plan Data Service
3.4.2.12.3 Deployment
The following diagrams show the proposed deployment of physical and virtual components for
the R-ICMS, including the SOT system:
Figure 74 – Service Host Deployment Diagram
Figure 75 – Containerized Service Orchestration Diagram
3.4.2.12.4.1 SOT-BS
Development of iteration 1 will include partial implementation of the SOT-BS API. API routes,
example parameters, and functionality are listed below.
Possible invocations include:
Route: POST /api/sot/bs/v1.0/corridor
Route: PUT /api/sot/bs/v1.0/corridor/{id}
An example of a set of Body Parameters JSON is:
{Corridor: {id: 123, name: “US 441 weekly”, direction: “northbound”, maxPlans: 8,
intersections: [10, 11, 12, 13, 14, 15, 16], days: [0, 1, 1, 1, 1, 1, 0], start: “00:00”, end:
“23:50”, areaType: “other”, baseSaturationFlow: 1900, phf: 0.92}}
Possible responses to the invocation might include one of the following:
Response JSON: {code: Success, message: “Requested corridor saved”}
Response JSON: {code: CorridorInvalid, message: “Invalid corridor provided”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method validates a corridor configuration before it is inserted (POST) or updated (PUT) into
the SOT operational data store by invoking an associated data service route. This method is
triggered by the user interface when a user submits a request to save a corridor configuration.
Route: POST /api/sot/bs/v1.0/corridor/optimization/run
Example Body Parameters JSON:
{Corridor: 123, Optimization: {}}
Response JSON: {code: Success, message: “Corridor optimization is running”}
Response JSON: {code: OptimizationInvalid, message: “Invalid optimization provided”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method triggers the server-side SOT processes to run an optimization. The user interface
sends this request when the user clicks the appropriate button to run an optimization. Multiple
processes are initiated on the R-ICMS servers to handle each optimization request, and users are
notified asynchronously when all processes are complete. Servers-side functionally includes:
1. Fetch IMC demand volumes for selected historical period and the corridor activation time
2. Calculate or generate capacity for intersection movements
3. Generate and store Time Grouped Demand Clusters (TGDC) of IMC time interval data
which have similar volume/capacity profiles, for up to K timing groups, where K
represents the maximum number of timing plans to be generated by SOT
4. Generate SOT input files for each time group by combining the IMC data with intersection
geometry, signal timing parameters, and selected optimization parameters
5. Invoke the HCS7 back end in separate processes for each input file
6. Monitor for the results from each invocation of HCS7
7. Store HCS7 resultant output files
8. Extract timing plans from HCS7 results
9. Store corridor optimization results and timing plans
10. Send notifications to subscribed consumers
3.4.2.12.4.2 SOT-DS
Development of iteration 1 will include partial implementation of the SOT-DS API. API routes,
example parameters, and functionality are listed below.
Route: POST /api/sot/ds/v1.0/corridor
Route: PUT /api/sot/ds/v1.0/corridor/{id}
Example Body Parameters JSON:
{Corridor: {id: 123, name: “US 441 weekly”, direction: “northbound”, maxPlans: 8,
intersections: [10, 11, 12, 13, 14, 15, 16], days: [0, 1, 1, 1, 1, 1, 0], start: “00:00”, end:
“23:50”, areaType: “other”, baseSaturationFlow: 1900, phf: 0.92}}
Response JSON: {code: Success, message: “Requested corridor saved”}
Response JSON: {code: CorridorInvalid, message: “Invalid corridor provided”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method inserts (POST) or updates (PUT) a corridor in the SOT operational data store. This
method is triggered from the SOT business service after validation of the corridor configuration.
Route: POST /api/sot/corridor/optimization/capacity
Route: PUT /api/sot/ds/v1.0/corridor/optimization/capacity/{id}
Example Body Parameters JSON:
{Capacity: [{intersection: 123, movement: “northbound thru”, period: 1, capacity: 1260},
{intersection: 123, movement: “northbound left”, period: 1, capacity: 69}, {intersection:
123, movement: “northbound right”, period: 1, capacity: 1104}, …]}
Response JSON: {code: Success, message: “Capacity data for corridor saved”}
Response JSON: {code: CapacityError, message: “Error storing capacity for corridor”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method stores capacity for intersection movements calculated or generated for a corridor
optimization.
Route: POST /api/sot/ds/v1.0/corridor/optimization/tgdc
Route: PUT /api/sot/ds/v1.0/corridor/optimization/tgdc/{id}
Example Body Parameters JSON:
{TGDC: [{period: 1, tgdc: 1}, {period: 2, tgdc: 1}, …, {period: 13, tgdc: 2}, {period: 14, tgdc:
2}, …]}
Response JSON: {code: Success, message: “TGDC data for corridor saved”}
Response JSON: {code: TGDCError, message: “Error storing TGDC for corridor”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method stores TGDC of IMC data for historical time intervals used by a corridor optimization.
Route: POST /api/sot/ds/v1.0/corridor/optimization/input
Example Body Parameters JSON:
{File: {Path: “/path/to/input.xml”, ContentType: “application/xml”}}
Response JSON: {code: Success, message: “Input file for corridor optimization saved”}
Response JSON: {code: OptInputError, message: “Error storing optimization input file”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method stores COTS signal analysis back end input files generated for a corridor optimization
in a NoSQL document store for operational use and in HDFS for offline analytics use.
Route: POST /api/sot/ds/v1.0/corridor/optimization/output
Example Body Parameters JSON:
{File: {Path: “/path/to/output.xmll”, ContentType: “application/xml”}}
Response JSON: {code: Success, message: “Output file for corridor optimization saved”}
Response JSON: {code: OptOutputError, message: “Error storing optimization output
file”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method stores COTS signal analysis back end output files generated for a corridor
optimization in a NoSQL document store for operational use and in HDFS for offline analytics use.
Route: POST /api/sot/ds/v1.0/corridor/optimization/results
Example Body Parameters JSON:
{corridor: 123, optimization: 123, planSet: 123, createdBy: “SOT HCS7”, createTime:
“20180701-00:00:00”, moe1: 0.82, moe2: 97, recommended: “Yes”}
Response JSON: {code: Success, message: “Results for corridor optimization saved”}
Response JSON: {code: OptResultsError, message: “Error storing optimization results”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method formatted results of a corridor optimization after evaluation by the modeling
engine.
Route: POST /api/sot/ds/v1.0/corridor/optimization/plans
Example Body Parameters JSON:
{plan: 123, planSet: 123, createdBy: “SOT HCS7”, createTime: “20180701-00:00:00”,
updatedBy: “Bob Barker”, updateTime: “20180701-08:32:15”, timingPlan: {timing plan
fields…} }
Response JSON: {code: Success, message: “Timing plans for corridor optimization saved”}
Response JSON: {code: OptPlansError, message: “Error storing optimization timing
plans”}
Response JSON: {code: Unauthorized, message: “You do not have permission to perform
this operation”}
Functionality:
This method stores timing plans extracted from the results of a corridor optimization.
3.4.2.12.5.2 NOS-ST
Most COTS SOT products use file-based input/output (I/O) in a variety of formats, such as XML,
CSV, and UTDF. A MongoDB document data store is ideally suited to store these semi-structured
documents of diverse types. Document collections required for SOT:
1. SOT-Templates – This collection contains templates for optimization configurations that
may be copied and populated with static and dynamic information to generate input files
for a SOT optimization runs. These documents will be indexed by a unique template
identifier.
2. SOT-Configs – This collection contains input files generated for a SOT optimization run.
These documents will be indexed by unique identifiers for the corridor and optimization
run and the date and time that the optimization was run.
3. SOT-Results – This collection contains the resulting output files from a SOT optimization
run. These documents will be indexed by unique identifiers for the corridor and
optimization run and the date and time that the optimization was run.
3.4.2.12.5.3 FS-ST
Long-term storage of SOT data will be in the HDFS data store, where a hierarchical directory
structure will be defined to store the SOT input and output files for analytical use.
View Model
HTML
2 Way Data Binding Angular 2 Way Data Binding
Models
CSS
Controller
TypeScript
JavaScript
Angular Services
Users
Server
The overall navigation hierarchy of the application is illustrated in Figure 16 – User Interface
Navigation Hierarchy.
R-ICMS Home
Login Notifications System Admin Map Administration Help Recent Activities Logout
Legend
Info Feed Roles
Base Maps
Settings
Security
Base Map Gallrey
Lookups
Search
Audit
Zoom In/Out
Alerts
Configuration
Change Log
R-ICMS Home
Login
• The user will be able to zoom in or zoom out the map and pan the map
• The user will be able to view the basemap, static data and dynamic data on the map by
toggling the respective layers
• User will be able to view static data such as:
o RCI data
Intersections
Number of Lanes
o Schools
o Emergency Responder Locations
o Transit
• The user will be able to view dynamic data such as
o Traffic conditions
• The user will be able to view a map legend for a selected layer
The following diagram depicts the dataflow for static and dynamic data from the data store to
map page:
Web Application
Map Page Base Map Layers
Streaming Layer
Map Layer
Gateway
GeoEvent Web adaptor Web adaptor
ArcGIS Server
GeoEvent Server
Map Services
Streaming Services
Feature Services
Spatial Temporal
Enterprise
Database (Enterprise
Geodatabase
Geodatabase)
Dynamic Data
Static Data
The following screenshots show examples of the screens that users will see when viewing the
map portion of the R-ICMS.
3.4.3.2.2 Search:
Users will be able to search by address, street name, zip code and road name. The map will be
zoomed in/out to an extent to show all the search results. Figure 21 - Search Screen depicts the
screen used to search.
3.4.3.2.4 Home
Users will have the ability to go back to the default extent when the Home button is selected.
Figure 23 - Home button highlights the icon used to return to the home screen.
3.4.3.2.6.3 Basemap
Users will be able to choose the basemaps from the basemap list as shown in Figure 27 - Basemap
Selection.
3.4.3.2.6.4 Legend
Users will be able to view the legend for a selected layer, as shown in Figure 28 - Legend Selection.
3.4.3.2.6.5 Navigation
Figure 29 - Navigation shows the navigation between screens.
Login
R-ICMS Home
Legend
Info Feed Roles
Base Maps
Settings
Security
Search
Lookups
Zoom In/Out
Audit
Alerts
Configuration
Change Log
Figure 29 - Navigation
Figure 30 - Navigation
Alerts will be displayed prominently to get the user’s attention and indicate that some action
needs to be performed.
Logger S ingleton
Logger.txt
• Agency for State Technology (AST) Chapter 74-2 F.A.C., Information Technology Security,
also known as the Florida Cybersecurity Standards (FCS)
Table 19 - Hardware Configuration describes the servers and the layers they are assigned to.
Table 19 - Hardware Configuration
Server details # Virtual / Configuration Layer
machines Physical
SQL DB Server – 1 2 V 128 GB / 8 Core / 4 TB Data Store
GIS DB Server - 1 RAID 10
ArcGIS Server – 1 2 V 128 GB / 16 Core / 1 TB Data Store
Geo Event Server -1 RAID 10
GIS App Server – 1 3 V 64 GB / 8 Core / 1 TB Data/Business
Business Services Server – 1 RAID 10 Services
Gateway Server - 1
Web Servers – 2 4 V 128 GB / 16 Core / 4 TB Data/Business
Application Servers - 2 RAID 10 Services
ISP
External Data
Source Servers
Services
COTS Components
Data Stores
User Interfaces
External Actors
Common Components
3.7.1 Security
Security is essential to the functionality of the R-ICMS. This section contains the relevant
diagrams concerning the security processes needed to ensure data is accessed in a secure
manner. The following diagrams are intended to show how the security processes will work
throughout the system such that following diagrams will not have to specifically reference
security features.
Exchanges of credentials/tokens and other data between users and the gateway are performed
over HTTPS to prevent sniffing.
3.7.1.1 Login
Figure 34 - Login Sequence Diagram shows the system login process. User login requests are authenticated via Active Directory/ Lightweight Directory
Access Protocol (LDAP), and active sessions are represented internally as signed tokens containing user permissions.
In
Active Data
UI GW SAS Memory
Directory Store
Cache
New Token Request
w/Token
New Token Request
w/Token
Validate Token
Valid Credentials?
Yes
Permission Request
Permissions
New Token
New Token
In
Auth
User UI GW DS/BS Memory
Library
Cache
Data Reques t
Data Reques t
w/Token
Data Reques t
w/Token Token and
Required
Permissions
Token
Signing Key
Validate Permissions
Authorization
Response
Data Response
Data Response
In
Data
UI GW SAS Memory
Store
Cache
New Token Request
w/Token
New Token Request
w/Token
Validate Token
Permission Request
Permissions
New Token
New Token
Data
User UI GW UP-BS
UP
Store
Save View
Save View
Save View
View
Parameters
View Saved
View Saved
View Saved
Load View
Load View
Load View
Get View
View Parameters
View Parameters
View Parameters
Update View
<<include>>
System
Administrator
Summary User is able to view the map, map navigation and legend
Actors
Primary System User
Secondary None
Pre-conditions The user must be logged into the system and have privileges to access the map
feature
Main Scenario
Trigger User Interaction
1. The use case begins when the user selects the function to view the map
Typical Events 2. The system displays the Map
3. Use case ends
Includes View Map Details, View GIS Layers
Input None
Output Map View
Alternate Scenarios
Refresh the map
1. During the basic flow, [system displays the map], the user may select to
Variants refresh the page
2. The system will refresh the contents displayed on the map and the use
case continues in the basic flow at [system displays the map]
Zoom In and Out
1. During the basic flow, [system displays the map], the user may select to
change the zoom (in/out)
2. The system will adjust the view to the user selected zoom level and the
use case continues in the basic flow at [system displays the map]
Pan
1. During the basic flow, [system displays the map], the user may select to
pan the map to view a different area by using the click and drag or
map overview methods
2. The system will adjust the view to the user selected pan location and the
use case continues in the basic flow at [system displays the map]
Home View
1. During the basic flow, [system displays the map], the user may select to
return to the default view
2. The system will adjust the view to the system default zoom and location
view and the use case continues in the basic flow at [system displays
the map]
Search
1. During the basic flow, [system displays the map], the user may search
using the parameters configured for the respective layers/features
2. The system will perform the search and display the results on the map and
the use case continues in the basic flow at [system displays the map]
Extends / Uses View GIS Layers
Post-conditions Map is displayed
Frequency User driven
Exceptions User cancels the use case. The use case ends
Related Use Cases None
Actors
Primary System User
Secondary None
Pre-conditions The user must be logged into the system and have privileges to use the map
feature
Main Scenario
Trigger User Interaction
1. The use case begins when the user selects the function to view map
layers
2. The system displays the available layers
Typical Events
3. User selects/deselects layers
4. Map displays user selected layers
5. The use case ends
Includes None
Input Selection of desired layers
Output Map is displayed with user selected layers
Alternate Scenarios
View Legend
1. During the basic flow, [system displays the available layers], the user may
Variants select to view the map legend
2. The system will display the legend and the use case continues in the basic
flow at [system displays the available layers]
View Sublayers
1. During the basic flow, [system displays the available layers], the user may
select to view the map sublayers
2. The system will display the sublayers that exist for each map layer and the
use case continues in the basic flow at [system displays the available
layers]
Extends / Uses Events, Weather, Traffic, Device, Parking Data
Post-conditions Map is displayed with user selected layers
Frequency User driven
Exceptions User cancels the use case. The use case ends
Related Use Cases None
Output The map displays the detail of the user selected item
Alternate Scenarios
Variants Close details
Extends / Uses None
Post-conditions None
Frequency User driven
No details available.
Exceptions User cancels the use case.
The use case ends
Related Use Cases None
Traffic Data
Traffic Data
List/Table Display
Map Display
Subscription
Confirmation
Subscription
Confirmation
loop Update
as data becomes available Update
Update
Draw Updates
Data
User UI GW PipeLine
Services
Subscription
Confirmation
Subscription
Confirmation
Event Update
Draw Updates
Event Update
[EM-BS]
[BRE-BS]
Manage approval and
Determine A ssociated RPs with MOEs RP Selection Relevant RP
activat ion of R es ponse
Respon se Pl ans
Pl ans
Provide RPs
MOEs
SG Datab us
[IDS]
In cident Detect ion
System
[EM]
Notify Operator
Event Update Event Managemen t Create New Event Op erator Deci sion
Subsystem
SG Operat or
Unrelated SG Event created (Unrelated to ICM)
Agency Agency
Pipelines DF E EM-DS EM-BS BRE-BS GEO-DS GW UI
User User
view map
correlate / create
ICM event
ICM event
ICM event
ICM event
view event
detail from map
event list
view event
detail from list
edit event
ICM event
ICM event
ICM External
DFE BRE-BS Gateway UI Manager system
validate config(s)
Non-vali dated Failure modes:
• Rules that never will be triggered,
e.g. RPE eligibil ity date/time differs
BR config
from BR effectiv e date/time
BR activation
Activate BR
BR status
start BR
monitor
BR activation
time
Corridor
DFE EM-DS BRE-BS PRE-BS ME EVE-BS EM-BS GW UI Manager
Event Stream
Check rules,
select plans
RP eligibility filter
RP set w/
timign plans
RP set
simulations
RP Set MOEs
Evaluated RPs
RP Selection
Alert
View RP set
Evaluated RPs
Evaluated RPs
RP Selection
Select RP
Status
Fetch RPE Profiles
RPE Profiles
RP Approval
Status, RP approve, comment
Comments
View approved
RP status
RP/RPE Approval Status
RP Activation
Activate RP
Status
RP Activation
Alerts (email)
Activate RP
View activated
RP status
RP Activation
Status
View activated
RP status
RP Activation
Status
Corridor
DF E PRE-BS ME EVE-BS EM-BS GW UI Manager
RP Activation
Activate RP
Status
reevaluation timer
reevaluate RP Set
fetch RP Set
RP Set w/
timing plans
RP eligibility filter
RP set
RP set
simulations
Plan MOEs
RP set and MOEs
Evaluated RPs
RP rank changed?
RP Approval
Alert
View RP set
Evaluated RPs
Traffic
Pipelines DF E SOT-BS HCS7 PRE-BS ME EVE-BS
Engineer
Intersection
movement
counts
Traffic data
Fetch current
timing plans
Timing plans
HCS CLI/files
Service Gateway
User Interface
run SOT
SOT plans
Simulations
view, sign
Traffic
Pipelines DFE SOT-BS HCS7 PRE-BS ME EVE-BS
Engineer
Intersection
movement
counts
Traffic data
Optimize corridor
Fetch datetime
range, corridor
Intersection
movement
counts
(5 min ints) cluster IMC time
inervals by demand
Fetch current
timing plans
Timing plans
HCS CLI/files
Service Gateway
User Interface
run SOT
SOT plans
Simulations
view, sign
Traffic
Pipelines DFE SOT-BS HCS7 PRE-BS ME EVE-BS
Engineer
Intersection
movement
counts
Traffic data
Recommended plans
view, modify
Simulations
Service Gateway
User Interface
Simulation Result Data
Recommended plans
view, sign
Includes Notification
Input Test input data and corridor configuration for the test corridor
Output The user is notified that the optimization run has completed
Alternate Scenarios
Variants None
Extends / Uses None
Post-conditions None
Frequency User driven
Exceptions User cancels the use case. The use case ends
Related Use Cases None
In
External Active Data
GW SAS Memory
User Directory Store
Cache
Login Request
w/Credentials
Login Request
w/Credentials
Valid Credentials?
Yes
Permission Request
Permissions
Generate Token
Token
Token
External Data
UI GW DS
User Store
Data Request
Data Request
Data Request
Data Response
Data Response
Data Response
External
GW DS PipeLine
User
Subscription
Request
Subscription
Request
Subscription
Confirmation
Subscription
Confirmation
loop Update
as data becomes available Update
Update
External Data
GW MD-DS
User Store
Data Request
Data Request
Data Request
Data Response
Data Response
Data Response
ICM External
DFE BRE-BS Gateway UI Manager system
validate config(s)
Non-vali dated Failure modes:
• Rules that never will be triggered,
e.g. RPE eligibil ity date/time differs
BR config
from BR effectiv e date/time
BR activation
Activate BR
BR status
start BR
monitor
BR activation
time
ICM External
DFE RP-BS Gateway UI Manager system
RP bulk load
Bulk loading of response plans may be
a separate standalone utility, rather
RP file(s) selection
than a UI.
RP config file(s)
w/ RPE details If needed, rules should be defined for
prompting user to overwriting
validate config(s) existing files.
RP config(s),
RPE details
Parking Data
List/Table Display
Map Display
No
This diagram shows how the R-ICMS generates No
alerts for approval of a RPE using agency profiles.
Response
Plan Element
Auto
approve/activate
IEN alert process
timer No
Yes
IEN session w/
permission exists?
Yes Yes
No Yes
Default
Device Profile Agency Profile
Profile
Profile has IEN
No
approval?
Yes Yes
Yes
Yes
Note: Multiple profiles may exist for a device or agency Yes
which apply during specific day and time range or during a
blank “all remaining times” range. Has auto approve/
reject delay?
Snooze
Snooze timer
Login
View RP
status feed
RP Approval Status Feed
activate RP
Activated RP
Online Offline
ORC-BS ALT-BS GW UI Subscriber Subscriber
Alert (IEN)
Alert (email)
Snooze
Snooze timer
Login
Alert (IEN)
Alert (IEN)
Data
User UI GW LOG-CC DS/BS
Stores
Data Request
Data Request
Save Log
Data Request
Log Request
Save Log
Data Request
Data Response
Save Log
Data Response
Log Response
Code and Duration
Save Log
Data Response
Data
MON-CC LOG-CC ALT-CC
Store
loop
on a timer
Metrics Request
Metrics Response
opt
issue detected
Log Issue
Create Alert
<<Artifact>>
User Interface
<<device>> <<device>>
Driver Node Data Store Node
<<device>> <<device>>
<<Artifact>> SOT Runner Node Gateway Node
<<Artifact>>
ITSIQA Ingestor MongoDB
<<Artifact>> <<Artifact>>
<<Artifact>>
SOT
<<device>> <<device>>
Data Distribution Node Data Store Node
<<Artifact>> <<Artifact>>
Kafka HDFS
<<device>>
Data Service Node
<<Artifact>>
<<device>> Static GIS Data
Service
Data Store Node
<<Artifact>> <<Artifact>>
Dynamic GIS Data
ArcGIS Server
Service
<<environment>> <<environment>>
Service X Pod Auth Pod
<<environment>> <<environment>>
Key-Value Store
Service X Container
<<device>> Container
<<Artifact>> Data Distribution Node <<Artifact>>
Service X Redis
Executable
<<environment>>
Pipeline Pod
<<environment>> <<environment>>
<<environment>>
Filebeat Container Filebeat Container
Pipeline Container
<<device>>
Monitoring Node
4 Notes
4.1 Definitions
• Component – Generally, a part of some larger system or product
1. Traffic system component – Part of the transportation system, such as a DMS or a
traffic sensor
2. Architectural components – Part of the designed implementation architecture,
such as a service, a data store, a pipeline, or a user interface
• Corridor – Except where used in the title of this system, an acyclic set of coordinated
neighboring signalized intersections
• Layer –
1. A set of services/capabilities within the design architecture that provides similar
capabilities and that interact in similar ways with other layers
2. A set of viewable artifacts on a map interface that can be turned on or off (i.e.,
made visible or invisible to the user)
• Response Plan – A set of response plan elements which can be considered for
implementation in response to traffic conditions
• Response Plan Element – A specific change that can be made to controllable elements of
the traffic network; e.g., activation of a signal timing plan or putting a set of message
elements on a DMS
• Special Event – A future planned event; e.g., parade, football game
• Subsystem – generally a system that is part of a larger system
1. One of the three parts of the R-ICMS identified in the original Invitation to
Negotiate (the IEN, DSS, and DFE)
2. A part of SunGuide dealing with specific types of activities or data
Appendix A