いつのまにやらOpenLayersじゃなくてLeafletとかでてきたり、DjangoでPostGISが使えるとか、知らないことが多すぎたので時代に追いつけ追い越せということで試してみました。なお、そこそこの長編になりましたので分割してお送りします。
はじめに
今回の登場人物を整理しておきましょう。
- PostGISPostgreSQLにGIS機能を追加したもの。最近はMySQLとかSQLite(SpatiaLite)でも地図データを扱えるようなのですが、機能的に一番充実してると思うのでPostGISを使うことにしました。
- Django(GeoDjango)PythonのWebアプリケーションフレームワーク。いつの間にかGIS関連の対応をしており、その機能に注視した時にGeoDjangoと呼んでる感じでしょうか。つまりPostGISが”PostgreSQL+GIS拡張”なのと同じように、GeoDjangoは”Django+GIS拡張”と考えればいいじゃないでしょうか。なお、GeoDjango自体はDjangoに含まれますが、GeoDjangoとしてGIS関連の機能を使う場合には、GIS関連の依存ライブラリの導入が必須です。
GeoDjangoを使って何ができるのかというと、ブラウザからのリクエストに応じてバックエンドのPostGIS等のDBに対して空間検索を行い、結果をKMLやGeoJSON等の形式で返すことができます。つまりベクタ情報を扱えるWebフレームワークというイメージです(画像を扱えるかどうかはすいません、今のところわかってません)。 - LeafletWebブラウザ側で地図表示を行う時に利用するJSライブラリ。実のところ、OSSのJSライブラリとしてはOpenLayersしか知りませんでしたが、最近こちらも盛り上がっているようなので、今回はLeafletを使うことにしました。
Leafletを使うと、OpenStreetMapや地理院地図のタイル地図を表示した上に、GeoJOSNで取得した情報を重ねて表示することができます(勿論、OpenLayersでも可能です)。
これらを組み合わせて、ブラウザ上にOSMの地図を表示させ、その上にPostGISのデータを表示させるというところが今回の記事になります。GeoDjangoのチュートリアルを元にしていますので、合わせてそちらも参照すると良いかと思います。
環境構築
導入対象の環境
はい、みんな大好きUbuntuです。Server版としてインストールしただけで特別な状態ではありません。あ、Docker入ってますけど。あ、ついでにVagrantで上げてみました。
なお、今回データベースに登録するデータで日本語が入るのでUTF-8にしといたほうが後々はまらないと思いますがそんなもんはデータベース作成時にどうにかできるぜという人はご自由な言語にしておいてください。
$ sudo lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.1 LTS Release: 14.04 Codename: trusty $ echo $LANG ja_JP.UTF-8
1.PostGISのインストール
「PostGIS公式のインストール手順」から、Ubuntu14.04向けの手順を実施
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt trusty-pgdg main" >> /etc/apt/sources.list' $ wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add - $ sudo apt-get update $ sudo apt-get install postgresql-9.3-postgis-2.1 postgresql-contrib
2.データベースとかユーザ作成
入れなくてもいいのかもしれないですがadminpackを。
$ sudo -u postgres psql psql (9.3.5) "help" でヘルプを表示します. postgres=# CREATE EXTENSION adminpack; CREATE EXTENSION postgres=# \q
postGIS向けデータベースのひな形を作成します。(2014/12/12追加)
sudo -u postgres createdb template_postgis sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.3/contrib/postgis-2.1/postgis.sql sudo -u postgres psql -d template_postgis -f /usr/share/postgresql/9.3/contrib/postgis-2.1/spatial_ref_sys.sql
djangoからDBアクセスする為のユーザを作成します(パスワードは任意で)。
$ sudo -u postgres createuser geodjango -P 新しいロールのためのパスワード:**** もう一度入力してください:****
データベースを作成して先程作成したユーザに権限を付与します(2014/12/12修正)。
$ sudo -u postgres createdb -T template_postgis geodjangodb $ sudo -u postgres psql geodjangodb psql (9.3.5) "help" でヘルプを表示します. geodjangodb=# GRANT ALL ON DATABASE geodjangodb TO geodjango; GRANT geodjangodb=# \q
作成したユーザから接続できるようにpostgresの設定を変えてリスタート。
sudo vi /etc/postgresql/9.3/main/pg_hba.conf ----------------------------------------------- # peer -> md5 #local all all peer local all all md5 ----------------------------------------------- $ sudo service postgresql restart
今回はローカル接続なのでこの状態で接続確認しておきましょう。
$ psql geodjangodb -U geodjango ユーザ geodjango のパスワード:**** psql (9.3.5) "help" でヘルプを表示します. geodjangodb=>\q
3.GeoDjangoのインストール
GeoDjangoは普通にDjangoに含まれています。依存パッケージは「公式の手順」ではソースからビルドしていますが、今回の動作確認レベルではaptのバイナリで動作したので今回はお手軽方式でやることにします(ipythonは無くてもいいはず)。
$ sudo apt-get install gdal-bin $ sudo apt-get install python-psycopg2 $ sudo apt-get install python-pip $ sudo pip install Django==1.7.1 $ sudo pip install ipython
はい、これでようやくGeoDjangoを使える環境が整いました。