splatone 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ # Splatone Change Log
2
+
3
+ ## Versions
4
+
5
+ ### v0.0.7 → v0.0.8
6
+
7
+ * 範囲指定とHexGridの表示・非表示ができるようになりました。
8
+ * デフォルトで非表示
9
+ * 表示したい場合はレイヤコントロールにて切り替えてください
10
+
11
+ ### v0.0.6 → v0.0.7
12
+
13
+ * Hexサイズの自動設定モードが実装され、デフォルトとなりました。
14
+ * Web画面のハンバーガーメニューから変更できます。(サイズ0で自動)
package/README.md CHANGED
@@ -12,20 +12,26 @@ SNSのジオタグ付きポストをキーワードに基づいて収集する
12
12
  - Marker Cluster: 密集しているジオタグをクラスタリングしてまとめて表示する
13
13
 
14
14
  ## Change Log
15
- ### v0.0.8 → v0.0.9
16
15
 
17
- * クエリを時間方向でも分割し効率化しました。(使い方に変更はありません)
16
+ ### v0.0.10 → v0.0.11
17
+
18
+ * 時間軸として使用する日付を選択可能に (```--p-flickr-DateMode```)
19
+ * upload: Flickrにアップロードされたタイムスタンプを遡ってクローリング (デフォルト)
20
+ * taken: 写真の撮影日時を遡ってクローリング
21
+ * extrasを指定可能に (```--p-flickr-Extras```)
22
+ * https://www.flickr.com/services/api/explore/flickr.photos.search
23
+ * デフォルト値: ```date_upload,date_taken,owner_name,geo,url_s,tags```
24
+ * これらはコマンドライン引数での指定の有無に関わらず付与されます
25
+ * 自動指定時のHexGridの最小サイズを0.5kmに
18
26
 
19
- ### v0.0.7 → v0.0.8
27
+ ### v0.0.8 → v0.0.9 → v0.0.10
20
28
 
21
- * 範囲指定とHexGridの表示・非表示ができるようになりました。
22
- * デフォルトで非表示
23
- * 表示したい場合はレイヤコントロールにて切り替えてください
29
+ * 【重要】**APIキー**の指定方法が変わりました。
30
+ * ```--p-flickr-APIKEY```オプションを使います。
31
+ * クエリを時間方向でも分割し効率化しました。(使い方に変更はありません)
24
32
 
25
- ### v0.0.6 → v0.0.7
33
+ [これ以前のログ](CHANGELOG.md)
26
34
 
27
- * Hexサイズの自動設定モードが実装され、デフォルトとなりました。
28
- * Web画面のハンバーガーメニューから変更できます。(サイズ0で自動)
29
35
 
30
36
  # 使い方
31
37
 
@@ -36,7 +42,9 @@ SNSのジオタグ付きポストをキーワードに基づいて収集する
36
42
 
37
43
  ```shell
38
44
  $ npx -y -- splatone@latest crawler --help
45
+ [app] [plugin] loaded: flickr@1.0.0
39
46
  使い方: crawler.js [options]
47
+
40
48
  Basic Options
41
49
  -p, --plugin 実行するプラグイン[文字列] [必須] [選択してください: "flickr"]
42
50
  -o, --options プラグインオプション [文字列] [デフォルト: "{}"]
@@ -50,6 +58,18 @@ Basic Options
50
58
  Debug
51
59
  --debug-verbose デバッグ情報出力 [真偽] [デフォルト: false]
52
60
 
61
+ For flickr Plugin
62
+ --p-flickr-APIKEY Flickr ServiceのAPI KEY [文字列]
63
+ --p-flickr-extras カンマ区切り/保持する写真のメタデータ(デフォルト値は記
64
+ 載の有無に関わらず保持)
65
+ [文字列] [デフォルト: "date_upload,date_taken,owner_name,geo,url_s,tags"]
66
+ --p-flickr-Date 利用時間軸(update=Flickr投稿日時/taken=写真撮影日時)
67
+ [選択してください: "upload", "taken"] [デフォルト: "upload"]
68
+ --p-flickr-DateMax クローリング期間(最大) UNIX TIMEもしくはYYYY-MM-DD
69
+ [文字列] [デフォルト: 1762701683]
70
+ --p-flickr-DateMin クローリング期間(最小) UNIX TIMEもしくはYYYY-MM-DD
71
+ [文字列] [デフォルト: 1072882800]
72
+
53
73
  Visualization (最低一つの指定が必須です)
54
74
  --vis-bulky 全データをCircleMarkerとして地図上に表示
55
75
  [真偽] [デフォルト: false]
@@ -70,26 +90,25 @@ Visualization (最低一つの指定が必須です)
70
90
 
71
91
  ### 事例1) 商業施設・飲食施設・文化施設・公園の分類
72
92
  ```shell
73
- $ node crawler.js -p flickr -o '{"flickr":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}' -k "商業=shop,souvenir,market,supermarket,pharmacy,drugstore,store,department,kiosk,bazaar,bookstore,cinema,showroom|飲食=bakery,food,drink,restaurant,cafe,bar,beer,wine,whiskey|文化施設=museum,gallery,theater,concert,library,monument,exhibition,expo,sculpture,heritage|公園=park,garden,flower,green,pond,playground" --vis-bulky
93
+ $ node crawler.js -p flickr -k "商業=shop,souvenir,market,supermarket,pharmacy,drugstore,store,department,kiosk,bazaar,bookstore,cinema,showroom|飲食=bakery,food,drink,restaurant,cafe,bar,beer,wine,whiskey|文化施設=museum,gallery,theater,concert,library,monument,exhibition,expo,sculpture,heritage|公園=park,garden,flower,green,pond,playground" --vis-bulky --p-flickr-APIKEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
74
94
  ```
75
95
  - オプションの **--vis-bulky** を **--vis-marker-cluster** に変更する事でマーカークラスターで可視化できます。
76
96
 
77
97
  ### 事例2)水路・陸路・ランドマーク等の分類
78
98
  ```shell
79
- $ node crawler.js -p flickr -o '{"flickr":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}' -k "水域=canal,channel,waterway,river,stream,watercourse,sea,ocean,gulf,bay,strait,lagoon,offshore|橋梁=bridge,overpass,flyover,aqueduct,trestle|通路=street,road,thoroughfare,roadway,avenue,boulevard,lane,alley,roadway,carriageway,highway,motorway|ランドマーク=church,sanctuary,chapel,cathedral,basilica,minster,abbey,temple,shrine" --vis-bulky
99
+ $ node crawler.js -p flickr -k "水域=canal,channel,waterway,river,stream,watercourse,sea,ocean,gulf,bay,strait,lagoon,offshore|橋梁=bridge,overpass,flyover,aqueduct,trestle|通路=street,road,thoroughfare,roadway,avenue,boulevard,lane,alley,roadway,carriageway,highway,motorway|ランドマーク=church,sanctuary,chapel,cathedral,basilica,minster,abbey,temple,shrine" --vis-bulky --p-flickr-APIKEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
80
100
  ```
81
101
  - ベネチア等の水路のある町でやると面白いです
82
102
 
83
103
  # 詳細説明
84
104
 
85
- ## APIキーの与え方
105
+ ## Flickr APIキーの与え方
86
106
 
87
107
  APIキーは以下の3種類の方法で与える事ができます
88
108
  - ```--option```に含める
89
109
  - 上記コマンド例の方法
90
- - **flickr**の場合は``` -o '{"plugin":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}'```になります。
110
+ - **flickr**の場合は``` --p-flickr-APIKEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ```になります。
91
111
  - [注意] コマンドを他の人と共有する時、APIキーをそのまま渡す事は危険です。
92
- - **flickr**の場合は``` -o '{"flickr":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}'```になります。
93
112
  - 環境変数で渡す
94
113
  - ```API_KEY_plugin```という環境変数に格納する
95
114
  - コマンドに毎回含めなくて良くなる。
@@ -111,7 +130,7 @@ APIキーは以下の3種類の方法で与える事ができます
111
130
 
112
131
  * クエリは水域と通路・橋梁・ランドマークを色分けしたもの、上記スクリーンショットはベネチア付近のデータ
113
132
  ```shell
114
- $ node crawler.js -p flickr -o '{"flickr":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}' -k "水域=canal,channel,waterway,river,stream,watercourse,sea,ocean,gulf,bay,strait,lagoon,offshore|橋梁=bridge,overpass,flyover,aqueduct,trestle|通路=street,road,thoroughfare,roadway,avenue,boulevard,lane,alley,roadway,carriageway,highway,motorway|ランドマーク=church,sanctuary,chapel,cathedral,basilica,minster,abbey" --vis-marker-cluster --vis-bulky
133
+ $ node crawler.js -p flickr -k "水域=canal,channel,waterway,river,stream,watercourse,sea,ocean,gulf,bay,strait,lagoon,offshore|橋梁=bridge,overpass,flyover,aqueduct,trestle|通路=street,road,thoroughfare,roadway,avenue,boulevard,lane,alley,roadway,carriageway,highway,motorway|ランドマーク=church,sanctuary,chapel,cathedral,basilica,minster,abbey" --vis-marker-cluster --vis-bulky --p-flickr-APIKEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
115
134
  ```
116
135
 
117
136
  ### Marker Cluster: 高密度の地点はマーカーをまとめて表示する
@@ -119,7 +138,7 @@ $ node crawler.js -p flickr -o '{"flickr":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaa
119
138
 
120
139
  * クエリは水域と通路・橋梁・ランドマークを色分けしたもの、上記スクリーンショットはベネチア付近のデータ
121
140
  ```shell
122
- $ node crawler.js -p flickr -o '{"flickr":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}' -k "水域=canal,channel,waterway,river,stream,watercourse,sea,ocean,gulf,bay,strait,lagoon,offshore|橋梁=bridge,overpass,flyover,aqueduct,trestle|通路=street,road,thoroughfare,roadway,avenue,boulevard,lane,alley,roadway,carriageway,highway,motorway|ランドマーク=church,sanctuary,chapel,cathedral,basilica,minster,abbey" --vis-marker-cluster --vis-marker-cluster
141
+ $ node crawler.js -p flickr -k "水域=canal,channel,waterway,river,stream,watercourse,sea,ocean,gulf,bay,strait,lagoon,offshore|橋梁=bridge,overpass,flyover,aqueduct,trestle|通路=street,road,thoroughfare,roadway,avenue,boulevard,lane,alley,roadway,carriageway,highway,motorway|ランドマーク=church,sanctuary,chapel,cathedral,basilica,minster,abbey" --vis-marker-cluster --vis-bulky --p-flickr-APIKEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
123
142
  ```
124
143
  ## キーワード指定方法
125
144
 
@@ -150,7 +169,7 @@ seaだけでは集められるポストが限定されるので、同様の意
150
169
  ### 実行例 (海岸線と山岳の分布)
151
170
 
152
171
  ```shell
153
- $ node crawler.js -p flickr -o '{"flickr":{"API_KEY":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}}' -k "sea,ocean|mountain,mount" --vis-bulky
172
+ $ node crawler.js -p flickr -k "sea,ocean|mountain,mount" --vis-bulky--p-flickr-APIKEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
154
173
  ```
155
174
  ![](https://github.com/YokoyamaLab/Splatone/blob/main/assets/screenshot_sea-mountain_bulky.png?raw=true)
156
175
 
package/crawler.js CHANGED
@@ -184,10 +184,12 @@ try {
184
184
  console.warn("--filedと--choppedが両方指定されています。--filedが優先されます。");
185
185
  argv.chopped = false;
186
186
  }
187
+ console.log(argv);
187
188
  pluginsOptions = buildPluginsOptions(argv, plugins.list())
188
189
  pluginsOptions[argv.plugin] = await plugins.call(argv.plugin, 'check', pluginsOptions[argv.plugin]);
189
190
  return true;
190
191
  });
192
+
191
193
  const argv = await yargv.parseAsync();
192
194
 
193
195
  const visualizers = {};
@@ -337,11 +339,12 @@ try {
337
339
  let { bbox, drawn, cellSize = 0, units = 'kilometers', tags = 'sea,beach|mountain,forest' } = req.query;
338
340
  const boundary = String(bbox).split(',').map(Number);
339
341
  if (cellSize == 0) {
340
- //セルサイズ自動決定()
342
+ //セルサイズ自動決定
343
+ units = 'kilometers'
341
344
  //console.log("[cellSize?]",boundary,units);
342
345
  const { width, height } = bboxSize(boundary, units);
343
346
  //console.log("","w=",width,"/\th=",height);
344
- cellSize = Math.max(width / (3 * 30), height / (30 * Math.sqrt(3)));
347
+ cellSize = Math.max(0.5, width / (3 * 30), height / (30 * Math.sqrt(3)));
345
348
  if (cellSize == 0) {
346
349
  cellSize = 1;
347
350
  }
@@ -576,7 +579,7 @@ try {
576
579
  crawlers[p.sessionId][rtn.hexId][rtn.category].crawled ??= 0;
577
580
  crawlers[p.sessionId][rtn.hexId][rtn.category].total = rtn.final ? crawlers[p.sessionId][rtn.hexId][rtn.category].ids.size : rtn.total + crawlers[p.sessionId][rtn.hexId][rtn.category].crawled;
578
581
  crawlers[p.sessionId][rtn.hexId][rtn.category].crawled = crawlers[p.sessionId][rtn.hexId][rtn.category].ids.size;
579
-
582
+
580
583
  if (argv.debugVerbose) {
581
584
  console.log('INFO:', ` ${rtn.hexId} ${rtn.category} ] dup=${duplicates.size}, out=${rtn.outside}, in=${rtn.photos.features.length} || ${crawlers[p.sessionId][rtn.hexId][rtn.category].crawled} / ${crawlers[p.sessionId][rtn.hexId][rtn.category].total}`);
582
585
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "splatone",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "Multi-layer Composite Heatmap",
5
5
  "homepage": "https://github.com/YokoyamaLab/Splatone#readme",
6
6
  "bugs": {
@@ -22,6 +22,32 @@ export default class FlickrPlugin extends PluginBase {
22
22
  description: 'Flickr ServiceのAPI KEY'
23
23
  }).coerce(this.argKey('APIKEY'), opt => {
24
24
  return opt
25
+ }).option(this.argKey('Extras'), {
26
+ group: 'For ' + this.id + ' Plugin',
27
+ type: 'string',
28
+ default: 'date_upload,date_taken,owner_name,geo,url_s,tags',
29
+ description: 'カンマ区切り/保持する写真のメタデータ(デフォルト値は記載の有無に関わらず保持)'
30
+ }).coerce(this.argKey('Extras'), opt => {
31
+ const fields = ['description', 'license', 'date_upload', 'date_taken', 'owner_name', 'icon_server', 'original_format', 'last_update', 'geo', 'tags', 'machine_tags', 'o_dims', 'views', 'media', 'path_alias', 'url_sq', 'url_t', 'url_s', 'url_q', 'url_m', 'url_n', 'url_z', 'url_c', 'url_l', 'url_o'];
32
+ const extras = { 'date_upload': true, 'date_taken': true, 'owner_name': true, 'geo': true, 'url_s': true, 'tags': true };
33
+ opt.split(',').forEach(f => {
34
+ if (fields.includes(f)) {
35
+ extras[f] = true;
36
+ } else {
37
+ console.warn(`[${this.id} Warning] extras=${f}はリストに無いため無視されました。`);
38
+ }
39
+ });
40
+ return Object.keys(extras).join(",");
41
+ }).option(this.argKey('DateMode'), {
42
+ group: 'For ' + this.id + ' Plugin',
43
+ choices: ['upload', 'taken'],
44
+ default: "upload",
45
+ description: '利用時間軸(update=Flickr投稿日時/taken=写真撮影日時)'
46
+ }).option(this.argKey('Haste'), {
47
+ group: 'For ' + this.id + ' Plugin',
48
+ default: false,
49
+ type: 'boolean',
50
+ description: '時間軸分割並列処理(実験中の機能)'
25
51
  }).option(this.argKey('DateMax'), {
26
52
  group: 'For ' + this.id + ' Plugin',
27
53
  type: 'string',
@@ -46,7 +72,6 @@ export default class FlickrPlugin extends PluginBase {
46
72
  if (Number.isFinite(num)) {
47
73
  return Math.floor(num); // 確実に整数に
48
74
  }
49
-
50
75
  throw new Error(`Invalid date/time format: ${opt} (YYYY-MM-DD または UNIX時間(秒)で指定してください)`);
51
76
  }).option(this.argKey('DateMin'), {
52
77
  group: 'For ' + this.id + ' Plugin',
@@ -16,17 +16,17 @@ export default async function ({
16
16
  const baseParams = {
17
17
  bbox: bbox.join(','),
18
18
  tags: tags,
19
- max_upload_date: pluginOptions["DateMax"],
20
- min_upload_date: pluginOptions["DateMin"],
19
+ extras: pluginOptions["Extras"],
20
+ sort: pluginOptions["DateMode"] == "upload" ? "date-posted-desc" : "date-taken-desc"
21
21
  };
22
+ baseParams[pluginOptions["Date"] == "upload" ? 'max_upload_date' : 'max_taken_date'] = pluginOptions["DateMax"];
23
+ baseParams[pluginOptions["Date"] == "upload" ? 'min_upload_date' : 'min_taken_date'] = pluginOptions["DateMin"];
22
24
  //console.log("[baseParams]",baseParams);
23
25
  const res = await flickr("flickr.photos.search", {
24
26
  ...baseParams,
25
27
  has_geo: 1,
26
- extras: "date_upload,date_taken,owner_name,geo,url_s,tags",
27
28
  per_page: 250,
28
29
  page: 1,
29
- sort: "date-posted-desc"
30
30
  });
31
31
  //console.log(baseParams);
32
32
  const ids = [];
@@ -67,7 +67,7 @@ export default async function ({
67
67
  console.warn("[Warning]", `High posting activity detected for ${Object.keys(authors)} within ${window} s. the crawler will skip the next ${skip} hours.`);
68
68
  next_max_date -= 60 * 60 * skip;
69
69
  }
70
- if (res.photos.pages > 4) {
70
+ if (pluginOptions["Haste"] && res.photos.pages > 4) {
71
71
  //結果の最大・最小を2分割
72
72
  const mid = ((next_max_date - pluginOptions.DateMin) / 2) + pluginOptions.DateMin;
73
73
  nextPluginOptionsDelta.push({
@@ -81,7 +81,7 @@ export default async function ({
81
81
  } else {
82
82
  nextPluginOptionsDelta.push({
83
83
  'DateMax': next_max_date,
84
- 'DateMin': pluginOptions.DateMin
84
+ 'DateMin': pluginOptions.DateMin,
85
85
  });
86
86
  }
87
87
  return {