ポリライン エンコードは不可逆圧縮アルゴリズムであり、一連の座標を 1 つの文字列として保存できます。ポイント座標は、符号付き値を使用してエンコードされます。静的な点が少ない場合は、インタラクティブなポリライン エンコード ユーティリティを使用することもできます。
エンコード プロセスでは、一般的な base64 エンコード スキームを使用して、バイナリ値が ASCII 文字の一連の文字コードに変換されます。これらの文字が正しく表示されるようにするため、エンコードされた値は 63(ASCII 文字「?」)で合計されてから ASCII に変換されます。アルゴリズムは、各バイトグループの最下位ビットをチェックすることで、指定されたポイントの追加文字コードもチェックします。このビットが 1 に設定されている場合、ポイントはまだ完全な形ではなく、追加のデータが続く必要があります。
また、スペースを節約するために、各ポイントには前のポイントからのオフセットのみが含まれます(最初のポイントを除く)。緯度と経度は符号付き値であるため、すべてのポイントは符号付き整数として Base64 でエンコードされます。ポリライン内のエンコード形式では、緯度と経度を表す 2 つの座標を妥当な精度で表す必要があります。最大経度が +/- 180 度、小数点以下 5 桁の精度(180.00000 ~-180.00000)の場合、32 ビット符号付き 2 進整数値が必要になります。
バックスラッシュは、文字列リテラル内ではエスケープ文字として解釈されます。このユーティリティの出力では、文字列リテラル内のバックスラッシュ文字を二重バックスラッシュに変換する必要があります。
符号付きの値をエンコードする手順は、以下のように定められています。
- 最初の符号付き値を取得します。
-179.9832104
- 小数値に 1e5 を掛けて、結果を丸めます。
-17998321
- 10 進数を 2 進数に変換します。負の値は、
2 の補数を使用して、2 進値を反転して結果に 1 を加算して計算する必要があります。
00000001 00010010 10100001 11110001 11111110 11101101 01011110 00001110 11111110 11101101 01011110 00001111
- バイナリ値を 1 ビット左にシフトします。
11111101 11011010 10111100 00011110
- 元の 10 進値が負の場合は、次のエンコードを反転します。
00000010 00100101 01000011 11100001
- バイナリ値を(右側から)5 ビットのチャンクに分割します。
00001 00010 01010 10000 11111 00001
- 5 ビットのチャンクを逆の順序に配置します。
00001 11111 10000 01010 00010 00001
- 別のビットチャンクが続く場合は、各値を 0x20 で OR 演算します。
100001 111111 110000 101010 100010 000001
- 各値を 10 進数に変換します。
33 63 48 42 34 1
- 各値に 63 を足します。
96 126 111 105 97 64
- 各値を対応する ASCII に変換します。
`~oia@
以下の表は、エンコードされたポイントの例をいくつか示し、前のポイントからの一連のオフセットとしてエンコードを示しています。
例
地点: (38.5, -120.2), (40.7, -120.95), (43.252, -126.453)
緯度 | 経度 | E5 での緯度 | E5 での経度 | 緯度の変化 | 経度の変化 | エンコードされた緯度 | エンコードされた経度 | エンコードされた点 |
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`@ |
エンコード済みポリライン: _p~iF~ps|U_ulLnnqC_mqNvxq`@