Restrukturiert die vom
Segmenter
erzeugten Informationen,
so dass diese performant und platzsparend von einem Routing-Algo
verwendet werden koennen.
Das Ergebnis ist eine einzige Routing-Datei. Mandatory-Infos
befinden sich in der Binaerdatei vorne, so dass diese mittels
InStream
performant geladen werden koennen.
Die Reihenfolge ist:
- Header
GraphHeader
(Version, Anzahl Entities, FilePointer, etc.)
- EdgeEntries
VarInt
Zeiger auf Kreuzungen. SourceVertexId-1=Index
- Edges
Edge
sortiert nach SourceVertexId, angereichert um zwei
DeadEdges als Sentinels am Anfang und Ende der Liste.
Aufeinanderfolgende Edges mit gleicher SourceVertexId bilden eine
Kreuzung von wegfuehrenden Kanten.
- VertexClasses
VarByte
VertexId-1=Index
- Geometries
IndexOpt
von LatLons
SegmentId-1=Index
- EdgeNames
IndexSeqOpt
von VarString
SegmentId-1=Index
- Custom Extensions
Gelesene Segmente werden vom Builder in Edges (Hin- und Rueckrichtung),
also 2x geschrieben. Ungerade EdgeIDs sind die Originale,
wohingegen gerade IDs immer die Rueckrichtung bilden.
Die Zaehlung beginnt bei 1. Das heisst die Reverse-Edge hat die Id 2.
Ferner wird in das EdgeID-Bit(32) die Information isOneWay() hineinkodiert.
Hieraus ergibt sich folgendes Bit-Muster:
0x.......1 => Hinweg, kein OneWay
0x.......0 => Rueckweg, kein OneWay
0x8......1 => OneWay ist Hinweg
0x8......0 => OneWay ist Rueckweg (WrongWay)
Java-seitig ist dies rueckwirkend folgendermassen ermittelbar
boolean isWrongWay = (edgeId & 0x80000001) == 0x80000000;
boolean isOneWay = (edgeId & 0x80000000) != 0 // oder == 0x80000000;
int segmentId = (edgeId & 0x7FFFFFFF) + 1 >>> 1; // Durch 2
Nach Fertigstellung der Graph-Datei wird
GraphBuildInterceptor.close(File)
gerufen, so dass hier nachgelagert zum Beispiel Extensions mittels
addExtension(File, byte, byte, Var)
hinzugefuegt werden koennen.
Alternativ hierzu kann dies auch ueber den letzten Verarbeitungsschritt automatisch
konfiguriert werden. Hierzu muessen Extensions entweder als Beans aus
Config.getBean(String)
oder als Dateien vorliegen und vom Typ
VarBean
oder
Var
sein. Bei letzterem muss dem Mechanismus zusaetzlich die
typeId
bekannt gemacht werden. Config Beispiel:
graph.build.addex.X=filePath|beanName,id,clazz[,typeId]
wobei X ein Zaehler-Schluessel (1-256) ist.
Unter
id
und
clazz
werden die Daten dann im Graphen
gespeichert und koennen spaeter wieder mittels
Graph.getExtension(byte, byte)
oder
Graph.loadExtension(byte, byte)
herausgeholt werden