LoginSignup
11
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-02

これまでのあらすじ

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

公式ツールを使う方法(失敗)

公式ツールとの発見

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

欲しいの住んでる町の部分だけ

 しかし、私が必要なのは住んでる秋田市の領域のみの地図タイルだった。
 解説ページによると、必要な目録のみ作成すればよいらしい。
 そこで、私は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

'計算しているズームレベルの座標(1は開始、2は終了)
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
'ズムーレベルから求められる指数
'レベル10なら2
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.ダウンロードしたい領域の準備
 今回は秋田市の範囲をダウンロードしたいので、この領域を示すものがあれば良い。
 国土地理院で公開している基盤地図情報の行政域データを使用する。
2.新しいプロジェクトを作成し、ダウンロードしたい地理院地図と行政域データをそれぞれレイヤーに追加する。
3.【プラグイン】からQMetaTilesを起動する。
4.【Layer Extent】を選択し、行政域のレイヤを指定し、ダウンロード先のフォルダ、ズームレベル(今回は12~18)を指定した後、【OK】を押すとダウンロードが始まる。
 秋田市(タイル数292,583)程度でデータ量が2.3ギガバイトくらいとなり、私の環境では5時間くらいかかった。

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

ダウンロード後の処理

 フォルダの中にズームレベル毎にタイルが保存されているが、このままでは使いにくい。
 これはMbtilesでSQliteのデータベースにまとめると良い。
 tohka383さんの、この記事が大変参考になる。
 で、このMBtilesだけど2.14の標準機能では表示できない。
 2系列は2.18が対応している。3系列では3.4以降で標準機能となっていて、レイヤーに登録するだけで利用できる。

問題点

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

今後の利用

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

 
 
 

 

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8