galapagosit’s blog

本家 > http://galapagosit.com/

国土数値情報 行政区域データをGeoDjangoに取り込み

国土数値情報 行政区域データの詳細

上記から行政区画データをダウンロードし、GeoDjangoから扱えるようにするための手順。
postgisはインストール済みとする。

地図情報のダウンロード

"全国"をクリックし最新の"N03-20150101_GML.zip"をダウンロード。

sqlファイル作成

データの格納と表示 — Let's Postgres

上記を参考にsqlファイルを作成

shp2pgsql -s 4612 -D -i -I -W cp932 ~/Desktop/N03-20150101_GML/N03-15_150101.shp gisdata > ~/Desktop/gisdata.sql

参考サイトではJPGISからシェープファイルに変換する手順が必要とあるが、ダウンロードしたファイルに含まれていたのでそれを使用した。

既存のデータベースにデータを投入

psql postgres -f ~/Desktop/gisdata.sql

modelを定義

from django.contrib.gis.db import models


class GisData(models.Model):
    gid = models.IntegerField(primary_key=True)
    n03_001 = models.CharField(max_length=10)
    n03_002 = models.CharField(max_length=20)
    n03_003 = models.CharField(max_length=20)
    n03_004 = models.CharField(max_length=20)
    n03_007 = models.CharField(max_length=5)

    geom = models.MultiPolygonField(spatial_index=True, srid=4612)

    objects = models.GeoManager()

    class Meta:
        db_table = 'gisdata'

    def __str__ (self):
        params = {
            'gid': self.gid,
            'n03_001': self.n03_001,
            'n03_002': self.n03_002,
            'n03_003': self.n03_003,
            'n03_004': self.n03_004,
            'n03_007': self.n03_007,
        }
        return '<GisData({gid}) n03_001:{n03_001} n03_002:{n03_002} n03_003:{n03_003} n03_004:{n03_004} n03_007:{n03_007}>'.format(**params)

使用方法

>>> from django.contrib.gis.geos import Point
>>> from gisdata.models import GisData
>>> point = Point(139.699578, 35.659531) # 渋谷駅周辺の座標
>>> r = GisData.objects.filter(geom__contains=point)
>>> print(r[0])
<GisData(32097) n03_001:東京都 n03_002:None n03_003:渋谷区 n03_004:None n03_007:13113>

上記の感じで取得する。
あまりドキュメントを読まずにやったので、何か間違いがあるかも。