都道府県、市町村区の名前をDBへ

郵便番号データダウンロード - 日本郵便辺りだともっと細かい町字レベルの名称まで得られるはずだが、流石にそこまで細かいと

  1. 妖怪地図作りに使うには固有名詞などとの重複が増える
  2. そもそも町字まで限定された既述のある項目はそう多いとは思えない

という訳で市町村区までの名称があれば地名抽出には十分かと思われる。

CSV落す

統計局ホームページ/統計に用いる標準地域コードより「全国(CSV:103KB)」を落としてSQLiteへ取り込み。自分の場合は前にシェープファイルを扱ったspatialite-gui.exeを使って取り込み。Pupsqlite等にもCSV取り込みを補助する機能はあるので割愛。

MySQLでの取り込み

MySQLに取り込むのが理想だが、MySQL Workbenchには取り込みを補助する機能がないようなので横着してしまった。*1誰かそういう機能があるツール教えてください。

MYSQL CSVファイル入出力

面倒がらずに取り込んだらやっぱりMySQLにまとめた方が便利だった。WikipediaダンプをSQLiteに取り込めればそっちにまとめるのもありだとは思いますが。

自分で作業した際ハマった点は以下2点。

  1. バックスラッシュは二重にする
  2. 取り込み元のCSVをUTF8にする際BOMを付けない
LOAD DATA INFILE "F:\\download\\20100825-020308_www.stat.go.jp.csv" INTO TABLE yokai_wiki.aacode
FIELDS TERMINATED BY ',';

中身を見る

SELECT "tiiki-code" AS "tiiki-code", "ken-name" AS "ken-name",
    "sityouson-name1" AS "sityouson-name1", "sityouson-name3" AS "sityouson-name3"
FROM "aacode"

*1:SQLを自分で書いて取り込む事はできたはず。あまりきちんと調べていない

行政区分以外の地名

妖怪地図の作成に関してメモ。行政区分名だけで捕捉できない地名について。

都道府県、市町村、特別区など以外に「wikipedia:奥多摩」「wikipedia:本所 (墨田区)」といった行政区分に限定されない地名や、「wikipedia:利根川」のような自然の地形が舞台となっている伝承も多い。

ひとまずは行政区分の名前で抽出して、

  1. 行政区名で絞り込み
  2. 領域・地点が重複する行政区分以外の地名を抽出

とするのが効率的と思われる。

Wikipediaダンプから地名を抽出

↓このへんの記事の続き
Wikipedia記事データのローカルDBへの取り込み - 泥縄トラップ
「日本の妖怪一覧」からリンクされたページIDを抽出 - 泥縄トラップ
妖怪の生息地 - 泥縄トラップ

  • Wikipediaの本文のデータを落としてMySQLの中へ取り込む
  • 落としたデータから「日本の妖怪の一覧」に含まれる妖怪のページを抽出
  • 折角なので「妖怪」のページへリンクしている項目は全部抽出してみる
  • 項目本文のテキストから地名を抽出して、項目と地名を関連付ける
  • 地名を地理情報のデータと関連付けて、「妖怪の生息地図」的な物を作る

出力結果

左の数字がpageテーブルとtextテーブルの内容を繋げるID「text.old_id」。右がそのテキスト内に含まれる都道府県名。テーブル構造についてはText table/ja - MediaWikiなどを参照。

これだけ見てもあまり面白くはない。このままだと扱うのが面倒なのでMySQLに取り込みたいところ。

31161681,兵庫県
31161681,大阪府
31161681,奈良県
…
28607176,新潟県
28607176,福井県
28607176,福島県

コード例

require 'rubygems'
require 'mysql'
require 'sqlite3'

#sqliteで地名準備
db_location = "F:\\tools\\spatialite-gui-win-x86-1.3.0_beta\\20100318.sqlite"

#都道府県の一覧
sqlite = SQLite3::Database.new(db_location)
sql = "select distinct PRN from japan"
loc_names = sqlite.query(sql)

#mysqlのdbを開く
hostname = "localhost"
user = "****"
password = "****"
dbname = "yokai_wiki"

#yokai_wikiの本文テーブルを見る
mysql = Mysql::new(hostname, user, password, dbname)
res = mysql.query("select old_id, old_text from yokai_wiki.text")

#本文中の都道府県名検索
res.each do |ms_row|
  #都道府県を全部回す
  loc_names.each do |name|
    name = name.to_s
    puts ms_row[0]+","+name if ms_row[1].to_s.include?(name) #=>"0001,北海道"
  end
  
  #loc_namesのカーソルリセット
  loc_names.reset
end

mysql.close

*1:手元にあるのが現代の行政区分のデータだけなので別にデータが必要になる

dbの読み込みテスト

sqlite.rb

#sqlite.rb
#ruby1.8
require 'rubygems'
require 'sqlite3'

db_location = "F:\\tools\\spatialite-gui-win-x86-1.3.0_beta\\20100318.sqlite"

db = SQLite3::Database.new(db_location)
sql = "select distinct aac, cn2 from japan"
res = db.query(sql)

res.each do |row|
  puts row.join(" | ")
end

mysql.rb

#mysql.rb
#ruby1.8 mysql5.1
require 'rubygems'
require 'mysql'

#mysqlのdbを開く
hostname = "localhost"
user = "root"
password = "hoge040piyo"
dbname = "wikidb"

db = Mysql::new(hostname, user, password, dbname)
res = db.query("select * from page limit 10")

#中身を表示する
res.each do |row|
  p row[0]
end

db.close

マスを綺麗にする事

書かないと忘れるので。

HEX地球儀

恐らく、六角形か五角形の頂点以外の一辺の中に無駄な頂点が設定してあると、投影法が変わった時に一辺が直線でないマスが出来てしまう。頂点以外の頂点(?)を削除すれば投影法を変えてもマスの辺自体は綺麗になるんだろうか。

HEX地球儀


ISEA Based DGGs
Foldable Images of the ISEA3H Discrete Global Grid
ISEA3Hとか言うやり方だと地球全部を六角形と五角形六角形で埋め尽くせる、らしいです。ただし、Googleマップなんかと同じ投影法の地図上に表示すると凄まじく変形します。日本の辺りは比較的歪みが少ないですが、南極北極付近は凄い事になります。

Hex生成→Shpファイルにする

DGGRID Software 生成に使うソフト。生成の準備(設定を事前にファイルに書き込む)がめんどくさそうなのでひとまずこれは保留。

ISEA Aperture 3 Hexagon (ISEA3H) DGGから適当な解像度の物を落とし、展開すると「gen」形式のデータが入っている。これをgen2shpで変換するとShapeファイルとして扱える。

gen2shpの扱いについてはテキストファイルをShapefileに変換する方法 gen2shp txt2dbfを参照。

あとはSpatialiteか何かに取り込んで、一定の範囲だけ取り出せば上の画像にあるような日本近傍のHexが得られます。

返信

id:kokogiko 色々検索で漁り始めた元は「Geohexが全球行けたら素敵だよなー」だったりします。日本付近で凹と凸ができちゃってるHexだとplygon上手く弄ればギリギリ許容範囲かな、とも思うんですが、メルカトル図法の地図上で使う+そもそも全球対応が目標とすると極地付近とかがいかんともし難いですね…。