2008/02/17
ロカポーターのしくみ(3)
3.データ途中の精度変更
高度を考えて見てください。仮にデータが1メートル単位として、地上付近では1メートル精度のデータが欲しい。でも飛行機で上空へ行けば10m単位や100m単位でも問題ない。このデータをどうやって混在させればよいのか。
高度 欲しい精度
00001 1m
00002 1m
00003 1m
00010 10m
00020 10m
00100 10m
01000 1000m
02000 1000m
05000 1000m
ロカポーターには答えがあります。
ロカポータ圧縮の前提は、「固定長文字列であること」ですので、その「固定長」の長さを途中で変えてしまえばいいのです。つまり、
高度 欲しい精度
00001 1m
00002 1m
00003 1m
0001(0) 10m
0002(0) 10m
0010(0) 10m
01(000) 1000m
02(000) 1000m
05(000) 1000m
の3つのセットに分けます。括弧の中は精度を落とせば不要となるデータです。
ところが、単に括弧の中を省略すれだけでは、不十分です。例えば、1000m精度のつもりの「01」が5桁の固定長と思われて「***01」と解釈されてしまいます。
そこで、精度を落とす記号を導入します。
高度 欲しい精度
00001 1m
00002 1m
00003 1m
0001_ 10m <- 固定長5桁をこのデータ以降、1桁落として
(アンダースコアが1つ)固定長4桁に変更
0002 10m
0003 10m
01__ 100m <- 固定長4桁をこのデータ以降、2桁落として
(アンダースコアが2つ)固定長2桁に変更
02 100m
05 100m
省略すると
00001 00001
00002 2
00003 3
0001_ 1_
0002 2
0003 3
01__ 1__
02 2
05 5
仮にこれらのデータをカンマ区切りでつなげてみるとこうなります。
(実際はカンマの部分には緯度経度など他のデータが入り込むことになります。)
00001,2,3,1_,2,3,1__,2,5
ちなみに可変精度を使わないと
00001,2,3,10,20,30,100,200,300
となります。
逆に精度を高めていくには、固定長の長さを増やします。
これにもアンダースコアを使いますが、現データの後に、アンダースコア+増加するデータを加えます。
高度 欲しい精度
05000 1000m
02000 1000m
01000 1000m
00100 10m
00020 10m
00010 10m
00003 1m
00002 1m
00001 1m
上記のデータは精度を変更すると、次のようになる。
高度 欲しい精度
05 1000m
02 1000m
01 1000m
00_10 10m <- 固定長2桁をこのデータ以降、2桁増やして
(アンダースコアの後の値が2つ)固定長4桁に変更
0002 10m
0001 10m
0000_3 1m <- 固定長4桁をこのデータ以降、1桁増やして
(アンダースコアの後の値が1つ)固定長5桁に変更
00002 1m
00001 1m
圧縮すると次のようになる。
05 05
02 2
01 1
00_10 0_10
0002 02
0001 1
0000_3 0_3
00002 2
00001 1
カンマ区切りでつなげてみるとこうなります。
(実際はカンマの部分には緯度経度など他のデータが入り込むことになります。)
05,2,1,0_10,02,1,0_3,2,1
ちなみに可変精度を使わないと
05000,2000,1000,0100,020,10,03,2,1
となります。
圧縮のアイデアは、このように高度のデータについて考えている時に出てきました。
当初は対数を使って、地上付近を密に、上空を粗くするコード体系を用意していたのですが、精度を可変にすることで、1番目のデータのみフル精度が必要であり、あとは好きな桁に落とせば良いことから、もっとも扱いやすい10進法のまま高度を扱うことにしました。
以上の
・固定長データの圧縮
・不定長データの接続
・精度記号によるデータの接続
が基本的なロカポーターの実装に必要なロジックとなります。
続く
高度を考えて見てください。仮にデータが1メートル単位として、地上付近では1メートル精度のデータが欲しい。でも飛行機で上空へ行けば10m単位や100m単位でも問題ない。このデータをどうやって混在させればよいのか。
高度 欲しい精度
00001 1m
00002 1m
00003 1m
00010 10m
00020 10m
00100 10m
01000 1000m
02000 1000m
05000 1000m
ロカポーターには答えがあります。
ロカポータ圧縮の前提は、「固定長文字列であること」ですので、その「固定長」の長さを途中で変えてしまえばいいのです。つまり、
高度 欲しい精度
00001 1m
00002 1m
00003 1m
0001(0) 10m
0002(0) 10m
0010(0) 10m
01(000) 1000m
02(000) 1000m
05(000) 1000m
の3つのセットに分けます。括弧の中は精度を落とせば不要となるデータです。
ところが、単に括弧の中を省略すれだけでは、不十分です。例えば、1000m精度のつもりの「01」が5桁の固定長と思われて「***01」と解釈されてしまいます。
そこで、精度を落とす記号を導入します。
高度 欲しい精度
00001 1m
00002 1m
00003 1m
0001_ 10m <- 固定長5桁をこのデータ以降、1桁落として
(アンダースコアが1つ)固定長4桁に変更
0002 10m
0003 10m
01__ 100m <- 固定長4桁をこのデータ以降、2桁落として
(アンダースコアが2つ)固定長2桁に変更
02 100m
05 100m
省略すると
00001 00001
00002 2
00003 3
0001_ 1_
0002 2
0003 3
01__ 1__
02 2
05 5
仮にこれらのデータをカンマ区切りでつなげてみるとこうなります。
(実際はカンマの部分には緯度経度など他のデータが入り込むことになります。)
00001,2,3,1_,2,3,1__,2,5
ちなみに可変精度を使わないと
00001,2,3,10,20,30,100,200,300
となります。
逆に精度を高めていくには、固定長の長さを増やします。
これにもアンダースコアを使いますが、現データの後に、アンダースコア+増加するデータを加えます。
高度 欲しい精度
05000 1000m
02000 1000m
01000 1000m
00100 10m
00020 10m
00010 10m
00003 1m
00002 1m
00001 1m
上記のデータは精度を変更すると、次のようになる。
高度 欲しい精度
05 1000m
02 1000m
01 1000m
00_10 10m <- 固定長2桁をこのデータ以降、2桁増やして
(アンダースコアの後の値が2つ)固定長4桁に変更
0002 10m
0001 10m
0000_3 1m <- 固定長4桁をこのデータ以降、1桁増やして
(アンダースコアの後の値が1つ)固定長5桁に変更
00002 1m
00001 1m
圧縮すると次のようになる。
05 05
02 2
01 1
00_10 0_10
0002 02
0001 1
0000_3 0_3
00002 2
00001 1
カンマ区切りでつなげてみるとこうなります。
(実際はカンマの部分には緯度経度など他のデータが入り込むことになります。)
05,2,1,0_10,02,1,0_3,2,1
ちなみに可変精度を使わないと
05000,2000,1000,0100,020,10,03,2,1
となります。
圧縮のアイデアは、このように高度のデータについて考えている時に出てきました。
当初は対数を使って、地上付近を密に、上空を粗くするコード体系を用意していたのですが、精度を可変にすることで、1番目のデータのみフル精度が必要であり、あとは好きな桁に落とせば良いことから、もっとも扱いやすい10進法のまま高度を扱うことにしました。
以上の
・固定長データの圧縮
・不定長データの接続
・精度記号によるデータの接続
が基本的なロカポーターの実装に必要なロジックとなります。
続く