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 +14 -0
- package/README.md +36 -17
- package/crawler.js +6 -3
- package/package.json +1 -1
- package/plugins/flickr/index.js +26 -1
- package/plugins/flickr/worker.js +6 -6
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.
|
|
27
|
+
### v0.0.8 → v0.0.9 → v0.0.10
|
|
20
28
|
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
29
|
+
* 【重要】**APIキー**の指定方法が変わりました。
|
|
30
|
+
* ```--p-flickr-APIKEY```オプションを使います。
|
|
31
|
+
* クエリを時間方向でも分割し効率化しました。(使い方に変更はありません)
|
|
24
32
|
|
|
25
|
-
|
|
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 -
|
|
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 -
|
|
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**の場合は``` -
|
|
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 -
|
|
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 -
|
|
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 -
|
|
172
|
+
$ node crawler.js -p flickr -k "sea,ocean|mountain,mount" --vis-bulky--p-flickr-APIKEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
|
154
173
|
```
|
|
155
174
|

|
|
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
package/plugins/flickr/index.js
CHANGED
|
@@ -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',
|
package/plugins/flickr/worker.js
CHANGED
|
@@ -16,17 +16,17 @@ export default async function ({
|
|
|
16
16
|
const baseParams = {
|
|
17
17
|
bbox: bbox.join(','),
|
|
18
18
|
tags: tags,
|
|
19
|
-
|
|
20
|
-
|
|
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 {
|