エンコード ポリライン アルゴリズム形式

ポリラインのエンコードとは、一連の座標を単一文字列として保存できる非可逆圧縮アルゴリズムです。各点の座標は、符号付き値を使ってエンコードされます。静的な点が少ししかない場合は、インタラクティブ ポリライン エンコード ユーテリティを使用することもできます。

エンコード処理では、おなじみの base64 エンコード方式を使用して、バイナリ値が一連の ASCII 文字コードに変換されます。変換後の文字が正しく表示されるよう、エンコードされた値に 63 (ASCII 文字の '?')が加算さてから、ASCII 文字コードに変換されます。また、このアルゴリズムでは特定の点の後に文字コードが続いているかどうかを確認するために、各バイト グループの最下位ビットをチェックします。最下位ビットが 1 に設定されている場合、各点の変換がまだすべて終わっていないため、後続の追加データを変換する必要があります。

さらに、領域を節約するために、各点は前の点からのオフセットのみを含みます(先頭の点は除きます)。緯度と経度は符号付きの値になるため、すべての点は Base64 で符号付き整数としてエンコードされます。ポリライン内のエンコード形式では、緯度と経度を表す 2 つの座標を適切な精度で表現する必要があります。+/- 180 度の最大経度を小数点以下 5 位までの精度(180.00000 ~ -180.00000)で表現するとしたら、32 ビットの符号付きバイナリ整数値が必要になります。

文字列リテラル内では、バックスラッシュがエスケープ文字として解釈されるため注意してください。このユーティリティの出力では、文字列リテラル内のバックスラッシュ文字は 2 つの連続するバックスラッシュに変換されます。

符号付きの値をエンコードする手順は、以下のように定められています。

  1. 先頭の符号付き値を取得します。
    -179.9832104
  2. この 10 進値に 1e5 を乗算し、結果を丸めます。
    -17998321
  3. この 10 進値をバイナリに変換します。負の値は、2 の補数(以下のようにバイナリ値をビット反転し、その結果に 1 を加算)を使って計算する必要があります。
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
  4. このバイナリ値を左に 1 ビットシフトします。
    11111101 11011010 10111100 00011110
  5. 元の 10 進値が負の場合は、このエンコードをビット反転します。
    00000010 00100101 01000011 11100001
  6. このバイナリ値を 5 ビットずつのブロックに分割します(右端のビットから始めます)。
    00001 00010 01010 10000 11111 00001
  7. 5 ビット ブロックの場所を逆順に並べ替えます。
    00001 11111 10000 01010 00010 00001
  8. 後続のビット ブロックがあるブロックには 0x20 を OR 演算します。
    100001 111111 110000 101010 100010 000001
  9. 各値を 10 進値に変換します。
    33 63 48 42 34 1
  10. 各値に 63 を加算します。
    96 126 111 105 97 64
  11. 各値を対応する 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`@

フィードバックを送信...