-
Notifications
You must be signed in to change notification settings - Fork 1
Comment utiliser DATEX II
Le standard DATEX II peut être un peu intimidant à première vue. Cette documentation a pour objectif de vous l'approprier.
DATEX II est un standard de format d'échange de données au format XML pour le trafic routier.
La version 3.2 du standard a ajouté un schéma de réglementation routière : TrafficRegulation.
DiaLog utilise ce schéma comme format d'échange de données avec les services numériques d'aide au déplacement.
On l'a dit, DATEX II est un format XML.
Si, comme nous, vous aviez plutôt l'habitude d'échanger des données JSON, cela pourrait vous intimider : allez-vous devoir vous plonger dans le monde de SOAP, J2E, et autre bus MOM ? Restons calmes. En effet, DATEX II baigne dans cet environnement-là (la documentation Developers' corner ne mentionne que JAXB, l'outil Java pour lier son code à du XML), pour nos besoins, vous n'aurez pas besoin de vous reconvertir au Java.
Il va en revanche vous falloir quelques bases sur le XML.
Commencez par ici : Learn XML in Y Minutes.
- Cette petite page vous montrera les bases de la syntaxe XML.
- Vous devriez en sortir à l'aise sur ces notions :
- Elément
- Attribut
- Noeuds enfants, nesting
- Document bien formé (wellformed document).
C'est bon ? Alors voici un exemple de document XML. Que décrit-il ?
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
On pourrait dire qu'il décrit une bibliothèque contenant 3 livres. Chaque livre a une catégorie, ainsi qu'un titre, un auteur, une année de publication, et un prix.
Vu de loin, XML ressemble à HTML. Mais XML est différent de HTML. Contrairement à HTML, XML ne décrit pas comment afficher des données ; il décrit les données elles-mêmes.
XML fournit en fait un cadre complet pour le transport de données sur le Web.
Passons à la pratique :
- Démarrez votre éditeur de texte favori. Assurez-vous qu'il dispose d'outils ou d'extensions adéquates pour travailler avec XML.
- Collez le XML ci-dessus dans un fichier
bookstore.xml
.
Voici alors quelques petits exercices :
- Essayez d'ajouter un 4ème livre de votre choix.
- Comment pourrait-on ajouter une information sur la maison d'édition des livres ?
Pour aller plus loin, parcourez le tutoriel XML du W3C.
Un schéma XSD (pour Schema Definition Language) permettent de définir le schéma auquel doit se conformer un message XML. En quelque sorte, XSD est à XML ce que JSONSchema est à JSON.
Là aussi, le meilleur apprentissage est probablement la pratique.
Alors suivez le tutoriel XSD du W3C.
Vous devriez en sortir à l'aise sur les notions suivantes :
- Définir un namespace dans le fichier XSD :
xmlns
ettargetNamespace
; - Utiliser un schéma XSD dans un fichier XML :
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
,xmlns="{namespace}"
etxsi:schemaLocation="{namespace} {fichier.xsd}"
; - Utiliser un schéma XSD par alias :
xmlns:monalias="{namespace}"
puis référencer les éléments par<monalias:un-element-exemple>
; - Définir un élément avec
<xs:element>
; - Définir un objet avec
<xs:element>
,<xs:complexType>
et<xs:sequence>
; - Définir une liste avec
<xs:element>
,<xs:complexType>
,<xs:sequence>
et<xs:element minOccurs="..." maxOccurs="...">
; - Définir un attribut avec
<xs:attribute>
; Où faut-il le placer dans un<xs:complexType>
?Réponse
Directement en enfant du xs:complexType, et xs:sequence. - Définir un enum avec
<xs:simpleType>
,<xs:restriction
> et<xs:enumeration>
;
Faites alors l'exercice :
- Quel schéma XSD pourrait-on proposer pour le
bookstore.xml
? - Comment faut-il modifier
bookstore.xml
pour que l'élément racine<bookstore>
soit validé avec ce schéma ? - Modifier
bookstore.xml
pour qu'il utilise les éléments debookstore.xsd
avec un aliasb
, par exemple<b:bookstore>
.
Cliquer pour voir une solution
books.xsd
:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="https://example.org"
targetNamespace="https://example.org"
elementFormDefault="qualified"
>
<xs:simpleType name="CategoryEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="WEB"></xs:enumeration>
<xs:enumeration value="COOKING"></xs:enumeration>
<xs:enumeration value="CHILDREN"></xs:enumeration>
<xs:enumeration value="GEOGRAPHY"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Book">
<xs:sequence>
<xs:element name="title">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="lang" type="xs:string"></xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="author" type="xs:string"></xs:element>
<xs:element name="year" type="xs:gYear"></xs:element>
<xs:element name="price" type="xs:float"></xs:element>
</xs:sequence>
<xs:attribute name="category" type="xs:string"></xs:attribute>
</xs:complexType>
<xs:complexType name="Bookstore">
<xs:sequence>
<xs:element name="book" type="Book" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="bookstore" type="Bookstore"></xs:element>
</xs:schema>
bookstore.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore
xmlns="https://example.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://example.org bookstore.xsd"
>
<!-- ... -->
</bookstore>
Une fois les bases du XML assimilées, vous devriez mieux pouvoir naviguer dans le standard DATEX II.
En effet, tout compte fait, DATEX II fournit essentiellement un ensemble de schémas XSD. Ces schémas permettent de valider qu'un contenu XML est conforme au standard.
Nous avons ajouté les schémas XSD que DiaLog utilise dans spec/datex2.
Voici à nouveau quelques exercices :
- Inspectez
example.xml
. De quel type de publication DATEX II s'agit-il ? - Modifiez le fichier pour que les éléments issus de http://datex2.eu/schema/3/common soient utilisés non plus avec
com:{élément}
maisc:{élément}
. - À quoi ressemblerait un fichier XML qui décrit une
SituationPublication
?
Malheureusement, la page téléchargements de DATEX II ne fournit pas des schémas XSD valides. Arrivez-vous à savoir pourquoi ? Indice : les schémas utilisent des alias non-définis...
Par ailleurs, cette page ne fournit que les fichiers XSD individuels, mais certains schémas dépendent eux-mêmes d'autres schémas.
La solution est de recourir au Webtool fourni par DATEX II pour générer la sous-partie de DATEX II qui nous intéresse.
Si d'aventure vous deviez récupérer à nouveau ces schémas, voici comment procéder.
- Ouvrir le Webtool.
- Dans "1. Source", choisir V3.3 DATEX II.
- Cliquer sur "Next" jusqu'à arriver à l'écran "5. Sélection".
- Dans "5. Selection", vérifier que seul TrafficRegulationPublication est coché, puis cliquer sur "Next".
- Dans "6. Options", s'assurer que XML est coché, puis cliquer sur "Next" pour télécharger le
.zip
avec les schémas XSD.
La page DATEX II Model permet de naviguer dans le format de données DATEX II représenté avec le langage de modélisation UML.
Utiliser une réglementation AccessRestriction
de type noEntry
.
<trafficRegulation>
<typeOfRegulation xsi:type="AccessRestriction">
<accessRestrictionType>noEntry</accessRestrictionType>
</typeOfRegulation>
<!-- ... -->
</trafficRegulation>
[À clarifier]
Deux possibilités pour définir un sens en particulier :
- SingleRoadLinearLocation (extends LinearLocation) > linearWithinLinearElement: LinearElementWithinLinear > directionOnLinearSection: DirectionEnum (aligned, opposite, bothWays, allDirections, ...)
- PointLocation (extends NetworkLocation) > pointAlongLinearElement: PointAlongLienarElement > directionAtPoint: DirectionEnum
- OpenLrPointLocationReference > openlrOrientation: enum (withLineDirection, againstLineDirection, both, noOrientationOrUnknown)
L'enum DirectionEnum
ne permet de définir qu'un sens par rapport à un autre : "sens normal" ou "sens du linearElement"
- Pour
directionOnLinearSection
etdirectionAtPoint
:- Par exemple, "aligned" signifie "same direction as the normal direction of flow on the road network".
- Mais quel est alors la "normal direction of flow" ?
- 👉 DATEX II semble supposer une connaissance externe du réseau routier. Les GPS en disposent-ils ?
- Pour les variantes
relative*
: "Direction of traffic flow relative to the direction in which the linear element is defined"
Utiliser une réglementation DirectionRestriction
de type aheadOnly
<trafficRegulation>
<typeOfRegulation xsi:type="DirectionRestriction">
<directionRestrictionType>aheadOnly</directionRestrictionType>
</typeOfRegulation>
<!-- ... -->
</trafficRegulation>
Le type de réglementation AlternateRoadOrCarriagewayOrLaneLayout
définit "une réglementation où une route / voie a temporairement une autre disposition". Utile en cas de travaux par exemple.
Schéma :
trafficRegulation:
typeOfRegulation: # xsi:type="AlternateRoadOrCarriagewayOrLaneLayout"
## This class describes a regulation where a road/carriageway/lane has temporarily another layout.
deviationToHardshoulder: bool # Traffic lanes move across to the right [...]
deviationToOtherCarrriageway: bool # The road turns over the oncoming lane
mergedToOtherLane: bool # Closure of a traffic lane, two lanes to one.
roadOrCarriagewayOrLaneLayoutType: enum (road, lane, carriageway)
newLayout: LinearLocation
Dans DATEX II, les informations liées au réseau routier peuvent être spécifiées dans PointLocation
ou LinearLocation
# DATEII_3_LocationReferencing.xsd
PointLocation | LinearLocation (extends NetworkLocation):
supplementaryPositionalDescription: # SupplementaryPositionalDescription
carriageway: # Carriageway
carriageway*: enum
originalNumberOfLanes: int?
lane: # Lane[]
- laneNumber: int?
laneUsage: enum? (allLanesCompleteCarriageway, leftLane, middleLane, rightLane, emergencyLane, ...)
roadInformation: # RoadInformation[]
- roadDestination: str? (ex: "Lille")
roadName: str? (ex: "Autoroute du Nord")
roadNumber: str? (ex: "A1")
À partir d'un nom de rue, numéro de début, numéro de fin
- Là où il faut définir une
LocationReference
, utiliser la varianteSingleRoadLinearLocation
avec.linearWithinLinearElement
(extends SingleRoadLinearElement, extends LinearElement, extends NetworkLocation, extends Location)- Indiquer le nom de la rue dans
.linearElement.roadName
- Indiquer (le cas échéant) la direction concernée par rapport au sens défini par
.fromPoint -> .toPoint
dans.directionRelativeOnLinearSection
- Indiquer un début dans
.fromPoint
- Utiliser le type
DistanceFromLinearElementReferent
- Géocoder le numéro de début (obtenir ses coordonnées GPS lat-lon)
- Définir
.fromReferent
- Placer les coodonnées GPS dans
.pointCoordinates
- Placer les coodonnées GPS dans
- Définir
.distanceAlong: 0
(0 mètres à partir du point ainsi défini, c'est-à-dire le point lui-même)
- Utiliser le type
- Indiquer une fin dans
.toPoint
, même format quefromPoint
- Indiquer le nom de la rue dans
- Ajouter d'éventuelles informations "humaines" (nom de rue, identifiant de rue (D123, N122, etc), numéros de début et de fin) dans
.supplementaryPositionalDescription.roadInformation[].roadName/Number
Exemple
<implementedLocation xsi:type="loc:SingleRoadLinearLocation">
<loc:linearWithinLinearElement>
<loc:linearElement></loc:linearElement>
<loc:fromPoint xsi:type="loc:DistanceFromLinearElementReferent">
<loc:distanceAlong>0</loc:distanceAlong>
<loc:fromReferent>
<!-- DATEX II exige un identifiant unique sur ce segment, on utilise 'lat,lon' -->
<loc:referentIdentifier>47.366334,-1.944703</loc:referentIdentifier>
<loc:referentType>referenceMarker</loc:referentType>
<loc:pointCoordinates>
<loc:latitude>47.366334</loc:latitude>
<loc:longitude>-1.944703</loc:longitude>
</loc:pointCoordinates>
</loc:fromReferent>
</loc:fromPoint>
<loc:toPoint xsi:type="loc:DistanceFromLinearElementReferent">
<loc:distanceAlong>0</loc:distanceAlong>
<loc:fromReferent>
<loc:referentIdentifier>47.370631,-1.94021</loc:referentIdentifier>
<loc:referentType>referenceMarker</loc:referentType>
<loc:pointCoordinates>
<loc:latitude>47.370631</loc:latitude>
<loc:longitude>-1.94021</loc:longitude>
</loc:pointCoordinates>
</loc:fromReferent>
</loc:toPoint>
</loc:linearWithinLinearElement>
</implementedLocation>
Par exemple, "Au coin de la pharmacie", ou "À partir du parking à vélo"
C'est possible avec le champ locationDescription (String)
de SupplementaryPositionalDescription
.
A priori trop humain pour être utilisé par un calculateur d'itinéraire... Mais peut tout de même être affiché ?
Ces différentes ressources vous permettront d'en savoir plus sur DATEX II et les composants utilisés dans le cadre de DiaLog.
Tutoriels
- XML Tutorial, w3chools.com. (Notamment les sections "XML Tutorial", "XSD Schema" et "XSD Data Type" dans la barre latérale.)
Introductions
- La Norme Européenne DATEX II, Cerema, publié le 30/01/2019.
Documentation officielle