概要
惑星間ファイルシステム(IPFS)に置かれたファイルのサイズを測る、という話です。
背景
オープンナガサキから公開された三次元点群データをクラウド最適化ポイントクラウド形式に変換して惑星間ファイルシステムに置くということを国連オープンGISイニシアティブのスマートマップ作業部会の活動である「Smart Maps Bazaar」として行なっています。
ファイルサイズを測るというタスクを通じて、Smart Maps Bazaarによるファイルアクセスの方法を説明してみます。goによるIPFS実装であるkubo
とruby
が導入された環境での作業になります。
結論から先に
- クラウド最適化した長崎点群のサイズは約147GBでした。
- 詳細値は size_all.csvに、各ファイルのサイズは size.csvにおいています。
- このエントリでご案内する成果の全てはoptgeo/free-nagasaki-statsに置いてあります。
ステップ1: 長崎点群(クラウド最適化版)のCIDリストをとる
長崎点群(クラウド最適化版)のCIDリストは https://raw.githubusercontent.com/optgeo/free-nagasaki/main/convert/dst/list.csv にご用意しています。
これをcurl
で取ってきてパーズしながらipfs
コマンドでアクセスしていくというやり方をこれから使っていきます。
ステップ2: Smart Maps Bazaar にコネクトする
長崎点群のCIDが分かれば、原理的にはipfs
コマンドでファイルにアクセスできることになりますが、実際には、そのCIDオブジェクトを持っているノードに実際に接続するのに時間がかかってしまいます。
そこで出てくるのが Smart Maps Bazaar です。
Smart Maps Bazaar は、次のことを目指したIPFSノードです。
- 地理空間情報を共有したいIPFSノードが接続するノードとなる、
- 惑星間ファイルシステムに格納された地理空間情報をウェブに取り出すためのゲートウェイとして働く
ホスト名としては smb.optgeo.org という名前を持っています。
Smart Maps Bazaarノードに自分のノードを接続するためには、次のようにすることができます。
curl --silent https://unopengis.github.io/smb/connect.sh | sh
ステップ3: ファイルサイズを調べる
目的とするファイルのCIDが分かり、Smart Maps Bazaarノードに接続することができたので、あとは次のコマンドを使えばファイルサイズが取得できます。
ipfs files stat --size /ipfs/#{cid}
自動処理
実際には、次のRakefileとsize.rbを使って自動処理をしました。
task :default do
sh <<-EOS
curl --silent https://raw.githubusercontent.com/optgeo/free-nagasaki/main/convert/dst/list.csv |
ruby size.rb
EOS
end
require 'filesize'
w = File.open('size.csv', 'w')
w_all = File.open('size_all.csv', 'w')
size_all = 0
while gets
(fn, cid) = $_.strip.split(',')
size = `ipfs files stat --size /ipfs/#{cid}`.to_i
size_all += size
human = Filesize.from("#{size} B").pretty
w.print [fn, cid, size, human].join(','), "\n"
print [fn, cid, size, human].join(','), "\n"
end
w_all.print [size_all, Filesize.from("#{size_all} B").pretty].join(','), "\n"
print [size_all, Filesize.from("#{size_all} B").pretty].join(','), "\n"
w.close
w_all.close
終わりに
ここまでお読みくださり、ありがとうございます。
クラウド最適化した長崎点群のカタログサイトをfree-nagasaki-collectionに作っています。
また、長崎点群のうt長崎港まわりについてまとめて見ることができるようリンクを作ってみました。下図のような表示が可能です。