Algorithmusformat für codierte Polylinien

Die Polyliniencodierung ist ein verlustbehafteter Komprimierungsalgorithmus, mit dem Sie eine Reihe von Koordinaten als einzelnen String speichern können. Punktkoordinaten werden mit Werten mit Vorzeichen codiert. Wenn Sie nur wenige statische Punkte haben, können Sie auch das interaktive Dienstprogramm zur Codierung von Polylinien verwenden.

Bei der Codierung wird ein Binärwert mithilfe des bekannten base64-Codierungsschemas in eine Reihe von Zeichencodes für ASCII-Zeichen umgewandelt. Damit diese Zeichen richtig angezeigt werden, wird den codierten Werten vor der Umwandlung in ASCII der Wert 63 (ASCII-Zeichen „?“) vorangestellt. Der Algorithmus prüft auch auf zusätzliche Zeichencodes für einen bestimmten Punkt. Dazu wird das niedrigstwertige Bit jeder Bytegruppe geprüft. Wenn dieses Bit auf 1 gesetzt ist, ist der Punkt noch nicht vollständig definiert und es müssen zusätzliche Daten folgen.

Um Platz zu sparen, beinhalten die Punkte nur den Versatz vom vorherigen Punkt (mit Ausnahme des ersten Punkts). Alle Punkte werden in Base64 als vorzeichenbehaftete Ganzzahlen codiert, da Breiten- und Längengrade Werte mit Vorzeichen sind. Das Codierungsformat innerhalb einer Polylinie muss zwei Koordinaten für Breiten- und Längengrad mit einer angemessenen Genauigkeit darstellen. Bei einem maximalen Längengrad von +/- 180 Grad mit einer Genauigkeit von fünf Dezimalstellen (180,00000 bis -180,00000) ist ein binärer 32-Bit-Ganzzahlwert mit Vorzeichen erforderlich.

Der umgekehrte Schrägstrich wird in Stringliteralen als Escapezeichen interpretiert. Bei der Ausgabe dieses Dienstprogramms sollten umgekehrte Schrägstriche innerhalb von Stringliteralen in doppelte umgekehrte Schrägstriche konvertiert werden.

Die Schritte zur Codierung eines solchen Werts mit Vorzeichen sind nachfolgend beschrieben.

  1. Verwenden Sie den anfänglichen vorzeichenbehafteten Wert:
    -179.9832104
  2. Multiplizieren Sie den Dezimalwert mit 1e5 und runden Sie das Ergebnis:
    -17998321
  3. Wandeln Sie den Dezimalwert in einen Binärwert um. Beachten Sie, dass ein negativer Wert mithilfe seiner Zweierkomplemente berechnet werden muss. Dazu invertieren Sie den Binärwert und addieren 1 zum Ergebnis:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
    
  4. Verschieben Sie den Binärwert um ein Bit nach links:
    11111101 11011010 10111100 00011110
  5. Wenn der ursprüngliche Dezimalwert negativ ist, diese Codierung invertieren:
    00000010 00100101 01000011 11100001
  6. Teilen Sie den Binärwert in 5-Bit-Blöcke auf (beginnend auf der rechten Seite):
    00001 00010 01010 10000 11111 00001
  7. Ordnen Sie die 5-Bit-Blöcke in umgekehrter Reihenfolge an:
    00001 11111 10000 01010 00010 00001
  8. ODER jeden Wert mit 0 x 20, wenn ein weiterer Bit-Chunk folgt:
    100001 111111 110000 101010 100010 000001
  9. Konvertieren Sie jeden Wert in einen Dezimalwert:
    33 63 48 42 34 1
  10. Addieren Sie zu jedem Wert 63:
    96 126 111 105 97 64
  11. Konvertieren Sie jeden Wert in seine ASCII-Entsprechung:
    `~oia@

Die folgende Tabelle zeigt einige Beispiele für codierte Punkte, wobei die Codierungen als eine Reihe von Versätzen gegenüber vorherigen Punkten angezeigt werden.

Beispiel

Punkte: (38.5, -120.2), (40.7, -120.95), (43.252, -126.453)

Breitengrad Längengrad Breitengrad in E5 Längengrad in E5 Änderung des Breitengrads Änderung des Längengrads Codierter Breitengrad Codierter Längengrad Codierter Punkt
38,5 -120,2 3850000 -12020000 +3850000 -12020000 _p~iF ~ps|U _p~iF~ps|U
40,7 -120,95 4070000 -12095000 +220000 -75000 _ulL nnqC _ulLnnqC
43,252 -126,453 4325200 -12645300 +255200 -550300 _mqN vxq`@ _mqNvxq`@

Codierte Polylinie: _p~iF~ps|U_ulLnnqC_mqNvxq`@