遅まきながらCARTO (旧 CartoDB)使い始めました。
奈良の地蔵プロジェクトのビジュアライズにuMapを使っていたんですが、どうもポップアップなどでできることの限界が気に入らないので、代わりのビジュアライズ手段として調べ始めたのがきっかけです。
でもって納得いく表現を実現するためにいくつかGeographic Information Systems等にも質問を投げて答えを得たので、日本語でQiitaでも共有します。
1. PopupのCustomHTMLで条件分岐やループするには?
英語での質問ページはこちら。
結論としては、Mustacheというテンプレートエンジンを使っているので、その文法で書いてやればよい。
こんな感じ:
{
"animals": [
{"name": "cat"},
{"name": "dog"},
{"name": "pig"}
],
"test" : false
}
{{#animals}}
<p>{{name}}</p>
{{/animals}}
{{#test}}
<p>Test is found</p>
{{/test}}
{{^test}}
<p>Test is not found</p>
{{/test}}
<p>cat</p>
<p>dog</p>
<p>pig</p>
<p>Test is not found</p>
残った疑問:
配列の要素がオブジェクトの時は上記でループ結果を得られるが、配列の要素がリテラルの時はどうすればアクセスできるか?
{
"animals": ["cat", "dog", "pig"]
}
から、
<p>cat</p>
<p>dog</p>
<p>pig</p>
を得たい時はどうすればよいか?
Stack Overflowで質問中だが、まだ答えなし。
2. POI各要素のlatitude, longitudeにアクセスしたい時はどうするか?
直接引っ張ってくる手段はないが、代替手段がある。
CARTOのPopupテンプレートで呼び出せる属性名は、登録したgeojson等の属性値を引っ張ってきているわけではなく、あくまで、SQLタブに登録されている
SELECT * FROM data_table;
といったSQLを、登録された空間DB上で実行した結果を引っ張ってきている。(data_tableは各自のデータレレイヤ名によって置き換えること)
よって、経緯度を引っ張りたいなら、経緯度をSQLの結果として取れるようにすればよい。
SELECT *, ST_X(the_geom) as lng, ST_Y(the_geom) as lat FROM data_table;
これをSQLタブに登録することで、{{lat}} {{lng}}の形で、テンプレート上で経緯度が引っ張れるようになる。
3. 元になったgeojsonを外部で更新した。全取っ替えで置き換えたいがどうすればよいか?
英語での質問ページはこちら。
CARTOは新規データレイヤ作成でgeojsonを読み込ませることができるが、uMapにはある「新しいgeojsonでデータ全取っ替え」が標準のUIで用意されていない。
しかし普通にSQLが使えるので、以下の方法で全取っ替え可能である。
新しいデータセットを、別のレイヤー名(ここではtmp_tableとする)でインポート
入れ替えたいレイヤ上のSQLタブで、以下を一気に実行する。
DELETE FROM data_table;
INSERT INTO data_table (cartodb_id, the_geom, attributes) SELECT cartodb_id, the_geom, attributes FROM tmp_table;
attributesは、実際の属性名を列挙すること。
属性名リストを省略した形での、
DELETE FROM data_table;
INSERT INTO data_table SELECT * FROM tmp_table;
は動かないので注意。