QGISで地理院タイルをダウンロード

#これまでのあらすじ
　最近、インターネットを利用するためのリモートデスクトップ・サービスが導入され、職場のイントラネットがインターネットから隔離された。　
　以前は気軽にGoogle mapとか地理院地図とか閲覧できたが、インターネットから隔離されると、そもそも直接見られない。
　インターネットを利用するためには、それ用のリモートデスクトップの起動に時間がかかる。本当にコーヒー一杯飲めるくらいの時間がかかるし、リモートデスクトップ・サービス・サーバー様の機嫌によって、予期せず接続が切られてしまう。
　さらに困ったことに、それまで利用できていたqgisからの地理院地図利用ができなくなった。
　噂によると地理院地図をダウンロードして、イントラネットにWebベースのMapサーバーを作れば、今までどおり地理院地図を利用できるらしい。

#公式ツールを使う方法（失敗）
##公式ツールとの発見
　ネット上の噂ではqgisのプラグインを使ってダウンロードできるらしいが、情報を集めていると、qiitaで@tohka383さんの[『MBTiles でタイル地図のオフライン利用』](https://qiita.com/tohka383/items/b5388911baa912e8a974)という記事が見つかった。
　この記事によると国土地理院はgithubに「qdltc.rb」というrubyのスクリプトを公開（[Windows版の使用方法解説のページ](https://github.com/gsi-cyberjapan/qdltc/wiki/WinStd)）している。
　このツールを使う地図タイルのダウンロード方法を要約すると、欲しい地図に合わせたディレクトリに目録ファイルを置いて、スクリプトを走らせる。
　こうすると、日本全体の地図タイルがダウンロードされる。

##欲しいの住んでる町の部分だけ
　しかし、私が必要なのは住んでる秋田市の領域のみの地図タイルだった。
　解説ページによると、必要な目録のみ作成すればよいらしい。
　そこで、私はAccess2010のVBAで必要な地図タイルの番号リストを作成することにした。しかし、スクリプトでは地図タイルのMD5の値も参照しているらしい。となると、作成した番号リストに、地理院が公開している目録と組み合わせる必要がある。
　早速、データベースを作成し、ズームレベル、X、Y、ファイル名の項目を持つテーブルと次のプログラムを作成した。
```visualbasic:module.bas

Option Compare Database

Sub makeFileName()
'Zoom level 10から始める
'
'
    '開始する座標
    Dim x As Long
    Dim y As Long
    
    '計算するズームレベル
    Dim tmpZoom As Long
    
    '計算しているズームレベルの座標（１は開始、２は終了）
    Dim tmpX1 As Long
    Dim tmpX2 As Long
    Dim tmpY1 As Long
    Dim tmpY2 As Long
    
    Dim tmpX As Long
    Dim tmpY As Long
    
    '増分
    Dim tmpDiff As Long
    'ズムーレベルから求められる指数
    'レベル１０なら２
    Dim tmpPower As Long
 
    Dim tmpDB As DAO.Database
    Dim tmpTbl As DAO.Recordset
    
    Set tmpDB = CurrentDb
    Set tmpTbl = tmpDB.OpenRecordset("public_filelist")
 
    x = 910
    y = 388
    
    For tmpZoom = 10 To 18
        tmpPower = 2 ^ (tmpZoom - 10)
        tmpDiff = 2 ^ (tmpZoom - 9)
        
        'zoom 10 -> (910,388) - (911,389)
        tmpX1 = x * tmpPower
        tmpY1 = y * tmpPower
        
        tmpX2 = tmpX1 + tmpDiff - 1
        tmpY2 = tmpY1 + tmpDiff - 1
        
        For tmpX = tmpX1 To tmpX2
            For tmpY = tmpY1 To tmpY2
                tmpTbl.AddNew
                'tmpTbl.Fields("zoom").Value = tmpZoom
                'tmpTbl.Fields("x").Value = tmpX
                'tmpTbl.Fields("y").Value = tmpY
                tmpTbl.Fields("filename").Value = tmpZoom & "/" & tmpX & "/" & tmpY & ".png"
                'Debug.Print tmpZoom, tmpX, tmpY
                tmpTbl.Update
            Next
        Next
        
    Next
    
    tmpTbl.Close
    tmpDB.Close
    MsgBox "End"
End Sub
```
　これでリストを作成したが､問題発生。
　Accessのデータベースのサイズ制限に引っかかった。
　Access（32bit版）のデータベースでは2ギガバイトが上限で、国土地理院からダウンロードした目録ファイルを解凍したcsvファイルを読み込ませると、そのままハングアップしてしまう。何回か試して、csvのサイズを確認して、そもそも読み込めないものだったことに気がついた。

###加工にPostgreSQLを利用する
　私のパソコンではgisデータの管理のためPoatgreSQLをインストールしている。
　今までshapeローダーでデータを入れてただけで、こういうデータ加工は十年ぶりくらい。
　Accessのデータベースから欲しいものリストと地理院の目録をPostgresに入れデータ加工をし、完成品をcsvとして書き出した。圧縮後、約7メガバイトのファイルができた。

###qdltcでダウンロード
　このスクリプトでダウンロードすると、sqliteのデータベースが自動的にできる。
　何時間か放置してみたけど、このsqliteデータベースのサイズが増えないことから、ダウンロードに失敗したと判断し、別の方法を試すこととした。

#qgisのプラグイン　
##プラグインの機能
　私のデスクトップパソコンにはqgisの2.14と3.6がインストールされている。
　この方法は2019年5月の連休現在で、2.14で利用できる。
　メニューの【プラグイン】を開き、「QMetaTiles」というプラグインを追加する。
　ダウンロードする範囲は、「Canvas Extent」、「Full Extent」「Layer Extent」が選べる。
　「Layer Extent」では、領域を示すレイヤー内のタイルをダウンロードする。

##ダウンロードの手順
1.ダウンロードしたい領域の準備
　今回は秋田市の範囲をダウンロードしたいので、この領域を示すものがあれば良い。
　国土地理院で公開している[基盤地図情報](http://www.gsi.go.jp/kiban/index.html)の行政域データを使用する。
2．新しいプロジェクトを作成し、ダウンロードしたい地理院地図と行政域データをそれぞれレイヤーに追加する。
3．【プラグイン】からQMetaTilesを起動する。
4．【Layer Extent】を選択し、行政域のレイヤを指定し、ダウンロード先のフォルダ、ズームレベル（今回は１２～１８）を指定した後、【OK】を押すとダウンロードが始まる。
　秋田市（タイル数292,583）程度でデータ量が2.3ギガバイトくらいとなり、私の環境では5時間くらいかかった。

※注意
　表示されている状態でダウンロードされる。
　地理院地図の上に、他のレイヤーが表示されていると、そのままタイル化されるので、行政界レイヤーは最も下層にしたほうが失敗を防げる。

##ダウンロード後の処理
　フォルダの中にズームレベル毎にタイルが保存されているが、このままでは使いにくい。
　これはMbtilesでSQliteのデータベースにまとめると良い。
　tohka383さんの､[この記事](https://qiita.com/tohka383/items/b5388911baa912e8a974)が大変参考になる。
　で、このMBtilesだけど2.14の標準機能では表示できない。
　２系列は2.18が対応している。３系列では3.4以降で標準機能となっていて、レイヤーに登録するだけで利用できる。

#問題点
　こうして、とても高品質な背景地図を入手することに成功したのだけど、最も詳細なレベル（18）でレンダリングが変な場所がある。

#今後の利用
　地理院地図をオフラインのqgisで使えるようになり、背景地図の描画速度もかなり速くなった。
　ラズパイのqgisでも利用できれば、GPSと組み合わせてナビシステムとか作れるかも。