Google Static Mapsの代替としてのOpenStreetMap

はじめに

Google Mapsには、Google Maps Static API というものがあって、パラメーターを渡すと、PNG画像を返してくれる。 これを散布図グラフの背景に設定すれば、地図上に散布図で示した情報をマッピングできるので、便利である。 しかし、Google Static Mapsは、例えばイントラネットに閉じたサービスでは使用できない。 Open Street Mapは、Creative Commons Attribution-ShareAlike 2.0 Genericでライセンスされているので、 このような環境でも使用できるのだが、tile.openstreetmap.orgのAPIは、 Google Static Maps APIとは指定の方法が違うようで、Google Static Maps用のパラメーター計算の方法がそのまま使えない。

調べてみると、staticmapliteというのが、Google Static Maps APIに類似のAPIで、 tile.openstreetmap.orgから画像を取得できるようだ。 特にズームの値の指定が一緒なのが大変助かる。 しかし、インストール方法も書かれていないのが難点だった。

後からよく調べてみると、 staticMapLiteExtと言うものもあって、こちらの方が高機能であるようだ。しかもインストール方法もちゃんと書かれている。 新規で導入するのであれば、こちらの方が良いかもしれない。

インストールの事前準備

今回は、nginxとphp-fpmを使って動かすことにしたため、 pkgsrc/www/nginxpkgsrc/www/php-fpmpkgsrc/www/php-curlpkgsrc/graphics/php-gd、 をインストールしておく。私の場合は、既にnginxでウェブサイトを構築しているため、新規にインストールはしなかった。 導入したPHPは、5.6.25である。 php-curlとphp-gdは、staticmapliteの動作に必要である。

php-fpmの設定

php-fpmは、localhostからのみ接続できるように、/usr/pkg/etc/php-fpm.confに

listen.allowed_clients = 127.0.0.1

を追加した。

nginxの設定

以下のような設定を/usr/pkg/etc/nginx/nginx.confに追加した。


http {
        upstream php-handler {
            server 127.0.0.1:9000;
        }
}
server {
        location /osm-staticmap/staticmaplite {
                root /home/YOUR_NAME/osm;
        }
        location ~ ^(.+?\.php)(/.*)?$ {
                root /home/YOUR_NAME/osm;
                try_files $1 =404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_pass php-handler;
        }
}


このように設定した上で、php-fpmとnginxをrestartさせておく。

staticmapliteの配置

staticmapliteは~/osm/osm-staticmap/staticmaplite/staticmaplite.phpとして配置するので、 以下のようにgithubからcloneしておく。

$ mkdir -p ~/osm/osm-staticmap
$ cd ~/osm/osm-staticmap
$ git clone git@github.com:dfacts/staticmaplite.git

動作確認

https://deuterium.ryoon.net/osm-staticmap/staticmaplite/のように表示されたら、正常に使用開始できている。

おまけ

デバッグメッセージの表示

標準ではエラーメッセージが表示されないので、動作確認中は、以下のように変更しておくと良いかもしれない。

diff --git a/staticmap.php b/staticmap.php
index a9855e5..118c399 100644
--- a/staticmap.php
+++ b/staticmap.php
@@ -25,8 +25,8 @@
  *
  */

-error_reporting(0);
-ini_set('display_errors', 'off');
+error_reporting(1);
+ini_set('display_errors', 'on');

 Class staticMapLite
 {

右下のattributionの画像の変更

標準では、「(c) OpenStreetMap contributors」ではないので、使いにくい。 osm_logo.pngを置き換えてやれば良い。 画像の右下同士を合わせるので、ピクセル数を変えてもstaticmaplite.php等の変更は必要ない。

HTTPプロキシーの使用

イントラネットからインターネットに出るのに、HTTPプロキシーサーバーを経由しないといけない場合もあると思う。 staticmapliteは、php-curlを使っているので、curl_setoptのCURLOPT_HTTPPROXYTUNNEL等を設定してやれば良い。 例えば、認証が必要なHTTPプロキシーサーバーを経由する場合には、以下のようにする。


diff --git a/staticmap.php b/staticmap.php
index a9855e5..4851575 100644
--- a/staticmap.php
+++ b/staticmap.php
@@ -339,6 +345,12 @@ Class staticMapLite
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0");
         curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
+        curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
+        curl_setopt($ch, CURLOPT_PROXYPORT, '8080');
+        curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
+        curl_setopt($ch, CURLOPT_PROXY, 'http://PROXYSERVER');
+        curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'USERNAME:PASSWORD');
         $tile = curl_exec($ch);
         curl_close($ch);
         if ($tile && $this->useTileCache) {

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

pkgsrc/mail/dkimproxyを使ってみたが、受信時の動作は、現在の用途には合わないようだった

とある過去に利用者のいたドメインを所有しているのだが、相当に雑な運用だったようで、いまだにSPAM以外の電子メールが来るし、 そのドメインの存在しないアカウントを装った電子メールが多く送信されているようだった。 しばらく、キャッチオール設定をして受信してみて気付いた...