Die Polyliniencodierung ist ein verlustfreier 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.
Beim Codierungsprozess wird ein Binärwert mithilfe des bekannten base64-Codierungsschemas in eine Reihe von Zeichencodes für ASCII-Zeichen konvertiert: Um eine korrekte Anzeige dieser Zeichen zu gewährleisten, werden codierte Werte vor der Konvertierung in ASCII mit 63 addiert (ASCII-Zeichen ');?'. Der Algorithmus prüft auch auf zusätzliche Zeichencodes für einen bestimmten Punkt. Dazu wird das am wenigsten signifikante 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.
Damit der Platz gespart wird, enthalten die Punkte nur den Versatz vom vorherigen Punkt (mit Ausnahme des ersten Punkts). Alle Punkte sind in Base64 als vorzeichenbehaftete Ganzzahlen codiert, da Breiten- und Längengrade vorzeichenbehaftete Werte sind. Das Codierungsformat innerhalb einer Polylinie muss zwei Koordinaten darstellen, die den Längen- und Breitengrad mit einer angemessenen Genauigkeit darstellen. Bei einem maximalen Längengrad von +/- 180 Grad mit einer Genauigkeit von 5 Dezimalstellen (180,00000 bis -180,00000) ist ein binärer 32-Bit-Ganzzahlwert mit Vorzeichen erforderlich.
Beachten Sie, dass der umgekehrte Schrägstrich in String-Literalen als Escape-Zeichen interpretiert wird. Jede Ausgabe dieses Dienstprogramms muss umgekehrte Schrägstriche in String-Literale in doppelte umgekehrte Schrägstriche umwandeln.
Die Schritte zur Codierung eines solchen Werts mit Vorzeichen sind nachfolgend beschrieben.
- Nehmen Sie den vorzeichenbehafteten Anfangswert:
-179.9832104 - Multiplizieren Sie den Dezimalwert mit 1e5 und runden Sie das Ergebnis:
-17998321 - Wandeln Sie den Dezimalwert in einen Binärwert um. Ein negativer Wert muss anhand seines Zweierkomplements berechnet werden, indem der Binärwert invertiert und dem Ergebnis hinzugefügt wird:
00000001 00010010 10100001 11110001
11111111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 - Verschieben Sie den Binärwert um ein Bit nach links:
11111101 11011010 10111100 00011110 - Wenn der ursprüngliche Dezimalwert negativ ist, vertauschen Sie die Codierung:
00000010 00100101 01000011 11100001 - Teilen Sie den Binärwert in 5-Bit-Blöcke auf (beginnen Sie auf der rechten Seite):
00001 00010 01010 10000 11111 00001 - Platzieren Sie die 5-Bit-Blöcke in umgekehrter Reihenfolge:
00001 11111 10000 01010 00010 00001 - ODER jeder Wert mit 0x20, wenn ein weiterer Bit-Block folgt:
100001 111111 110000 101010 100010 000001 - Wandeln Sie jeden Wert in Dezimalzahl um:
33 63 48 42 34 1 - Fügen Sie jedem Wert 63 hinzu:
96 126 111 105 97 64 - Konvertieren Sie jeden Wert in das ASCII-Äquivalent:
`~oia@
Die folgende Tabelle zeigt einige Beispiele für codierte Punkte, die die Codierungen als eine Reihe von Offsets von vorherigen Punkten darstellen.
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`@