sanmei:database
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| sanmei:database [2020/06/19 01:29] – [Table:city] anineco | sanmei:database [2020/06/19 03:50] (現在) – 削除 anineco | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== 山名データベース ====== | ||
| - | ===== データベースの作成 ===== | ||
| - | |||
| - | ==== Database: | ||
| - | <code sql> | ||
| - | CREATE DATABASE `nurude_tozan` | ||
| - | /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ | ||
| - | /*!80016 DEFAULT ENCRYPTION=' | ||
| - | </ | ||
| - | |||
| - | ==== Table:geo ==== | ||
| - | <code sql> | ||
| - | CREATE TABLE `geo` ( | ||
| - | `id` smallint unsigned NOT NULL COMMENT ' | ||
| - | `act` tinyint(1) NOT NULL COMMENT ' | ||
| - | `kana` varchar(255) NOT NULL COMMENT ' | ||
| - | `name` varchar(255) NOT NULL COMMENT ' | ||
| - | `alt` smallint NOT NULL COMMENT ' | ||
| - | `lat` mediumint NOT NULL COMMENT ' | ||
| - | `lon` mediumint NOT NULL COMMENT ' | ||
| - | `auth` tinyint unsigned DEFAULT ' | ||
| - | `note` text COMMENT ' | ||
| - | PRIMARY KEY (`id`) | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | ==== Table: | ||
| - | <code sql> | ||
| - | CREATE TABLE `sanmei` ( | ||
| - | `id` smallint unsigned NOT NULL COMMENT ' | ||
| - | `type` tinyint NOT NULL COMMENT ' | ||
| - | `kana` varchar(255) NOT NULL COMMENT ' | ||
| - | `name` varchar(255) NOT NULL COMMENT ' | ||
| - | UNIQUE KEY `idx_sanmei` (`id`, | ||
| - | KEY `name` (`name`) USING BTREE, | ||
| - | KEY `id` (`id`) | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | ==== Table: | ||
| - | <code sql> | ||
| - | CREATE TABLE `meizan` ( | ||
| - | `cat` tinyint unsigned NOT NULL COMMENT ' | ||
| - | `seqno` smallint unsigned NOT NULL COMMENT ' | ||
| - | `id` smallint unsigned NOT NULL COMMENT ' | ||
| - | `kana` varchar(255) NOT NULL COMMENT ' | ||
| - | `name` varchar(255) NOT NULL COMMENT ' | ||
| - | UNIQUE KEY `idx_meizan` (`cat`, | ||
| - | KEY `id` (`id`) | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | ==== Table: | ||
| - | <code sql> | ||
| - | CREATE TABLE `record` ( | ||
| - | `rec` smallint unsigned NOT NULL COMMENT ' | ||
| - | `start` date NOT NULL COMMENT ' | ||
| - | `end` date NOT NULL COMMENT ' | ||
| - | `issue` date DEFAULT NULL COMMENT ' | ||
| - | `title` varchar(255) NOT NULL COMMENT ' | ||
| - | `summary` varchar(255) DEFAULT NULL COMMENT ' | ||
| - | `link` varchar(255) DEFAULT NULL COMMENT ' | ||
| - | `image` varchar(255) DEFAULT NULL COMMENT ' | ||
| - | PRIMARY KEY (`rec`) | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | ==== Table: | ||
| - | <code sql> | ||
| - | CREATE TABLE `explored` ( | ||
| - | `rec` smallint unsigned NOT NULL COMMENT ' | ||
| - | `start` date NOT NULL COMMENT ' | ||
| - | `summit` date NOT NULL COMMENT ' | ||
| - | `id` smallint unsigned NOT NULL COMMENT ' | ||
| - | `name` varchar(255) NOT NULL COMMENT ' | ||
| - | UNIQUE KEY `idx_explored` (`rec`, | ||
| - | KEY `id` (`id`) USING BTREE, | ||
| - | KEY `rec` (`rec`) | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | ==== Table:poi ==== | ||
| - | <code sql> | ||
| - | CREATE TABLE `poi` ( | ||
| - | `ptid` mediumint unsigned NOT NULL COMMENT ' | ||
| - | `act` tinyint(1) NOT NULL COMMENT ' | ||
| - | `kana` varchar(255) NOT NULL COMMENT ' | ||
| - | `name` varchar(255) NOT NULL COMMENT ' | ||
| - | `alt` smallint NOT NULL COMMENT ' | ||
| - | `lat` mediumint NOT NULL COMMENT ' | ||
| - | `lon` mediumint NOT NULL COMMENT ' | ||
| - | `id` smallint unsigned NOT NULL DEFAULT ' | ||
| - | `c` tinyint NOT NULL DEFAULT ' | ||
| - | PRIMARY KEY (`ptid`), | ||
| - | KEY `id` (`id`) USING BTREE | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | ==== Table: | ||
| - | <code sql> | ||
| - | CREATE TABLE `gyosei` ( | ||
| - | `code` smallint unsigned NOT NULL, | ||
| - | `area` geometry NOT NULL /*!80003 SRID 4326 */, | ||
| - | SPATIAL KEY `area` (`area`) | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | <code sql> | ||
| - | set global max_allowed_packet = 16777216; | ||
| - | show variables like ' | ||
| - | </ | ||
| - | <code perl> | ||
| - | # | ||
| - | use strict; | ||
| - | use warnings; | ||
| - | use utf8; | ||
| - | use open ': | ||
| - | use open ': | ||
| - | use JSON; | ||
| - | use DBI; | ||
| - | use DBD::mysql; | ||
| - | |||
| - | my $dbh = DBI-> | ||
| - | ' | ||
| - | ' | ||
| - | {mysql_enable_utf8mb4 => 1, mysql_server_prepare => 1} | ||
| - | ) or die $DBI:: | ||
| - | |||
| - | open(my $in, '<', | ||
| - | |||
| - | while (my $json_text = < | ||
| - | next if ($json_text !~ /" | ||
| - | chomp($json_text); | ||
| - | chop($json_text) if ($json_text =~ /,$/); | ||
| - | my $data = from_json($json_text); | ||
| - | my $code = $data-> | ||
| - | print ' | ||
| - | my $area = ' | ||
| - | my $sth = $dbh-> | ||
| - | $sth-> | ||
| - | $sth-> | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | $sth-> | ||
| - | } | ||
| - | |||
| - | close($in); | ||
| - | $dbh-> | ||
| - | __END__ | ||
| - | </ | ||
| - | ==== Table:city ==== | ||
| - | <code sql> | ||
| - | CREATE TABLE `city` ( | ||
| - | `code` smallint unsigned NOT NULL, | ||
| - | `name` varchar(255) NOT NULL, | ||
| - | PRIMARY KEY (`code`) | ||
| - | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | ||
| - | </ | ||
| - | <code perl> | ||
| - | # | ||
| - | use strict; | ||
| - | use warnings; | ||
| - | use utf8; | ||
| - | use open ': | ||
| - | use open ': | ||
| - | use URI; | ||
| - | use Web:: | ||
| - | |||
| - | my $codes = scraper { | ||
| - | process 'table tr', ' | ||
| - | process ' | ||
| - | process ' | ||
| - | }; | ||
| - | }; | ||
| - | |||
| - | my $uri = URI-> | ||
| - | my $res = $codes-> | ||
| - | |||
| - | for my $code (@{$res-> | ||
| - | print $code-> | ||
| - | } | ||
| - | __END__ | ||
| - | </ | ||
| - | ===== データベースの検索 ===== | ||
| - | <code php> | ||
| - | <?php | ||
| - | require_once ' | ||
| - | $cf = set_init(); | ||
| - | |||
| - | function deg($s) { | ||
| - | preg_match('/ | ||
| - | return sprintf(' | ||
| - | } | ||
| - | |||
| - | $dsn = " | ||
| - | $dbh = new PDO($dsn, $cf[' | ||
| - | |||
| - | $type = !empty($_POST) ? INPUT_POST : INPUT_GET; | ||
| - | $mode = ' | ||
| - | $val = null; | ||
| - | foreach (array(' | ||
| - | $val = filter_input($type, | ||
| - | if (isset($val)) { | ||
| - | $mode = $i; | ||
| - | break; | ||
| - | } | ||
| - | } | ||
| - | |||
| - | # | ||
| - | # 総称名 | ||
| - | # | ||
| - | $g_kana = array(); | ||
| - | $g_name = array(); | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | while ($row = $sth-> | ||
| - | $g_kana[$row-> | ||
| - | $g_name[$row-> | ||
| - | } | ||
| - | $sth = null; | ||
| - | |||
| - | if ($mode === ' | ||
| - | # | ||
| - | # GeoJSON出力 | ||
| - | # | ||
| - | $v = filter_input($type, | ||
| - | if ($val == 0) { | ||
| - | if ($v == 0) { | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | WHERE act>0 | ||
| - | EOS; | ||
| - | } else if ($v == 1) { | ||
| - | # | ||
| - | # 山行記録のある山を抽出 | ||
| - | # | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM explored | ||
| - | JOIN ( | ||
| - | SELECT * | ||
| - | FROM record | ||
| - | WHERE link IS NOT NULL | ||
| - | ) AS r USING (rec) | ||
| - | ) AS e USING (id) | ||
| - | EOS; | ||
| - | } else if ($v == 2) { | ||
| - | # | ||
| - | # 山+山行記録数を抽出 ※0ではなくNULLが返る | ||
| - | # | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | LEFT JOIN ( | ||
| - | | ||
| - | FROM explored | ||
| - | JOIN ( | ||
| - | SELECT * | ||
| - | FROM record | ||
| - | WHERE link IS NOT NULL | ||
| - | ) AS r USING (rec) GROUP BY id | ||
| - | ) AS e USING (id) | ||
| - | WHERE act>0 | ||
| - | EOS; | ||
| - | } | ||
| - | } else { | ||
| - | if ($v == 0) { | ||
| - | # | ||
| - | # 名山カテゴリを指定して抽出 | ||
| - | # | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM meizan | ||
| - | WHERE cat=? | ||
| - | ) AS m USING (id) | ||
| - | EOS; | ||
| - | } else if ($v == 1) { | ||
| - | # | ||
| - | # 名山カテゴリを指定して山行記録のある山を抽出 | ||
| - | # | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM meizan | ||
| - | WHERE cat=? | ||
| - | ) AS m USING (id) | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM explored | ||
| - | JOIN ( | ||
| - | SELECT * | ||
| - | FROM record | ||
| - | WHERE link IS NOT NULL | ||
| - | ) AS r USING (rec) | ||
| - | ) AS e USING (id) | ||
| - | EOS; | ||
| - | } else if ($v == 2) { | ||
| - | # | ||
| - | # 名山カテゴリを指定して山+山行記録数を抽出 ※0ではなくNULLが返る | ||
| - | # | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM meizan | ||
| - | WHERE cat=? | ||
| - | ) AS m USING (id) | ||
| - | LEFT JOIN ( | ||
| - | SELECT id, | ||
| - | FROM explored | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM record | ||
| - | WHERE link IS NOT NULL | ||
| - | ) AS r USING (rec) GROUP BY id | ||
| - | ) AS e USING (id) | ||
| - | EOS; | ||
| - | } | ||
| - | } | ||
| - | $sth = $dbh-> | ||
| - | if ($val != 0) { | ||
| - | $sth-> | ||
| - | } | ||
| - | $sth-> | ||
| - | header(' | ||
| - | echo ' | ||
| - | $count = 0; | ||
| - | while ($row = $sth-> | ||
| - | if ($count > 0) { | ||
| - | echo ',', | ||
| - | } | ||
| - | $id = $row-> | ||
| - | $name = $row-> | ||
| - | if ($val == 0 && isset($g_name[$id])) { | ||
| - | $name = $g_name[$id] . ' | ||
| - | } | ||
| - | $lat = deg($row-> | ||
| - | $lon = deg($row-> | ||
| - | $c = $row->c ? 1 : 0; | ||
| - | echo <<< | ||
| - | {" | ||
| - | " | ||
| - | EOS; | ||
| - | $count++; | ||
| - | } | ||
| - | $sth = null; | ||
| - | echo PHP_EOL, ' | ||
| - | } elseif ($mode === ' | ||
| - | # | ||
| - | # JSON出力(逆ジオコーディング) | ||
| - | # | ||
| - | $lon = filter_input($type, | ||
| - | $lat = filter_input($type, | ||
| - | $sql = <<<' | ||
| - | SET @pt=ST_GeomFromText(CONCAT(' | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | # MariaDB は ' | ||
| - | $sth-> | ||
| - | $sth-> | ||
| - | $sth-> | ||
| - | $sth = null; | ||
| - | $sql = <<<' | ||
| - | SELECT code,name FROM gyosei LEFT JOIN city USING (code) WHERE ST_Contains(area, | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | $code = 0; | ||
| - | $name = ' | ||
| - | while ($row = $sth-> | ||
| - | $code = $row-> | ||
| - | $name = $row-> | ||
| - | } | ||
| - | $sth = null; | ||
| - | $output = array( ' | ||
| - | header(' | ||
| - | echo json_encode($output, | ||
| - | } elseif ($mode != ' | ||
| - | # | ||
| - | # JSON出力 | ||
| - | # | ||
| - | $c = filter_input($type, | ||
| - | $geo = array(); | ||
| - | $rec = array(); | ||
| - | if ($mode === ' | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM meizan | ||
| - | WHERE cat=? | ||
| - | ) AS m USING(id) | ||
| - | WHERE id=? | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | $sth-> | ||
| - | } elseif ($mode === ' | ||
| - | if ($val > 0) { | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | WHERE id=? | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | } else { | ||
| - | $sql = <<<' | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | WHERE act>0 ORDER BY id DESC LIMIT 20 | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | } | ||
| - | } else { | ||
| - | if (substr($val, | ||
| - | $eq = ' LIKE '; | ||
| - | } else { | ||
| - | $eq = ' | ||
| - | } | ||
| - | $sql = <<< | ||
| - | SELECT id, | ||
| - | FROM geo | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM sanmei | ||
| - | WHERE name$eq? | ||
| - | ) AS s USING(id) | ||
| - | WHERE act>0 | ||
| - | ORDER BY alt DESC LIMIT 400 | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | } | ||
| - | $sth-> | ||
| - | while ($row = $sth-> | ||
| - | $id = $row-> | ||
| - | $name = $row-> | ||
| - | $kana = $row-> | ||
| - | if (!($mode === ' | ||
| - | $name = $g_name[$id] . ' | ||
| - | $kana = $g_kana[$id] . ' | ||
| - | } | ||
| - | $geo[] = array( | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ); | ||
| - | } | ||
| - | $sth = null; | ||
| - | |||
| - | if ($mode === ' | ||
| - | $alias = array(); | ||
| - | $sql = <<<' | ||
| - | SELECT kana,name | ||
| - | FROM sanmei | ||
| - | WHERE id=? AND type>1 | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | $sth-> | ||
| - | while ($row = $sth-> | ||
| - | $alias[] = array(' | ||
| - | } | ||
| - | $sth = null; | ||
| - | $geo[0][' | ||
| - | } elseif ($mode === ' | ||
| - | $sql = <<<' | ||
| - | SELECT summit, | ||
| - | FROM record | ||
| - | JOIN ( | ||
| - | | ||
| - | FROM explored | ||
| - | WHERE id=? | ||
| - | ) AS e USING (rec) | ||
| - | WHERE link IS NOT NULL | ||
| - | EOS; | ||
| - | $sth = $dbh-> | ||
| - | $sth-> | ||
| - | $sth-> | ||
| - | while ($row = $sth-> | ||
| - | $rec[] = array( | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ' | ||
| - | ); | ||
| - | } | ||
| - | $sth = null; | ||
| - | } | ||
| - | $output = array(' | ||
| - | header(' | ||
| - | echo json_encode($output, | ||
| - | } | ||
| - | $dbh = null; | ||
| - | </ | ||
sanmei/database.1592497744.txt.gz · 最終更新: by anineco
