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 · 最終更新: 2020/06/19 01:29 by anineco