GIS奮闘記

元GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Pythonで国土数値情報のWeb APIを使ってデータをダウンロードしてみよう

さて、今日は国土数値情報のWeb APIを使ってデータをダウンロードしてみようと思います。

国土数値情報とは?

以下エントリーでも紹介していますが、全国の河川、避難施設、鳥獣保護区、鉄道 など様々なデータをShape形式などで提供しているWEBサイトです。

www.gis-py.com

国土数値情報のAPIとは?

GISを日頃使っている方は国土数値情報に関してはすでにご存じかと思いますが、実は国土数値情報のWEB APIというものがあります。色々なデータをダウンロードする場合、何度もダウンロード作業をする必要があったり、アンケートに答える必要があったりで、正直面倒くさいなと思った方もいるのではないかと思います。そんな時の救世主がこのAPIですまた、この!APIを利用することで、国土数値情報を組み込んだWebサイトや アプリケーションの開発を行うことが可能になります。

API仕様

http://nlftp.mlit.go.jp/ksj/api/specification_api_ksj.pdfに仕様の詳細が記載されていますので、興味のある方はぜひ読んでみてください。

ざっくり言うと以下二つの情報を取得することができます。
①国土数値情報の概要情報取得
②国土数値情報取得のURL情報取得

これだけだとよくわからないですね。。要するに・・・

①は国土数値情報では「海岸線」「ダム」などの情報を提供しているという概要的な情報を取得することができます。
f:id:sanvarie:20190212132519p:plain

②は「海岸線」などの各データの詳細情報を取得することができます。
f:id:sanvarie:20190212132559p:plain

各々の結果はXMLで取得でき、このようになります。

①国土数値情報の概要情報
f:id:sanvarie:20190212132938p:plain

②国土数値情報取得のURL情報
f:id:sanvarie:20190212133201p:plain

今回は「②国土数値情報取得のURL情報」を使用して、ファイルをダウンロードしようと思います。

環境

Python2.7.3
Windows10

サンプルコード

「国土数値情報 海岸線データ」をダウンロードするサンプルコードです。

# -*- coding: utf-8 -*-
import zipfile
import os.path
import requests
from lxml import etree

class WebAPI(object):

    def __init__(self):
        self.appId = "ksjapibeta1" #固定
        self.lang = "J"            #固定
        self.dataformat = 1        #固定
        self.identifier = "C23"    #各データ固有の番号
        self.prefCode = "1-47"     #都道府県
        self.fiscalyear = 2006     #年度
        self.dir = ur"D:\gis-py\WebAPI" #データ保存先

    def get_url(self):
        """
        国土数値情報のWEBAPIを使用して各情報をXMLで取得します。
        """

        url = "http://nlftp.mlit.go.jp/ksj/api/1.0b/index.php/app/getKSJURL.xml" \
              "?appId=%s&lang=%s&dataformat=%s&identifier=%s&prefCode=%s&" \
              "fiscalyear=%s" %(self.appId, self.lang, self.dataformat, \
                                self.identifier, self.prefCode, self.fiscalyear)

        resp = requests.get(url, timeout=10)
        tree = etree.fromstring(resp.content)

        for t in tree.iter():
            if t.tag == "zipFileUrl":
                self.download_zip(t.text)

    def download_zip(self,text):
        """
        指定したURLからZIPをダウンロードします。
        """

        filename = text.split('/')[-1]
        r = requests.get(text, stream=True)
        with open(filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()

            self.uncompress_zip(filename)

    def uncompress_zip(self,filename):
        """
        ZIP ファイルを指定したディレクトリに展開します。
        """
        zfile = zipfile.ZipFile(filename)
        zfile.extractall(self.dir)

if __name__ == '__main__':
    w = WebAPI()
    w.get_url()

このようにファイルがダウンロードされました。
f:id:sanvarie:20190212150004p:plain

ファイルを読み込んだ結果です。
f:id:sanvarie:20190212150126p:plain

今回はデータの一部をダウンロードしてみましたが、全データをダウンロードして各データや年度ごとにフォルダ分けしてダウンロードファイルを格納する、みたいなプログラムも作ってみました。興味のある方は以下エントリーを読んでみてください。
www.gis-py.com