内閣府が出している避難所はPDFでしか見れない
先日、九州北部で記録的な大豪雨が発生して多くの死者や行方不明者が発生し、土砂災害や道路損壊も相次ぎました。
その大豪雨を機に自分の住んでいる地域の避難所を調べると『内閣官房 国民保護ポータルサイト』というところにPDF化されたデータしかありませんでした(Yahoo!さん、ゼンリンデータコムさん、1st Mediaさん等は独自でデータを持っているみたいです)
□Yahoo!避難所マップ
・https://crisis.yahoo.co.jp/shelter/map/
□ゼンリンデータコム
・http://www.zenrin-datacom.net/business/lifeline/
□全国避難所ガイド
・http://www.hinanjyo.jp/
■内閣官房 国民保護ポータルサイト
http://www.kokuminhogo.go.jp/
避難所を探している人って、おそらくとても急いでいるためPDF化されていると、閲覧までに時間がかかったり色々と面倒臭いことが多いため、データベース化して公開しようと試みました。
PDF → CSV
内閣官房 国民保護ポータルサイトのHPからPDFをローカルのフォルダにダウンロードしました。そのPDFを『command + A』のショートカットで全コピー。そのコピーはテキストに貼り付けると、全て改行されます(エディタによって異なるみたいです...)
このCSVを『Oita.csv』という名前で保存します。この作業を47都道府県で行います。そしてこのCSVをカンマ区切りで『①項番②施設名③市町村名④住所』に書き換え、上書き保存を行うプログラムを実行させます。
using System;
namespace CreateCSV
{
class MainClass
{
public static void Main(string[] args)
{
MainClass exe = new MainClass();
//ファイルのパス
string filePath = "【CSVファイルが置いているフォルダ】/Oita.csv";
exe.CreateCsv(filePath);
}
//CSV書換え
private void CreateCsv(string filePath)
{
try
{
//ファイルを読み込みで開く
System.IO.StreamReader sr = new System.IO.StreamReader(filePath);
//一時ファイルを作成する
string tmpPath = System.IO.Path.GetTempFileName();
//一時ファイルを書き込みで開く
System.IO.StreamWriter sw = new System.IO.StreamWriter(tmpPath);
//書き込む用の変数
string writeLine = "";
//内容を一行ずつ読み込む
while (sr.Peek() > -1)
{
//一行読み込む
string line = sr.ReadLine();
int len = line.Length;
//true → 読み飛ばす(continue) / false →CSV書換え処理
if(isCheckWords(line))
{
continue;
}
int output;
bool flag = Int32.TryParse(line, out output);
if (flag)
{
if("1" == line)
{
writeLine += line;
}else{
System.Text.StringBuilder sb = new System.Text.StringBuilder(writeLine);
string pr = sb.ToString();
sw.WriteLine(pr);
writeLine = "";
writeLine += line;
}
}else{
writeLine += "," + line;
}
}
//閉じる
sr.Close();
sw.Close();
//一時ファイルと入れ替える
System.IO.File.Copy(tmpPath, filePath, true);
System.IO.File.Delete(tmpPath);
}
catch (System.Exception e)
{
// ファイルを開くのに失敗したとき
System.Console.WriteLine(e.Message);
}
}
//C避難所が書いていない行以外は無視する
private bool isCheckWords(String line){
if (line.Contains("市町村名") ||
line.Contains("避難施設一覧") ||
line.Contains("市町村名") ||
line.Contains("/") ||
line.Contains("町丁目名") ||
line.Contains("名称") ||
line.Contains("整理") ||
line.Contains("別添") ||
line.Contains("機密"))
{
//必要ないワードのため読み飛ばす処理(continue)に進む
return true;
}else{
//必要なワードのためCSVに書き込む処理に進む
return false;
}
}
}
}
CSV → DB
カンマ区切りのCSVをDBへ格納します。
DBへは本番環境からphpでDBにアクセスしてINSERTを行います。
<?php
/**************************************************
◆DBquery.php
このファイルは、日本全国の避難所のCSVデータをデータベースへ格納するファイルです。
**************************************************/
$DBConfigPath = "Config/DB.ini";
//パースした要素を全て追加
$DBini_array = parse_ini_file($DBConfigPath);
try{
//パースした要素をひとつづつ追加
$url = array_values($DBini_array)[0]; //データベースサーバ
$user = array_values($DBini_array)[1]; //データベースユーザ(サーバと同じ)
$pass = array_values($DBini_array)[2]; //パスワード
$db = array_values($DBini_array)[3]; //データベース名
$file = array_values($DBini_array)[4]; //csvのファイル名
$prefectures = array_values($DBini_array)[5]; //都道府県名
//*データベースコネクト処理(クエリの後閉じる処理を行う)
$link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。");
$sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。");
$result = mysql_query('SET NAMES utf8', $link) or die("文字コードを指定できませんでした。");
$f = fopen("./HinanjoCSV/".$file, "r");
while($line = fgetcsv($f)){
$SQL_INSERT = "INSERT INTO Hinanjo_Location(LocateNum, Hinanjo, Prefectures,City,Address) VALUES('$line[0]', '$line[1]', '$prefectures', '$line[2]', '$line[3]')";
// //INSERT実行
$result = mysql_query($SQL_INSERT, $link) or die("クエリの送信に失敗しました。<br />SQL:".$SQL_INSERT);
}
fclose($f);
//接続失敗
mysql_close($link) or die("MySQL切断に失敗しました。");
// エラー(例外)が発生した時の処理を記述
} catch (PDOException $e) {
// エラーメッセージを表示させる
echo 'データベースにアクセスできません!' . $e->getMessage();
// 強制終了
exit;
}
PDF → CSV → DB そしてGoogleMap化へ
データ量が多いためPDFのデータ化からDB格納まで自動化しないと、データの更新等ができないので、まだまだ課題があります。
とりあえずデータ化までは成功したので、後編にグーグルマップ化をしたいと思います。