前回でGeoDjangoへのデータ登録が完了しましたので、ようやく管理画面から登録したデータを表示させてみましょう。Djangoと言えば、モデル定義だけすれば管理画面でCRUD操作ができてしまうというデータメンテなんて管理画面だけで充分だという人には嬉しい機能があります。それが地図オブジェクトでもできちゃうのだぜというのが今回の記事です。
標準の管理画面を表示させてみる
それでは、早速標準の管理画面を表示させてみましょう。
$ vi demo/admin.py
from django.contrib.gis import admin from demo.models import Border admin.site.register(Border, admin.GeoModelAdmin)
$ vi geodjango/urls.py
from django.conf.urls import patterns, include, url from django.contrib.gis import admin admin.autodiscover() urlpatterns = patterns('', url(r'^admin/', include(admin.site.urls)), )
最後に、管理画面にアクセスするユーザを作成します。ここではadminという名前にしました。Emailは適当でOKです。
$ python manage.py createsuperuser Username (leave blank to use 'vagrant'): admin Email address: admin@hohgoe.hoge Password:**** Password (again):**** Superuser created successfully.
いよいよ、起動します。なお引数指定しないとlocalhost:8000しかアクセスできません。
$ python manage.py runserver 0.0.0.0:8000 Performing system checks... System check identified no issues (0 silenced). December 11, 2014 - 16:57:50 Django version 1.7.1, using settings 'geodjango.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.
ブラウザから「http://x.x.x.x:8000/admin/」にアクセスしてみましょう。
ログイン画面がでるので先程作成したユーザ「admin」でログイン
「行政区域一覧」をクリックします。
「行政区域」の一覧が表示されました。
なお、「行政区域一覧」や「行政区域」という名称は前回モデルクラス定義の際にMetaクラスで指定したものになります。こちらを指定しない場合はそれぞれ「Borders」「Border」とクラス名で表示されます。
任意の行政区域をクリックします。
こんな感じでポリゴンを地図上で編集できるようになります。
ほとんど何もしてないのに地図上で編集できるとか恐ろしい子です、GeoDjangoちゃんは。でも、登録データ数が多いと、ページネーションだけで目的のデータを探すのは正直イケてないですよね(今回の画像例も大変でした)。また、デフォルトの地図編集画面もちょっと淋しげ。このまま管理画面を使えというのはちょっと忍びない感じですので、カスタマイズしてみましょう。
カスタマイズした管理画面を表示させてみる
今回は、地図編集画面のカスタマイズと、モデルの検索とフィルタ機能を追加してみます。
Djangoにはプラグインという機構があり、有志が色々と便利なものを公開しているようです。GeoDjangoについても、今回いくつか使ってみることにします。ここでは地図表示関連をカスタマイズするためにdjango-leafletというものを使ってみました(管理画面だけでいうとOSMGeoAdminというものもあるのですが、今回はあえてLeaflet使いました)。
django-leafletのインストール
pipでインストール。
$ sudo pip install django-leaflet Downloading/unpacking django-leaflet Downloading django-leaflet-0.15.1.tar.gz (199kB): 199kB downloaded Running setup.py (path:/tmp/pip_build_root/django-leaflet/setup.py) egg_info for package django-leaflet Requirement already satisfied (use --upgrade to upgrade): Django in /usr/local/lib/python2.7/dist-packages (from django-leaflet) Installing collected packages: django-leaflet Running setup.py install for django-leaflet Successfully installed django-leaflet Cleaning up...
django-leafletの有効化
プロジェクト設定を編集してプラグインを追加します。
$ vi geodjango/settings.py
以下の一行をINSTALLED_APPSの末尾に追加します。
INSTALLED_APPS = ( 'django.contrib.gis', 'demo', 'leaflet', # add )
地図編集画面を切り替える為に以下を書きかえます。
$ vi demo/admin.py
from django.contrib.gis import admin from demo.models import Border from leaflet.admin import LeafletGeoAdmin admin.site.register(Border, LeafletGeoAdmin)
GeoModelAdminに代わってLeafletGeoAdminを登録します。
これで、地図編集画面が変更されました。
検索・フィルタ機能の追加
引き続き、管理画面に行政区域の検索・フィルタ機能を追加します。
$ vi demo/admin.py
from django.contrib.gis import admin from demo.models import Border from leaflet.admin import LeafletGeoAdmin class BorderAdmin(LeafletGeoAdmin): search_fields = ['n03_001','n03_003','n03_004'] list_filter = ('n03_001', ) admin.site.register(Border, BorderAdmin)
LeafletGeoAdminを継承したBorderAdminクラスを定義し、「search_fields」と「list_filter」を定義します。「search_fields」で定義されているフィールドが検索対象になります。「list_filter」で定義されているフィールド名がフィルタ対象となります。
最後に、LeafletGeoAdminに代わって定義したクラスを登録します。
それでは一度サーバを落として再起動して、ブラウザでログインしてみましょう。
行政区域の一覧画面に検索フィールドと都道府県フィルターが追加されました。
試しに検索フィールドに「浦和」を入れたらすぐに検索されました。
行政区域をクリックすると先程よりは若干豪華な地図画面が表示されました(ベースマップがOSMになったせいですが)。こちらがdjango-leafletの効果です。ポリゴン編集も標準よりはやりやすい気がします(個人的に)。
なお、django-leafletは管理画面以外にも色々と便利な機能があると思いますが、今回は使ってないので気になる人は以下リンクを参照ください。
次はGeoJSONを出力させてみることにましょう。