[python]駅データをプロットしたら日本地図になった。

[python]駅データをプロットしたら日本地図になった。をはてなブックマークに追加 [python]駅データをプロットしたら日本地図になった。をdel.icio.usに追加 Yahoo!ブックマークに登録 [python]駅データをプロットしたら日本地図になった。をGoogle Bookmarksに追加

全駅のプロット

stations.png

都内から秦野くらいまでのプロット

kanto.png

駅データがダウンロードできると聴いて飛んで行きました。このデータでなにしようかなー?とあぐねいていましたが、この駅データは緯度経度もデータとして持っているので、pythonで2次元マッピングしてみました。

1枚目の写真が日本全国のプロット。確かに日本に見えますね。駅データは1万件程あって、左下の方に沖縄と思われるデータもプロットされています。2枚目のデータは小田急線を中心として都内をプロットしたものです。都内の方はごちゃごちゃして何が何だかわからない状態ですが、SQLiteにデータを突っ込んだので、

select * from stationdata where line_name = 'JR山手線'

のように取得すれば、〜線単位でプロットで来ますね。

山手線のプロット

yamanote.png

山手線はこんな感じで見れます。ただ、これをどうしようかは全然考えてないです。桃鉄的なゲームのマスタにはなりそうですね。
とりあえず、以下のコードがSQLiteに突っ込むコード。csvをダウンロードして先頭行をデリってあげないと駄目です。
SQLiteのデータベースはこちら

# -*- coding: utf-8 -*-
import csv
import sqlite3
DBNAME = "stationData.sqlite"
def initDB():
conn = sqlite3.connect( DBNAME )
try:
conn.executescript("""CREATE TABLE STATIONDATA(
RR_CD INTEGER NOT NULL,
LINE_CD INTEGER NOT NULL,
STATION_CD INTEGER NOT NULL,
LINE_SORT INTEGER,
STATION_SORT INTEGER,
STATION_G_CD INTEGER NOT NULL,
R_TYPE INTEGER NOT NULL,
RR_NAME TEXT NOT NULL,
LINE_NAME TEXT NOT NULL,
STATION_NAME TEXT NOT NULL,
PREF_CD INTEGER NOT NULL,
LON NUMBER(3,6),
LAT NUMBER(3,6),
F_FLAG INTEGER NOT NULL,
PRIMARY KEY ( STATION_CD )
);""")
conn.executescript("""CREATE INDEX IDX_STATIONDATA ON STATIONDATA(
RR_CD, LINE_CD, STATION_CD
);""")
except Exception, ex:
conn.commit()
finally:
conn.close()
initDB()
conn = sqlite3.connect( DBNAME )
conn.text_factory = str
filename = "m_station.csv"
csvfile = open( filename )
for row in csv.reader( csvfile ):
conn.execute("INSERT INTO STATIONDATA( RR_CD, LINE_CD, STATION_CD, LINE_SORT, STATION_SORT, STATION_G_CD, R_TYPE, RR_NAME, LINE_NAME, STATION_NAME, PREF_CD, LON, LAT, F_FLAG ) VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )", ( row[ 0 ], row[ 1 ], row[ 2 ], row[ 3 ], row[ 4 ], row[ 5 ], row[ 6 ], row[ 7 ], row[ 8 ], row[ 9 ], row[ 10 ], row[ 11 ], row[ 12 ], row[ 13 ] ) )
conn.commit()
csvfile.close()

で、プロットするのが以下のコード。TrueTypeFontはほにゃじを使っています。みたまんまのコードなので、オフセットとかもう少し拡大したいとか〜線だけプロットしたいとかはコードを書き換えればおk。

from PIL import Image, ImageDraw, ImageFont
import sqlite3
stationList = []
img = Image.new( 'RGB',( 2200, 2200 ), ( 255, 255, 255 ) )
DBNAME = "stationData.sqlite"
conn = sqlite3.connect( DBNAME )
conn.text_factory = str
conn.row_factory = sqlite3.Row
cur = conn.cursor()
cur.execute( "SELECT STATION_NAME, LON, LAT FROM STATIONDATA" )
stationList = [ ( idx[ 0 ], idx[ 1 ], idx[ 2 ] ) for idx in cur ]
font = ImageFont.truetype( "HONYA-JI.ttf", 10, encoding='utf-8' )
draw = ImageDraw.Draw( img )
for i in range( len( stationList ) ):
n = stationList[ i ][ 0 ]
x = round( ( stationList[ i ][ 1 ] - 127.652214 ) * 100, 0 ) + 100
y = 2000 - round( ( stationList[ i ][ 2 ] - 26.193289 ) * 100, 0 )
draw.text( ( x, y ), unicode( n, "utf-8" ), font = font, fill = ( 0, 0, 0 ) )
img.save( 'station.png', 'PNG' )

でも何に使おうかね。

コメントをどうぞ