IVIM
Look for the current version via the link in the table at the message-type introduction page
As of mid november 2024, Mobilidata has changed version regarding AMQP headers (version 0.9 to 1.0). This is caused by changes in the C-Roads (TF4 spec release 2.1.0) specification.
The messages have been upgraded to C-Roads 2.1.0 spec 1.3.1, but the protocolversion incorrectly mentions spec 1.2.1. The message contents of both these versions are identical.
The incorrect version in the metadata will be updated at a later time with an update to the next C-Roads release.
ETSI TS 103 301 specification of version 1.2.1 can be found here. Alternatively, the specification that is used right now can be downloaded from here.
Description
IVI messages are particularly designed to provide 'static' information, like roadsigns (warnings, informational, prohibitations, maximum speeds). The more or less dynamic information from matrix signs is also presented in IVI messages.
These messages can contain information about multiple roadsigns over all different lanes of a single road, and can therefore vary from a simple message to a very complex one. All within the straight definition. Clever usage of the OPTIONAL and multiple values generates compact messages, better suited for the lossy mobile connections.
Usage
IVI messages consists of several containers in a defined structure. The standard used within Mobilidata and Talking Traffic environment are set according to the following conventions. The starting points are:
- All fields, declared as used in this document, are always present in the IVI files in the TT environment.
- If a field is not relevant, the corresponding “unavailable” code is added, or in, for example, applicable lanes, all the lanes are mentioned.
- The flexibility of the IVI definition is used to reduce data traffic, a maximum level of merging road signs is to be achieved.
- Both the usage of delta lat/long’s and absolute lat/long’s are acceptable, preference is delta.
- All zones are connected to their own reference (starting) point, except for the case where there is a mutual reference point.
- Different IVI messages for different source information: It is not a requirement to combine information from different originating sources.
Figure: Graphical example of starting points and required information: (In this case the speed limitations and overtake prohibitions are from different sources, resulting in two different IVI messages.)

Data packages are encoded/decoded to ASN.1 standard, using the 'UPER' encoding rules.
Attributes
"IVIStructure": {
...
"Optional":
{
"Glc": {
"ReferencePosition": {
"Latitude": 509838648,
"Longitude": 37973288,
...
"Altitude": {
"AltitudeValue": 800001,
"AltitudeConfidence": 15
}
...
},
...
},
},
Glc or GeographicLocationContainer describes the location of the event.
ReferencePosition describes the exact location of the event and contains the coordinate in Latitude, Longitude and Altitude. It also contains extra information on the accuracy of the measurement.
To get the values of Latitude and Longitude in WGS84, the following calculation has to be applied: WGS84 Latitude = Latitude * 1e-7 and WGS84 Longitude = Longitude * 1e-7.
"IVIStructure": {
...
"Optional":
{
"Glc": {
...
"Parts": [
{
"ZoneId": 1,
"LaneNumber": null,
"ZoneExtension": null,
"ZoneHeading": 2075,
"Zone": {
"Segment": {
"Line": {
"DeltaPositions": [
{
"DeltaLatitude": -318,
"DeltaLongitude": -166
},
{
"DeltaLatitude": -323,
"DeltaLongitude": -149
},
{
"DeltaLatitude": -163,
"DeltaLongitude": -69
},
...
]
},
...
},
},
...
},
],
...
},
},
}
Parts desribes the segment and zone the IVIM impacts. This contains a Parts field with multiple line string, described as delta values from the position of the event (ReferencePosition).
"IviStructure": {
...
"Optional": [
{
...
"Gic": [
{
"RoadSignCodes": [
{
"LayoutComponentId": null,
"Code": {
"Iso14823": {
"PictogramCode": {
"CountryCode": null,
"ServiceCategoryCode": {
"TrafficSignPictogram": 1,
"PublicFacilitiesPictogram": null,
"AmbientOrRoadConditionPictogram": null
},
"PictogramCategoryCode": {
"Nature": 5,
"SerialNumber": 57
},
"Attributes": null
},
"Attributes": [
{
"Dtm": null,
"Edt": null,
"Dfl": null,
"Ved": null,
"Spe": {
"Spm": 30,
"Mns": null,
"Unit": []
},
"Roi": null,
"Dbv": null,
"Ddd": null
}
]
},
"ViennaConvention": null,
"ItisCodes": null,
"AnyCatalogue": null
}
}
],
...
},
...
},
}
The 'RoadSignCodes' describes the road sign and has different extra attributes. The Nature and SerialNumber combination describes the exact pictogram of this road sign.
In the extra attributes the field Spe desribes the speed limit of the segment of road. Spm describes the actual max speed limit. The following table gives an overview of the possible combinations that are in use.
| Nature | SerialNumber | Symbol | Description |
|---|---|---|---|
| 5 | 57 | Speed limit indication | |
| 6 | 59 | X | Red cross, lane closed |
| 6 | 60 | ↓ | Green arrow, lane open |
| 6 | 61 | ↙ | Green arrow left, move to left |
| 6 | 62 | ↘ | Green arrow right, move to right |
Example
An extended description of the IVIM ASN.1 can be found here.
IVIM AMQP Header example
{
"custom-mobilidata-useCase": ",1,",
"custom-mobilidata-publisherType": "PIP",
"custom-mobilidata-dynamicSignType": "Zone30",
"quadTree": ",120202120302003310,",
"custom-mobilidata-dtapEnvironment": "production",
"originatingCountry": "BE",
"iviType": ",1,",
"publisherId": "BE00004",
"messageType": "IVIM",
"protocolVersion": "IVIM:1.2.1",
"publicationId": "BE00004:IVIM_DYNAMIC_ZONE_30_01",
"custom-mobilidata-timestamp": "1710751539415",
"custom-mobilidata-baselineVersion": "1.0.0",
"baselineVersion": "2.1.0",
"shardCount": "1",
"shardId": "1",
"iviContainer": ",giv,glc,"
}
When receiving a IVIM message, the AMQP header will contain some extra information that is not included in the IVIM message itself. This information can be used to filter and process the message.
custom-mobilidata-useCase: This contains the use case of the IVIM message.custom-mobilidata-dynamic-sign-type: This contains the type of road sign that is being described in the IVIM message. Possible values areZone30orMatrix.quadTree: This contains the quadtree of the location of the event. This can be used to filter the message on the location based on quadkeys.
IVIM Message example
- ASN.1
- JSON
010600000001b80000003c78918d80e135246360384d4918d8a08f5022019000000440c0a39090f00aa04371c36c69f947ffffff08eddd0fc0dfe00c081b006bfd82ffacbfd78ffb53feb8ffdd3feb8ffe03feb6ffe23feb2ffe4bfd68ffd03feb0ffeb3fd62ffddbfd60ffe73fd60fff0bfd5afff9bfd5d0002bfe4d00068
{
"Header": {
"ProtocolVersion": 1,
"MessageID": 6,
"StationID": 1
},
"IVIStructure": {
"Mandatory": {
"ServiceProviderId": {
"CountryCode": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
],
"ProviderIdentifier": 0
},
"IviIdentificationNumber": 3871,
"TimeStamp": 625144291637,
"ValidFrom": 625144291637,
"ValidTo": 625144891637,
"ConnectedIviStructures": null,
"IviStatus": 0
},
"Optional": [
{
"Glc": null,
"Giv": [
{
"DetectionZoneIds": null,
"ItsRrid": null,
"RelevanceZoneIds": [1],
"Direction": 0,
"DriverAwarenessZoneIds": null,
"MinimumAwarenessTime": null,
"ApplicableLanes": [1],
"IviType": 1,
"IviPurpose": null,
"LaneStatus": null,
"CompleteVehicleCharacteristics": null,
"DriverCharacteristics": null,
"LayoutId": null,
"PreStoredlayoutId": null,
"RoadSignCodes": [
{
"LayoutComponentId": null,
"Code": {
"Iso14823": {
"PictogramCode": {
"CountryCode": null,
"ServiceCategoryCode": {
"TrafficSignPictogram": 1,
"PublicFacilitiesPictogram": null,
"AmbientOrRoadConditionPictogram": null
},
"PictogramCategoryCode": {
"Nature": 5,
"SerialNumber": 57
},
"Attributes": null
},
"Attributes": [
{
"Dtm": null,
"Edt": null,
"Dfl": null,
"Ved": null,
"Spe": {
"Spm": 30,
"Mns": null,
"Unit": []
},
"Roi": null,
"Dbv": null,
"Ddd": null
}
]
},
"ViennaConvention": null,
"ItisCodes": null,
"AnyCatalogue": null
}
}
],
"ExtraText": null
}
],
"Rcc": null,
"Tc": null,
"Lac": null
},
{
"Glc": {
"ReferencePosition": {
"Latitude": 509838648,
"Longitude": 37973288,
"PositionConfidenceEllipse": {
"SemiMajorConfidence": 4095,
"SemiMajorOrientation": 3601,
"SemiMinorConfidence": 4095
},
"Altitude": {
"AltitudeValue": 800001,
"AltitudeConfidence": 15
}
},
"ReferencePositionTime": null,
"ReferencePositionHeading": {
"HeadingValue": 2075,
"HeadingConfidence": 127
},
"ReferencePositionSpeed": null,
"Parts": [
{
"ZoneId": 1,
"LaneNumber": null,
"ZoneExtension": null,
"ZoneHeading": 2075,
"Zone": {
"Segment": {
"Line": {
"DeltaPositions": [
{
"DeltaLatitude": -318,
"DeltaLongitude": -166
},
{
"DeltaLatitude": -323,
"DeltaLongitude": -149
},
{
"DeltaLatitude": -163,
"DeltaLongitude": -69
},
{
"DeltaLatitude": -163,
"DeltaLongitude": -63
},
{
"DeltaLatitude": -164,
"DeltaLongitude": -59
},
{
"DeltaLatitude": -166,
"DeltaLongitude": -54
},
{
"DeltaLatitude": -331,
"DeltaLongitude": -95
},
{
"DeltaLatitude": -167,
"DeltaLongitude": -41
},
{
"DeltaLatitude": -334,
"DeltaLongitude": -68
},
{
"DeltaLatitude": -335,
"DeltaLongitude": -49
},
{
"DeltaLatitude": -335,
"DeltaLongitude": -30
},
{
"DeltaLatitude": -338,
"DeltaLongitude": -12
},
{
"DeltaLatitude": -337,
"DeltaLongitude": 6
},
{
"DeltaLatitude": -217,
"DeltaLongitude": 14
}
],
"DeltaPositionsWithAltitude": null,
"AbsolutePositions": null,
"AbsolutePositionsWithAltitude": null
},
"LaneWidth": null
},
"Area": null,
"ComputedSegment": null
}
}
]
},
"Giv": null,
"Rcc": null,
"Tc": null,
"Lac": null
}
]
}
}