「GIS」カテゴリーアーカイブ

地図タイルの404エラーで文句を言われた時の対策

地図タイルを扱っていると、セキュリティ関係の方から、こんなことを言われることがある。

「大量のアクセスが発生していて、エラーがたくさん出ています。」
「攻撃されているんじゃないか?」

待て!
アクセスしている方向は、内部から外部への閲覧であり、そのエラーは外部のサーバへアクセスして、外部のサーバに存在しないファイルがたくさんあるということであり、方向が逆だろう!

と、まあこんなことです。

Web地図では、タイル配信されている場合に必要な領域だけタイル画像を作成ます。
例えば、日本の領域だけに限った地図タイルを作成した場合、日本以外の地域におけるタイル画像は存在しない為エラーが発生します。

地理院地図の西之島関係のレイヤを表示してみると、ほとんど404エラーが出っぱなしですw

プログラム上で404エラーは無視する設定を行っていますので、ブラウザで見る限りにおいてエラーは見掛け上発生していませんが、デバッガーで見てみると404エラーが大量発生しているのが解ります。

本題に戻ります。
セキュリティ担当者の勘違いも甚だしいと怒りを感じつつ、「このどド素人が!」と憤慨しても相手は遠い存在であり、面倒ですよね。

こんなこと遣りたくないんですよ。
理解してもらえる人はやらない方が良いのですが・・・・
でも、止むを得ず対策を講じなければならない時があったら、以下を参考にしてください。

画像が無いところは、透過状態な訳ですよね。
透過状態のファイルを無い時に送ってあげれば良いんですよね。

ということで、まずは透過画像を作成しました。
以下の画像を作成しました。

←ここに画像があります。

解らない人のために、ここからダウンロードできます。

そして、公開しているデータの存在しない番号に名前を変えてコピーしまくる・・・・・・嘘です(-_-メ)

次に、以下のファイルを作成します。

.htaccess

webmap_dirは、実際にalpha_plane.pngを保存した場所を指定してください。
ドメインは必ず指定してください。ドメインを指定しないと、代替画像へのリダイレクトを行いますが、404エラーは発生してしまいます。
ドメインを指定すると404エラーは発生しなくなります。

この.htaccessファイルを地図タイルのあるディレクトリの最上部においてあげることで404エラーを回避することが出来ます。

 

 

QTiles/QMetaTiles Pluginで作成したタイル画像の要らない部分を削除する

QGISでタイル作成したタイル画像で不要なタイル画像を削除する方法をまとめました。
透過のみのタイル画像というよりも、1カラーだけのタイル画像を削除する方法になっています。
厳密に透過画像のみを削除したい場合には、identifyの出力内容を調整する必要があります。

QGISで簡単にタイル画像を作成しようと思って、QTilesやQMetaTilesプラグインでタイルを作成したまでは良かった。

おぉ~!タイル画像が出来てるではないか!!

と、意気揚々で「次はこれ作ってぇ~!」とかお願いしていたら・・・・
やたら時間は掛かるんだけどねw

で、しばらくお願いして放置していたら・・・

「なんかエラーが出て、出来ません。」との連絡が。

なんで?

見てみると、ディスクがパンパン(爆)

よく見ると、タイル画像が重すぎて一杯やないですか!

でも部分的に削除すると言っても・・・・と悩みながらも、透過しているだけのタイル画像は必要ないわなw

どうやって判定しようかなぁ?

ちょうど、そのWindowsマシンには下記のツールが入っていた。

  • ImageMagick
    Linuxで画像弄るなら必須アイテム。Windows版も当然ある。
  • Gow
    Linux風のコマンドを使えるようにするツール。

で、使ったのがこんなコマンド

identify

今回扱った画像には以下の条件がある。

①PNG画像
②1つのタイル画像に含まれる色は、対象物があった場合は2色以上になる。
③対象物が無い場合は透過のみとなるため、1色のみになる。

上記を整理すると、「単色のpng画像は不要」ということになる。

で、どうやってそのリストを作って削除するか・・・・

まずはWindowsでやってみた。
以下のバッチファイルを準備する。

Gowを入れると、xargsやsedなどLinux標準のコマンド類が使える様になります。sedのみを使いました。
xargsを使って渡せば簡単じゃないか!と思われますが、これがWindows側の「|(パイプ)」とxargsの相性が悪く、受け渡す標準出力を溜めこんでします様です。
その為、大量のファイルを扱う場合には、ファイルのパスがバッファに積まてしまいエラーが発生するという問題を解決出来ませんでした。

使い方はこんな感じです。

タイル画像のあるフォルダーの根元に移動してから、この以下のコマンドを実行します。

①で削除対象ファイルの削除用コマンドをrun_del.batファイルへ書き出します。
それを②で実行する。

それだけですw

せっかくここまで読んで頂いたのに済みませんが、時間にメッチャ余裕のある方や、タイルファイル数がそれ程多くない方はこれでも全然OKです。
でも、タイル数が数十万とか数百万とかになってくると、Windowsのコマンドプロンプトは使い物になりません。
Power Shellを使え?とか言わないでください。信用してませんからw

で、仕方が無いのでLinuxにファイルをコピーしてから同じことをLinux上で実施して、結果をダウンロードしてくることにしました。

下手すりゃ、ファイル共有掛けて実行してもそこそこLinuxの方が速いかも知れないのですが・・・・

確実に速かったのでこれにした。

まずは、全てのファイルを圧縮しようと思うのですが、7zを使いました。

とは言え、数百万ファイルのファイルを圧縮するには相当な時間が掛かりますし、纏まったファイルの容量もデカくて取り扱いが不便です。
こまめに分けました。

それぞれのフォルダー毎に圧縮ファイルを作成します。

これでフォルダー単位の圧縮ファイルが作成されます。

圧縮ファイルをLinuxに転送します。

転送したファイルを今度はLinux上で解凍します。

次に、以下のコマンドで透過(1つのカラーだけ)のファイルを削除します。

Windows環境でやる何倍も速く実行できます。

 

 

 

QGISに地理院地図を追加する。

QGISで地理院地図が表示できるようにしたい!

業務で使用する地図は地理院地図がメインになっている。

そこでQGIS上でも地理院地図と整合性を取る為に、背景地図として地理院地図を表示させたいと思っています。

ねっとで調べてみると、TileLayer Pluginの情報が入手できた。

ということで、TileLayer Pluginをインストールする。
1)QGISのメニューから「プラグイン」→「「プラグインの管理とインストール」画面を表示

2)TileLayer Pluginを選択して、右下の「プラグインをインストール」をすればインストールが開始される。

#ここまでは至って簡単な操作で済む。

3)インストールの確認
QGISのメニューから「Web」→「タイルレイヤプラグイン」→「タイルレイヤを追加する」をクリックする。

こんな感じで表示されていればインストールは正常に行われています。

4)タイル情報の入手
以下のサイトからタイルの情報を入手します。

https://gist.github.com/minorua/7654132/download#

右側に表示されている「Download Gist」からファイルをダウンロードします。

解凍すると以下のファイルがあります。

GSIMaps.tsv
GSIMapsDisaster.tsv

この2本のファイルを適当なフォルダーへコピーします。
デフォルトの保存先に保存したり、プラグインの入っているフォルダーへコピーすると、プラグインを再インストールした時にこれらのファイルが消えてしまいます。
それを避けるためにも、適当なフォルダーを作成して保存しておく方が良いと思います。

ということで、今回は以下のフォルダーへコピーしました。

C:\Tools\TileLayerPlugin_AddLayer

5)タイルレイヤを追加する。

改めて、QGISのメニューから「Web」→「タイルレイヤプラグイン」→「タイルレイヤを追加する」をクリックし、以下の画面を表示します。

 左下の設定ボタンをクリックすると「タイルレイヤプラグイン設定」画面が表示されます。

先程保存したパスを指定します。

C:\Tools\TileLayerPlugin_AddLayer

おぉ〜!表示された!!

試しに「標準地図」を表示してみると。。。。あれ?表示されない????

マウスのホイールボタンをグリグリ・・・ズームレベルを変えてみると、表示されました。

 初期表示はなんか少しアクションが必要な様です。

また、タイルレイヤによってはサポートされているズームレベルが限定されているので、エラーが表示される場合があります。

重ね合わせたい適当なレイヤを表示させた後で、このツールで地理院地図を表示させてみると、すんなり表示出来たりします。

以下は、一時メッシュを表示させた状態です。

この状態で先程と同じように、「標準地図」を表示させてみると、

すんなり表示されました。レイヤの順番を入れ替えて

タイルのスタイル変更で透過率を適当に入れて、ラベルを表示させて、ズームアップしてみると・・・・

こんな感じに。

白地図に重ねてみるとこんな感じですね。

自前で作成したタイル画像や、今回追加した地理院地図以外のタイルレイヤを追加したい場合には、ダウンロードしたGSIMaps.tsvやGSIMapsDisaster.tsvを参考に新たなファイルを作成することで独自にタイルレイヤを追加することが可能です。

 

以上

 

 

CentOS 7にGDALとprojを入れる。

CentOS 7にGDALを入れます。

メンテナンス性を考えると、yumで入れたい。

ということで、EPELのリポジトリを登録してGDALをインストールする。

1)EPELリポジトリの登録

まずはyumを使ってepel-releaseのリポジトリをインストールします。

こんな感じでインストール完了!

epel-releaseリポジトリを明示的に使用する(通常は使用しないで、必要な時だけ使用する)場合は、以下の設定を行う。

この設定を行った場合には、yumのオプションに–enablerepo=epelを指定していないとEPEL-Releaseリポジトリは参照されません。

試しに、enabled=0の時と1にした時とでインストール対象が変わることを示します。

<EPEL-Releaseが参照されない(enabled=0)場合>

 

<EPEL-Releaseを参照する(enabled=1)場合>

19-23行目でprojが参照されていることを確認できます。
この状態になると、projをyumでインストールすることが出来ます。

以下では、enabled=1(明示的に指定しないで使用する)で作業を進めます。

2)projのインストール

ここまで来たら簡単です!
projをインストールします。

おしまし!。。。じゃない、まだGDAL入れてないしw

3)GDALのインストール

GDALのインストール手順を書きすれていました(^^;

こんな感じです。

出力されているコメントを見るとOGRの名前が見当たりませんが、OGRもしっかりと入っています!

試しにこんな感じで確認できます。

ということで、今度こそおしまい!

 

QGISインストール(OSGeo4W)

 

QGISインストールしておいて〜と言おうと思って、QGISのインストール方法を探そうとしたら、古いバージョンのインストール方法ばかりが検索上位に出てきて・・・(TT)
更に、OSGeo4Wを使ったインストール方法はなかなか出て来ないみたい。

ということで、誰かにお願いする時様に自分のブログに残しておかなければ・・・と言うよりも、なぜ今まで書いてなかったんだ!?ということもあり、今から記録に残します。

対象は
Windows 64bit環境。(Windows Serverへインストールさせるつもり) 現在は、2016-02-04時点での方法になります。

1.インストール準備

まずは、インストールする為の準備です。
下記のURLをブラウザで開いて、対象のインストーラーをダウンロードします。

https://trac.osgeo.org/osgeo4w/wiki/OSGeo4W_jp

img_579eee687c6f6

 

面倒だったら、一応、以下のURLから直接ダウンロードできるはず。

64ビット版はこちら→http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe

32ビット版はこちら→http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe

2.インストール開始

インストーラーを起動する。

 

img_56b2d0dcd7b37

 

文字が欠けているかも知れませんが、「エクスプレス デスクトップインストール」(デフォルト)を選択して「次へ」でインストール作業を進めます。

img_56b2d15863b5c

QGISを使いたいだけなら、「QGIS」だけチェックすれば良いと思うんだけど、GDALとかやっぱ使うので、デフォルトのままインストールしちゃいますw

後は、画面の指示に従って操作して待つだけ。

インストール完了しているはずなので、

img_56b2d3fe2c5c6

QGIS Desktopを起動するとQGISが起動します。

インストール直後はプラグインなどが入っていない状態なのでもっとシンプルな画面になっていると思いますが、こんな感じの画面が起動します。

img_56b2d45e17591

<サイト内参考情報>
QGISに地理院地図を追加する。
地域メッシュをQGISで作成する。

 

OpenLayers マルチサーバーで高速表示?

OpenLayersで地図画像を表示させる時には、タイル画像を表示させているが、そのタイル画像をサーバーからダウンロードしてくるのが遅いと、表示に掛かる時間が遅いように思える。

そこで、サーバーから同時並行的にダウンロードを行う方法として、複数のサーバーから並行して取り出すことにする。

単純に対象となるURLを配列に入れて指定するだけ。

さて、まだ試していないが、これくらいなら試してみる価値ありですね。

試してみたら、速い!

でもCPUコア食うねぇ~w
負荷設計なども考慮して使わないと、たくさんの人が見に来るサーバだと大変かも知れない。

諸刃の剣ですね。

 

OpenLayersでタイル画像のキャッシュを消したい!!(追記:ダメだった)

OpenLayers 2.13.1の環境で、一度表示されたタイル画像が邪魔になる場合がある。
開発途中などで、画像を差替えたりする場合には良く発生する為、ごっそりタイル画像を更新した場合などは、ブラウザのキャッシュクリアを行っていた。
この操作は、ブラウザ毎に設定があったり、消したくないキャッシュまでクリアしなければならず面倒だし不便。

そこで、以下のファンクションを呼び出すことで、タイルキャッシュだけをクリアしてしまおうというのが今回の狙い!

追記:単純にこれだけやっても上手く消えないことが判明・・・
どうやって使うか解らないのだが・・・ということで、誰かがアドバイスしてくれるのを期待するが、参考にしないでください。

これで上手く出来そうなんだけど・・・やってみる!!

レイヤを指定してクリアできると嬉しいのだが、そこまでの機能は無いみたい。OL3で実現では出来るのかな?

余談・・・・

まだOL3は使ったことが無い。
ドラスティックに変わり過ぎてしまって、OpenLayers 2.xとは全く異なってしまっている。
コンバートするとかいうより、完全に書き換えが必要となる雰囲気である。
もう少し安定した事例が発表されるまで待つつもりだけど・・・業界の流れにも注目したいところである。

地域メッシュをQGISで作成する。

地域メッシュをダウンロードして使おうと思ったのですが、1/8地域メッシュが見つからなかったので、作成することにしました。

一から作ると意外と面倒なのですが、QGIS用に作ってくれている方が居たみたいです。

QGISのプラグインに「JapanMesh」なるプラグインを発見!!早速入れていました。

使い方はReadme.txtを見ると書いてあります。

まず、1次メッシュを作成します。

次に、2次メッシュを作りたい場所の1次メッシュを選択して、2次メッシュを作成します。

後は、この繰り返しです。

欲しかったメッシュは1/8メッシュだったのですが、求めていたコード体系と異なっていたので、変換ロジックを作って変換しました。

この時行ったロジックでは以下のコード体系(3次メッシュ以降)を変換しています。

元)

333 334 343 344 433 434 443 444
331 332 341 342 431 432 431 432
313 314 323 324 413 414 423 424
311 312 321 322 411 412 421 422
133 134 143 144 233 234 243 244
131 132 141 142 231 232 241 242
113 114 123 124 213 214 223 224
111 112 121 122 211 212 221 222

 

変換後)

0700 0701 0702 0703 0704 0705 0706 0707
0600 0601 0602 0603 0604 0605 0606 0607
0500 0501 0502 0503 0504 0505 0506 0507
0400 0401 0402 0403 0404 0405 0406 0407
0300 0301 0302 0303 0304 0305 0306 0307
0200 0201 0202 0203 0204 0205 0206 0207
0100 0101 0102 0103 0104 0105 0106 0107
0000 0001 0002 0003 0004 0005 0006 0007

 

変換に用いたロジックは以下です。

floor("m6code"/1000)*10000+(floor((("m6code"%1000)-100)/200)*2^2+floor((("m6code"%100)-10)/20)*2+floor((("m6code"%10)-1)/2))*100+(floor((("m6code"%1000)-100)/100)%2)*2^2+(floor((("m6code"%100)-10)/10)%2)*2+(floor((("m6code"%10)-1))%2)

それと、このプラグインはデフォルトで2000メッシュまでしかサポートしていません。
JapanMesh.pyの中に「2000」と記述されているので、ちょっと増やしてあげると便利です。

変更するプログラムファイルの保管場所を説明します。

対象ファイル:C:\Users\<ユーザ名>\.qgis2\python\plugins\JapanMesh\JapanMesh.py

ファイルの保管場所は、「プラグイン」→「プラグインの管理とインストール」→「JapanMesh」にインストールされているバージョンと保存場所が記載されています。
該当するフォルダーを開いて対象ファイルを変更すればOKです。

ちなみに、リミッターが2000メッシュまでとされているのですが、拡張して50mメッシュの4.8万程度を10mメッシュに分割したところ、すごく重たかったです。1時間くらい掛かるかな?根気よく待つべし!
大量のメッシュを作成したい場合には、細分化して実行するか、もしくは他の方法を考えた方が良いかも知れません。
お手軽ではありますが、時間が掛かります。

RT MapServer Exporterを使いたい!

MapServerのmapファイルを作成するのに、QGISを使っていると、mapファイルを勝手に作ってくれるツールが欲しくなる。
でも、単純にプラグインをインストールして「RT MapServer Exporter」を起動しようとすると、以下の様なエラーに出くわす(^^ゞ
ちなみに、今回使用しているQGISは2.4の64Bit版です。

Traceback (most recent call last):
File
“C:\Users\xsc/.qgis2/python/plugins\rt_mapserver_exporter\plugin.py”, line 65, in run
from .mapfileexportdlg import MapfileExportDlg
File “E:/osgis/QGIS/apps/qgis/./python\qgis\utils.py”, line 453, in _import
<つづく>

なんでやねん!?と色々と調べるも・・・
結局答えはここに書かれていた。
https://plugins.qgis.org/plugins/rt_mapserver_exporter/
<以下抜粋>
It needs python-mapscript istalled in your machine. This is available as a Debian (therefore Ubuntu) package, and as a part of OSGeo4W on Windows.

ここでは、python-mapscriptが必要で、インストールしてあることが必要らしい。
なんじゃそりゃ?
ということで、プラグインにそんなんあるんかな?と探してみるも存在しない。
OSGeo4Wでインストールしていたので、Setupを起動して・・・

StartUp
StartUp

アドバンスインストールを行う。

RT_MapServerExp2

後は適当にデフォルトの設定を進める。
もちろん、インターネット接続する。

 

 

RT_MapServerExp3

フォルダー名は、インストール時の設定がそのまま反映されているはず。

RT_MapServerExp4

RT_MapServerExp5 RT_MapServerExp6

もくもくと進めると、時折、以下の画面で固まる時があった。

サーバーとの接続が上手く行かない時が頻繁にあるようだ?
私のネットワーク設定が影響しているのか不明であるが・・・そんなもんなのかな?とも思える。誰かコメントして頂けるとありがたい。

RT_MapServerExp7

 

10秒程待っても進まないときは、多分待っても無駄なので、キャンセルして最初からやり直した方が早い。
私の場合は、数回チャレンジすることもしばしばである。

 

RT_MapServerExp7

 

で、肝の部分です。
上記の3項目にチェックを入れて、インストールの対象にする。
これで、後はひたすら「次へ」を押して進めればインストールしてくれる。
で、お気付きの方もいらっしゃると思いますが・・・・
python-mapscriptではなくmapscript-python。。。になってるんですよね。Linuxだと正しい名前なのかな?とWindowsだからなのかは知らん!!

ということで、これを入れてから、プラグインの追加を行えば上手く動作させることが出来た。

ちなみみ、使い方については、解りません(^^ゞ

プラグインを追加すると、Web(W)というメニューが追加されるので、RT MapServer Exporter」を起動すると、以下の画面が表示されます。

RT_MapServerExp9

ここからは、誰かがきちんと書いてくれているサイトを探した方が良いと思うけど・・・

Map file Mapファイルの保存先(多分日本語はやめた方が良い)
Name 多分レイヤ名になってくるのかな?
Image type Webで使用するので、デフォルトpngでお好みに応じて。
Width / Height 私の場合は、Web使用するのであまり意味はないと思う。
Shape path Shapeファイルのフルパスを入力。
後で、Mapファイルが出来てから、相対パスに変更した方が良いと思います。
Online resource URL これっているのか?と思いますが。。。。そのまんまで(^^ゞ
Image path 出力先
Image URL URLでの出力先
Temporary path テンポラリ領域なのだが。。。必要なのかな?
External graphic regexp  解らん!

取りあえず、適当に書いて、Mapファイルを出力して中身を良くて見てみると、いっぱいダメな部分があるので、適当に書き換える。

感覚としては、Layerのセクションだけは、QGISの設定を反映してくれているみたいなので使えるけど、他は適当に使えるベースの様な物を準備しておいて、切り貼りする方が良さそうな気がした。

誰か詳しく説明してくれている場所があったら教えてくださいm(__)m
って、サイト立ち上げたばかりで、だれも見てくれていないだろうに・・・・