2022年3月31日木曜日

Tiling Point Clouds (las)

Cesium ion を利用せず、CesiumJS で las を取り込みたい。座標変換で位置も合わせたい。何かないでしょうか?

検索したら、引っ掛かりました。
https://stackoverflow.com/questions/67199138/how-to-convert-las-file-to-3d-tiles-so-it-can-render-by-cesium-not-use-cesium-io

試したところ、gocesiumtiler だけが Win10 でも動作しました。
https://github.com/mfbonfigli/gocesiumtiler

Go言語ですが、ビルドするだけなので特別な知識は必要なし。インストール後にプロンプトから go build を打つだけです。作者に感謝!

変換コマンドも1行で簡単。先の静岡の点群データに対しては以下の通り。

./gocesiumtiler -i ./input -o ./output -e 2450 -maxpts 100000 -z 2.5 -geoid -folder -recursive
-e は 変換元のEPSG コードの指定を意味し、続く 2450 が JGD2000 8系のコードです。JGD2011 は含まれていませんでした。追加方法を後日探りましょう。
-z は 高さの補正。そのままでは2mほど埋まったので、2.5m高くしました。地形の入れ替えも探らないと。

できたタイルを Cesium に追加。
const tileset0 = new Cesium.Cesium3DTileset({
  url: "./output/08OF6123/tileset.json",
});
viewer.scene.primitives.add(tileset0);
これで表示されました。簡単です。
タイルにしても詳細を表示させるにはやや重いのですが、許容範囲。点群 viewer としてWebGIS を利用できるようになったのは一歩前進です。

2022年3月26日土曜日

Cesium で点群表示

点群の共有(Viewer)に Cesium が使えるかも?と思い立ち、テストしてみました。

点群は静岡県のMMSを利用。G空間情報センターに掲載されているデータです。
08OF6123.las 4GB

Cesium で共有するなら 3D tile が軽くて良さそう、ということで QGIS の出番。
レイヤーから点群レイヤーを追加→ Qgis2threejs プラグインでシーンを gltf に保存。
https://plugins.qgis.org/plugins/Qgis2threejs/

ダメでした。
表示拡大率そのままで書き出されるので、拡大した際に点群が詳細になりません。
拡大してから書き出すと、途中で落ちます。QGIS なので重い作業はダメなのでしょう。

あきらめて、Cesium ion で変換。
サーバー側での変換は体感で20分くらいでしょうか(測定していませんでした)。
位置は手合わせですね。緯度・経度ならうまくいくのでしょうか?
https://community.cesium.com/t/point-cloud-georeferencing-cesium-ion/10766
ま、アップロードが必要な時点で仕事では使えそうにないですが。

変換されたタイルを Cesium for Unreal で取り込みましたが、エラー。

[TileContentFactory.cpp:112] No loader registered for tile with content type 'application/octet-stream' and magic value 'pnts'.

まだプラグインでサポートされていないようです。
https://community.cesium.com/t/are-point-clouds-supported/12845/5

では、Cesium で。
npm start してから js に変数部分のコードを張り付けて viewer に add するだけ。と思いきや、表示されません。トークンですね。
Cesium ion にアクセスしてフルコードをGET。 Sandcastle で表示されたアクセストークンを貼り付けたら、表示されました。

 
Cesium ion での LAS の位置合わせ、Cesium での 3D タイルの標高合わせ、点の大きさ変更。この3点は今後修正したいですね。


npm

npm, yarn ともに Node.js のパッケージマネージャー。

yarn は npmでインストール。npm は Node.js のインストール段階で入ります。yarn の方が新しいとのこと。Node.js は JavaScript の実行環境です。

初心者なので、npm から。これまでの復習です。

package.json を作成(全てyesで作成)
$ npm init -y

パッケージのローカルインストール
$ npm install aaa
(同時に package.json に aaa が記載される)
Ver指定あり
$ npm install aaa@1.2.3
グローバルインストール(npm-check-updates をどこからでも使いたい場合)
$ npm install -g npm-check-updates

package.json に記載されたパッケージをインストール(別の場所に復元する場合などに利用)
$ npm install
package.json に記載されたVer.にアップデート
$ npm update

パッケージのアップデート(npm-check-updates の利用)
$ ncu -u

package.json 内の scripts.startを実行
$ npm start
("start": "node server.js" と記載されていたら、サーバーが立ち上がる)

****************************
20220331追記
Cesium で localhost を IP に変更すると、つながりませんでした。
$ node server.cjs --public=true
でつながりました。
https://community.cesium.com/t/setting-up-a-cesium-server-using-other-than-localhost/3729

TerriaJS

PLATEAU では、Cesium+TerriaJS が利用されています。

次は TerriaJS を試してみましょう、と公式に沿って Ubuntu 20.04 に入れようとしたのですが、yarn が入リませんでした。なぜか node v10が入っており、古すぎたようです。
上げましょう。
 
Node Ver. UP
$ curl -sL https://deb.nodesource.com/setup_lts.x | sudo bash -
$ sudo apt-get install -y nodejs

n(Node のVer.管理)のインストール
$ npm install -g n
Node.jsのバージョンの確認
$ n --stable
$ n --latest
Stableのインストール
$ n stable
version 確認
$ node -v

あらためて TerriaJS のインストール
$ git clone https://github.com/TerriaJS/TerriaMap.git
$ cd TerriaMap
$ export NODE_OPTIONS=--max_old_space_size=4096
$ npm install -g yarn
$ yarn install && yarn gulp && yarn start

http://localhost:3001 でオーストラリアのサンプルが表示されました。

npm に比べた yarn の利点をまだ理解していません。手を動かしながら、追いつきましょう。

解析雨量のタイル画像

気象庁HPによれば、解析雨量の png タイルを配信しているとのこと。
https://www.data.jma.go.jp/add/suishin/cgi-bin/catalogue/make_product_page.cgi?id=KaisekiU
解析雨量タイル画像
< 要素 >解析雨量のタイル画像
< キーワード >解析雨量
< 領域 >日本域
< 解像度 >1km
< 配信頻度 >30分毎
< 提供方法 >気象庁HP
< 形式 >PNG

上部のリンクから気象庁ホームページへ。
https://www.jma.go.jp/bosai/kaikotan/

png のリンクは張られていませんが、画像は掲載されています。developper tool では png の保存先が示されています。WebGIS に取り込むには、JavaScript でこのアドレスを渡せばOK。
JavaScript 自体は WebGIS の取り扱いを契機にを使い始めたのですが、古いスクリプト言語なので情報は溢れています。雑誌にも頻繁に掲載されていましたし、Pythonと同様で使いやすくなっています。ブラウザがあればすぐに試すことができるので、ハードルは低いでしょう。

解析雨量の png は30分毎に配信されるとのこと。最新の時刻が保存先のアドレスに使われるため、現在時刻を取得してから30分切り捨てで整形し、URL内に含めることで最新版を取得することができました。

少し動かしていて気付いたのが、タイムラグ。30分毎に配信されるとのことでしたが、毎時00分、30分ちょうどに配信されるのではなく、15分程度遅れているようです。どこにも記載がありません。面倒なので、常に30分前時点での最新版を指定するようにしました。これで待機時間がなくなりました。ナウキャストも表示できるようにしておいたので、問題ないでしょう。ちなみに、ナウキャストは現在時刻基準で10分切り捨てでも表示されます。違いは何でしょう?

残念ながら、zoom level は 9+が限界。もう少し拡大できたら嬉しい。

気象庁のHPで公開されている情報は、クリエイティブ・コモン:CC-BYで商用利用可とのこと(予報はしません)。ありがたいですね。
https://www.jma.go.jp/jma/kishou/info/coment.html


Cesium

MapLibre GL JS での 3次元地形の表示は難しいようでしたので、Cesiumに切り替え。

PLATEAU や、シームレス地質図2D/3D統合版で利用されています。
https://plateauview.mlit.go.jp/
https://gbank.gsj.jp/seamless/cesium/

npm からインストール。

npm init -y
npm install cesium --save

適当なhtml,js,cssを作成して npm start。で、エラー。
html をそのまま開くことにしてみましたが、別のエラーが出ます。

SecurityError: Failed to execute 'texImage2D' on 'WebGLRenderingContext': The image element contains cross-origin data, and may not be loaded.
クロスオリジンによる制約回避は一時的に留めたい。ということで Chrome のショートカットのリンク先を以下に変更。
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:\<htmlのあるフォルダ>"
これで Cesium World Terrain を重ねて倒すと、3次元で表示されました。

次は GeoJSON を読んでポイント表示。
viewer.dataSources.add(Cesium.GeoJsonDataSource.load('./vector/aaa.geojson', {
    clampToGround: true,
    markerSize: 20,
    //markerSymbol: 'cross'
}));

Z値(高さ)を持っていないポイントでも、clampToGround: true とすると地形の上に乗せてくれます。鳥観図にしてもポイントが山の中に隠れません。地味にうれしい機能です。
やはり地形は3次元が good。昔、カシミールなどで3次元表示を見始めた頃を思い出しました。地形データのライセンスはわかりませんでしたが、おそらく商用利用はダメでしょうね。地理院データを使いたいところです。


地理院タイル

国土地理院では各種タイルが用意されています。

WebGIS では、これらのタイルを利用するのが基本のようですね。MapLibre GL では、addSource, addLayer で次々に追加できます。
当然ながら、GeoJSON も取り込むことができます。ポイントだと比較的早く表示されましたが、全国分のポリゴンは重すぎるようでブラウザ側が落ちてしまいました。

いろいろな位置情報を表示し公開できる。しかもオープンソース。
位置情報の発信が進んできた背景を体感できました。

WebGIS

WebGIS は、商用ソフトでのみ利用しています。

先日、先輩からオープンソースのみで実装された海外の例が載っている文献をいただき、手を出してみることにしました。
手元の Windows10 にてサーバーを立ててみます。Win でもオールインワン環境が配布されているのですね。便利な時代です。

MapServer for Windows (MS4W) 4.0.5
国土地理院のタイルの表示はできましたが、PostGIS/PostgerSQLとの接続がダメ。TinyOWS、FastCGI共にうまく機能しません。

MapTilerServer 4.0.0
こちらは PostGIS extention が入っていないとのことでつながりません。DBeaver Community Edition 21.3.5 より extention を入れると一瞬つながりましたが、その後は2度とつながりませんでした。よくわからない挙動です。

SQL利用ではなく、GeoJSON なら表示できるか?
以下の方がGitHUBとHPでコードを公開されていたので利用。
https://day-journal.com/memo/

1週間ほど試行錯誤し、表示できました。これ、素晴らしいツクリです。npm run dev のみで処理してくれます(同じポートを使う mapserver を動かし続けていて、最初は正常動作しませんでした)。イマドキが凄いのか、この方が凄いのかわからないほどの初心者なのですが、上の2つに比べて圧倒的に簡単でした。しかもMIT。感謝です。

この方の記事にありましたが、ライブラリによってはブラウザで数十万のポイントを数秒で表示できる時代になっているとのこと。素晴らしい技術です。
https://qiita.com/dayjournal/items/86e1ca065e03ea88e0fb

PostGIS, PostgerSQL, MapServer, OpenLayers, MapLibre GL JS, Node.js。全て駆け足で通り過ぎたので、手を動かしながら徐々に学んでいきましょう。


2022年3月20日日曜日

conda で整理?

以前から explorer が不調の Windows10。

ここ数日でさらに悪化し、コピーや削除、右クリックからのコンテキスト表示に異常に時間がかかるようになりました。
miniconda のプロンプトも起動に数分かかる状態になってしまったので、ひとまず miniconda のみ入れなおすことにしました(explorerも入れなおせたら良いのですが)。

envs フォルダのみ避難させてからアンインストール。が、ここでも途中でフリーズ。手動で削除してから入れ直し。envsフォルダを戻してから起動!
うーん、治らず。

あきらめて base の 環境を保存していた yml、txt ファイルから復活!(* ̄▽ ̄)保存していたのだ、と思いきや、base はダメらしい。拒否されます。無知な私。
yml の中の環境名と保存先(最初と最後の行)を変更して、環境を復活させました。

次に、仮想環境の復元。yml などを作る前にアンインストールしてしまいましたので、envs フォルダを元に戻してから、conda env list で確認。仮想環境を表示できませんが、activate は動きました。で、Jupyter。が、立ち上がりません。
c:\Users\username\.conda\environments.txt
に仮想環境のパスを追加してもダメ。

なら、先に仮想環境を作って、envsの中身を後からコピーしたらどうか?
これもダメ。きちんと conda で 整理しておけばよかった。

何か方法はあるのでしょうが、正攻法でymlを書き出していなかったのが失敗。
ま、必要な時に作っていきましょう。

******************************
PowerShell の起動が遅い。miniconda ではなく、こちらが引っ掛かっていました。

2022年3月17日木曜日

福島県沖地震

ちょうど昼間に昨年2月の福島県沖地震を整理していたのですが、1年ぶりに同じような場所で同規模の地震が発生。

その数分後に埼玉県。こちらも負けずに大きい。しかも相対的に浅い。次に豊後水道が揺れたときは驚かされましたが、また福島県~宮城県沖へ。

そろそろ宮城県沖地震が懸念されていましたが、関係するのでしょうか。深すぎかな。

大きな被害が出なければ良いのですが。

*****************
20220320  追記
埼玉の震源は、翌朝にはカタログから消えていました。 

 

2022年3月16日水曜日

conda で 整理

異なる PC で GeoPandas 0.10.2を動かそうとしてエラー。

調べてみると、fiona と GDAL の Ver. が高すぎたようです。

新たな仮想環境で以下をインストール
・Python3.7
・fiona 1.8.18
・gdal 3.2.2
・geopandas 0.10.2

これで shp をインストールしてもエラーが出なくなりました。

ついでに環境整理。

仮想環境のエクスポート
$ conda env export > aaa.yml

仮想環境のパッケージリストをエクスポート
$ conda list --export > aaa.txt

仮想環境削除
$ conda remove --name  bbb -all

不要なパッケージ等を削除
$ conda clean --all


2022年3月15日火曜日

gpu が動きません

TensorFlow で gpu が動きません!

以前、他の PC では動いていたコード。TF2ではなく、TF1のコードです。
DockerはTF1であっている。Driver の Ver が上がっているので、これか? Docker, TF, CUDA, Driver の Ver の組み合わせチェックか?と思いながら見直したのですが、おかしくない。

よく見ると、GPUの番号を指定するようにコードを作っていたのですが、それをすっかり忘れて存在しない番号を指定していました。おかしいのは自分。情けないですが、高確率である話でした。

時間をあけてコードを眺めてみると、いくつか修正したい点が出てきました。
まずは、SEED値の固定。
開発中にKerasを用いて再現可能な結果を得るには?
https://keras.io/ja/getting-started/faq/

keras から、tf.keras へ変更。
from keras.aaa import bbb  を
from tf.keras.aaa import bbb へ変更。

TF1 のコードを TF2 仕様へ。
これは、自動で TF2 に上げてくれるコードにかけてみましたが、ダメでした。早々に取りやめて TF1 の Docker を使用したのですが、いずれ2へ移行させたい。

confusion_matrix の追加。
以前は classification_report のみ表示していました。

コードを組む際には、最新版~なじんだ版くらいで組んでおき、時々メンテしないとすぐに使えなくなりそうです。私の頭の中もですが。