-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.sh
executable file
·266 lines (211 loc) · 9.98 KB
/
main.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#!/usr/bin/env bash
set -ex
# 引数が指定されているか確認
if [ -z "$1" ] || [ -z "$2" ]; then
echo "使用方法: $0 <input_directory> <config_file_excel> [crs]"
exit 1
fi
# 引数で指定されたディレクトリを変数に代入
input_directory="$1"
# 末尾にスラッシュがある場合は削除
input_directory=${input_directory%/}
crs="$3"
# ディレクトリが存在するか確認
if [ ! -d "$input_directory" ]; then
echo "ディレクトリ $input_directory は存在しません。"
exit 1
fi
# config ファイルが存在するか確認
if [ ! -f "$2" ]; then
echo "ファイル $2 は存在しません。"
exit 1
fi
node ./bin/xlsx2json.js $2
json_file="data.json"
# 全ての不要なファイルを削除
find . -name "*.mbtiles" | xargs -I '{}' rm "{}"
find . -name "*.ndgeojson" | xargs -I '{}' rm "{}"
shapeExtensions=("shp" "dbf" "shx" "prj" "cpg" "SHP" "DBF" "SHX" "PRJ" "CPG")
jq -c '.[]' $json_file | while read item; do
# 各フィールドを取り出す
tileLayer=$(echo $item | jq -r '.["タイルレイヤー名"]')
dataType=$(echo $item | jq -r '.["データ種別"]')
reference=$(echo $item | jq -r '.["データ参照先"]')
tippecanoe_opts=$(echo $item | jq -r '.["Tippecanoeオプション"]')
# dataType が "fiware" または "datapng" の場合はスキップ
if [[ $dataType == "fiware" || $dataType == "datapng" || $dataType == "raster" ]]; then
continue
fi
# --------------------------------------------------
# 1. データ参照先で URL で指定されたファイルをダウンロード(GeoJSONとCSV、Shapefileに対応)
# --------------------------------------------------
if [[ $reference =~ ^https://.*$ ]] && [[ $dataType == "geojson" || $dataType == "csv" || $dataType == "shp" ]]; then
# Shapefileの場合は関連ファイルもダウンロード
if [[ $dataType == "shp" ]]; then
for ext in "${shapeExtensions[@]}"; do
# ファイル拡張子を設定
extension="$ext"
# ダウンロード先のファイルパスを設定
download_path="$input_directory/$tileLayer.$extension"
# URLを関連ファイルの拡張子に変更
reference_file="${reference%.*}.$extension"
# ダウンロード先のファイルが存在しない場合のみダウンロード
if [ ! -f "$download_path" ]; then
echo "Downloading $tileLayer.$extension ..."
# curlでステータスコードを取得し、ダウンロード
http_status=$(curl -L -H "Cache-Control: no-cache" -s -o "$download_path" -w "%{http_code}" "$reference_file")
echo "Status: $http_status"
# ステータスコードが200番台または300番台でなければファイルを削除
if [ "$http_status" -eq 200 ]; then
echo "$tileLayer.$extension downloaded successfully."
else
echo "Failed to download $tileLayer.$extension (Status: $http_status). Removing incomplete file."
rm -f "$download_path"
fi
else
echo "$tileLayer.$extension already exists."
fi
done
else
# 他のファイルタイプ(GeoJSONやCSV)の場合
extension="${dataType}"
download_path="$input_directory/$tileLayer.$extension"
if [ ! -f "$download_path" ]; then
echo "Downloading $tileLayer.$extension ..."
curl -H "Cache-Control: no-cache" -s -o $download_path $reference
else
echo "$tileLayer.$extension already exists."
fi
fi
fi
# --------------------------------------------------
# 2. タイルレイヤー名を元にファイルをリネーム
# --------------------------------------------------
# Shape の場合
if [ "$dataType" = "shp" ]; then
reference_file=$(basename "$reference" ".shp")
for ext in "${shapeExtensions[@]}"; do
# -iname を使って拡張子の大文字小文字を無視して検索し、結果を小文字に変換
src=$(find "$input_directory" -iname "$reference_file.$ext" -print -quit)
dst="$input_directory/$tileLayer.${ext,,}" # ${ext,,}で拡張子を小文字に変換
# 移動元と移動先が同じか確認
if [ -n "$src" ] && [ "$src" != "$dst" ]; then
echo "ファイル名を変更: $src to $dst"
mv "$src" "$dst"
else
echo "移動元と移動先が同じファイルです。操作をスキップします。"
fi
done
fi
# GeoJSON と CSV の場合(ローカルファイルをリネーム)
if [ -f "$input_directory/$reference" ] && [[ $dataType == "geojson" || $dataType == "csv" ]]; then
mv "$input_directory/$reference" "$input_directory/$tileLayer.$dataType"
fi
# Shift_JIS のCSVを UTF-8 に変換
if [ $dataType = "csv" ] && [ -f "$input_directory/$tileLayer.csv" ]; then
csv="$input_directory/$tileLayer.csv"
encoding=$(nkf --guess "$csv" | sed 's/ .*//')
if [[ $encoding != "UTF-8" ]]; then
iconv -f "$encoding" -t UTF-8 "$csv" > "${csv}.tmp"
mv "${csv}.tmp" "$csv"
echo "Converted $encoding to UTF-8: $csv"
fi
fi
# --------------------------------------------------
# 3. データを ndgeojson に変換
# --------------------------------------------------
# Shape の場合
s_srs_args=""
if [ $dataType = "shp" ]; then
# .prj ファイルが Shift_JIS だと ogr2ogr でエラーが出るので UTF-8 に変換
prj_file="$input_directory/$tileLayer.prj"
if [ -f $prj_file ]; then
encoding=$(nkf --guess $prj_file)
if [ "$encoding" = "Shift_JIS" ]; then
nkf --overwrite -w $prj_file
fi
elif [ -n "$crs" ]; then
s_srs_args="-s_srs $crs"
fi
shpfile="$input_directory/$tileLayer.shp"
temp_file="$input_directory/$tileLayer-temp.shp"
# EPSG:4326 で UTF-8 の Shapefile に変換
if [ ! -f "$prj_file" ]; then
# .prj ファイルがない場合、EPSG:6676 を使用して変換
ogr2ogr -f "ESRI Shapefile" $s_srs_args -t_srs EPSG:4326 -lco ENCODING=UTF-8 "$temp_file" "$shpfile"
else
# .prj ファイルがある場合はそのまま変換
ogr2ogr -f "ESRI Shapefile" -t_srs EPSG:4326 -lco ENCODING=UTF-8 "$temp_file" "$shpfile"
fi
# ndgeojson に変換
ogr2ogr -f geojsonseq "$input_directory/$tileLayer.ndgeojson" "$temp_file"
echo "Convert Shape to ${tileLayer}.ndgeojson"
fi
# GeoJSON と CSV の場合
if [[ $dataType = "geojson" || $dataType = "csv" ]]; then
inputFile="$input_directory/$tileLayer.$dataType"
if [ $dataType = "geojson" ]; then
ogr2ogr -f geojsonseq -t_srs EPSG:4326 "$input_directory/$tileLayer.ndgeojson" "$inputFile"
elif [ $dataType = "csv" ]; then
# 経度と緯度の列名候補を正規表現で定義
longitude_patterns="longitude|lng|lon|経度\(度:世界測地系\)|経度\(度:世界測地系\)|経度\(10進\)"
latitude_patterns="latitude|lat|緯度\(度:世界測地系\)|緯度\(度:世界測地系\)|緯度\(10進\)"
# CSV の場合は経度と緯度の列名変換処理
tempFile="$input_directory/${tileLayer}_temp.csv"
# 1行目の列名を変換してから出力
sed -E "1s/($longitude_patterns)/経度/g; 1s/($latitude_patterns)/緯度/g" "$inputFile" > "$tempFile"
# 変換した一時ファイルを使用して ogr2ogr コマンドを実行
ogr2ogr -f geojsonseq -skipfailures -s_srs EPSG:4326 -t_srs EPSG:4326 "$input_directory/$tileLayer.ndgeojson" "$tempFile" -oo X_POSSIBLE_NAMES=経度 -oo Y_POSSIBLE_NAMES=緯度
# 一時ファイルを削除
rm "$tempFile"
fi
echo "Convert ${inputFile} to ${base}.ndgeojson"
fi
# --------------------------------------------------
# 4. ndgeojson をタイルに変換
# --------------------------------------------------
# デフォルトのTippecanoeオプション
TIPPECANOE_OPTS=(
"-M" "500000" # タイルサイズを500KBに制限
"--no-tile-stats" # タイル統計情報を生成しない
"-Z" "9"
"-z" "14"
"--simplify-only-low-zooms" # 低ズームレベルのみ簡略化
"--cluster-distance=5" # 10 ピクセル以内はクラスタリング
"--cluster-densest-as-needed" # 重複がある場合はクラスタリング
"--force"
)
if [[ "$dataType" != "fiware" && "$dataType" != "raster" ]]; then
ndgeojsonfile="$input_directory/$tileLayer.ndgeojson"
mbtilesfile="$input_directory/$tileLayer.mbtiles"
# Tippecanoeオプションが指定されていない場合はデフォルトのオプションを使用
if [ "$tippecanoe_opts" == "null" ]; then
tippecanoe -o "$mbtilesfile" "${TIPPECANOE_OPTS[@]}" -l "$tileLayer" -P "$ndgeojsonfile"
else
tippecanoe -o "$mbtilesfile" $tippecanoe_opts -l "$tileLayer" -P "$ndgeojsonfile" --force
fi
fi
done
# --------------------------------------------------
# 5. 生成した .mbtiles ファイルをマージ
# --------------------------------------------------
TILEJOIN_OPTS=(
"--overzoom" # オーバーズームを有効
"--no-tile-size-limit" # タイルサイズの制限を無効
"--no-tile-stats" # タイル統計情報を生成しない
"-Z" "9" # このズーム以下のタイルはコピーしない
"-z" "14" # このズーム以上のタイルはコピーしない
"--force"
)
IFS=$'\n' mbtiles_files=($(find . -name "*.mbtiles" -print0 | xargs -0 -n1 echo))
echo "マージする .mbtiles ファイル: ${mbtiles_files[@]}"
merged_file="output.mbtiles"
tile-join -o "$merged_file" "${TILEJOIN_OPTS[@]}" "${mbtiles_files[@]}"
# 処理が終わったら .ndgeojson と .mbtiles ファイルを削除
find . -name "*.ndgeojson" -delete
find . -name "*.geojson" -delete
find . -name "*.mbtiles" ! -name "$merged_file" -delete
# --------------------------------------------------
# 6. メニューを生成
# --------------------------------------------------
node ./bin/configToMenuYAML.js $json_file "app.yml"