PythonでMySQLを使ってみる。基本編[Chapter 20]

====== PythonでMySQLを使ってみる準備編[Chapter 20] ======
[[http://blog.godo-tys.jp/2013/09/13/4266/|PythonでDatabaseを使ってみる準備編[Chapter 19] ]]に引き続き、Spatial Indexを扱えるOpen Source DatabseとしてPythonでMySQLを使用する基本を学んでおきます。

本tutorialは、[[http://www.packtpub.com/python-geospatial-development/book|Python Geospatial Development]]を参考にして、実践的に使えるPythonでGeoSpatialの使い方を学んでいくものです。

===== 準備 =====
Python環境については、[[http://blog.godo-tys.jp/2013/06/19/2465/|PythonでGeoSpatialをやってみる。[Chapter 1] ]]と[[http://blog.godo-tys.jp/2013/07/11/2937/|PythonでGeoSpatial Dataの読み書きについて_1[Chapter 8] ]]でPythonとGeoSpatialに関するlibraryが設定できているもとして進めていきます。

===== MySQL =====
==== Install ====
MySQLのinstallについては、[[http://www.dbonline.jp/mysqlinstall/install/index2.html|MySQL 5.6.11 インストール]]を参考にしてください。
Oracleに買収されてから、installerが機能豊富すぎて本当に迷います。
今回使用するMySQLは、**mysql-installer-community-5.6.13.1.msi**を使います。(09/16/2013現在)

MySQLをcommand lineから起動後、正しくinstallされていると
{{http://blog.godo-tys.jp/wp-content/gallery/python_20/image01.jpg}}
のようにmysqlのmodeが表示されます。表示されない場合は、MySQLが正しくinstallされていないので、再度installしてください。

次に、PythonからMySQLを使うには、MySQL-Python driverが必要になります。
MySQL-Python driverは[[http://www.codegood.com/|Python driver download]]から取得します。ここでは、32bit環境で動かしているので、** MySQL-python-1.2.3.win32-py2.7.exe**をdownloadしてinstallします。

MySQL-Python driverは、
{{http://blog.godo-tys.jp/wp-content/gallery/python_20/image02.jpg}}
のようにPython programとMySQLをつなぐinterfaceとなります。

==== MySQL-Python driverの確認 ====
次に、driverが正しくinstallされているかの確認をしてみます。
PyScripterを起動して、
{{http://blog.godo-tys.jp/wp-content/gallery/python_20/image03.jpg}}
のようにインタープリタ画面に**import MySQLdb**を入力します。
エラーが表示されなければ、driverのinstallは完了です。
**help(MySQLdb)**でmoduleの確認ができます。

続けて、以下のcodeを入力してみます。
ここで、**user=”root”**, **passwd=”admin”**はinstall時のものに置き換えてください。

connection = MySQLdb.connect(user="root", passwd="admin")
cursor = connection.cursor()
cursor.execute("USE myDatabase")


すると、
{{http://blog.godo-tys.jp/wp-content/gallery/python_20/image05.jpg}}
のように接続状況が表示されます。

ここでは、あらかじめMySQLに**myDatabase**という名前でdatabaseを作成していたので、**0L**として行数が0の情報が表示されています。
MySQLの操作方法については、[[http://www.dbonline.jp/mysql/|MySQLの使い方]]等を参考にしてください。

==== MySQLのtabeleの作成 ====
MySQLでの polygonを含んだtableの作成は、

CREATE TABLE cities (
    id      INTEGER AUTO_INCREMENT PRIMARY KEY,
    name    CHAR(255),
    outline POLYGON NOT NULL,
    INDEX (name),
    SPATIAL INDEX (outline)
)


として、MySQLのcommand lineから実行します。

たとえば、POLYGONが有効なカラム・タイプで、直接geometryに空間のインデックスを作成することができることに注目してください。これは、次のようなSQLを出すことを可能にします。

SELECT name FROM cities WHERE MBRContains(outline, myLocation)


このSQL statementは、与えられた位置が都市のoutline内にあることをMBRContains() functionを使うことで該当する都市をすべて返します。

==== MySQLを使ったPython program ====
MySQLの能力の主な制限であるMBRContains() functionの最初の「MBR」は、 Minimum Bounding Rectangleを表わします。そのMBRContains functionは、pointが多角形の内部にあるかどうか実際に判断しません。
もっと正確に言えば、それは、pointがMinimum Bounding Rectangleの内部にあるかどうか判断します:
{{http://blog.godo-tys.jp/wp-content/gallery/python_20/image04.jpg}}

図に示すとおり、よりやや薄いgray pointがMinimum Bounding Rectangleの外部で、濃いblack pointはMinimum Bounding Rectangleの内部にあります。
これは、MBRContains() functionがfalse positivesを返すことを意味します。すなわちbounding rectangleの内部にあるが、polygonの外部であるpointとなります。

MySQLに完全に見切りをつける前に、このbounding rectangleの計算が何を与えるか考えてください。
たとえば、100万pointを持っており、どのpointが与えられたpolygon内にあるか速く決める必要があれば、MBRContains() functionはpolygonのbounding rectangleにあることによって、polygonの内部にあるかもしれない少数のpointまで狭めることができます。
その後、Databaseからpolygonを抽出し、Shapelyなどの別の機能を使用することができます。
次のcodeは、これらの数残るpointに関する最終計算を行う方法を含んでいます。

cursor.execute("SELECT AsText(outline) FROM cities WHERE ...") 
wkt = cursor.fetchone()[0]
polygon = shapely.wkt.loads(wkt)
pointsInPolygon = []
cursor.execute("SELECT X(coord),Y(coord) FROM coordinates " +
               "WHERE MBRContains(GEOMFromText(%s), coord)",
               (wkt,))
for x,y in cursor:
    point = shapely.geometry.Point(x, y)
    if polygon.contains(point):
        pointsInPolygon.append(point)


最初にMinimum Bounding Rectangle内のpointをすべて見つけて、次にpolygon内部で実際にあるかどうか確かめるために、pointをcheckしてくれるようにDatabaseに依頼します。このアプローチは少しだけ仕事を増やすころになります。しかし、典型的なpolygonのために、非常に効率的で計量することができます。

===== MySQLを使う意味 =====
Spatialの機能が制限されたとしても、MySQLは他の利点を持っています。また、実行処理時間も問題でもあります。しかし、geo-spatialのために、2つの主な長所を持ちます:
* MySQLはとてもポピュラーなDatabaseです。そして、すでに使用しているHosting Serverに簡単にセット・アップできます。また、MySQLが既にinstasllされるであろうということです。
* MySQLは、初心者でも取り扱いが容易なデータベースです。他のデータベース(特にPostgreSQL)は、正確に初心者が使用するのに困難なことで悪名高いものです。

===== 今回のまとめ =====
今回は、PythonでMySQLを使うときの基本事項について学びました。
次回はいよいよPostGISを使うときの基本事項について学んでいみます。

また、本tutorialは、Python Scriptの基本的なことはある程度理解している前提で今後も話を進めていきます。また、誤字、脱字、spell間違いや勘違いや翻訳間違いなど多々出てくると考えられます。
それは違うじゃん!!とかいろんな意見をいただければと思います。
そこんところ ヨロシク~~!!

**[[http://blog.godo-tys.jp/python-geospatial-tutorial/|Python GeoSpatial Tutorialの目次に戻る。]]**

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

CAPTCHA