[画像処理][PHP]GDライブラリを使っている際に表示されるエラーへの対処法

PHPのGDライブラリを使っていると稀に以下のようなエラーに出会うことがあります。

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg, libjpeg: recoverable error: Premature end of JPEG in /path/to/file.php on line xxx

ネットで調べる限りでは、このエラーはjpgファイルが破損している場合に起きるケースが多いようです。
結論から言うと完全な解決法は見つけることができなかったのですが、私なりの対処法をご紹介します。

解決法

「ファイルが壊れているのであれば、修復してしまえばいい」
というのが解決法です。
なんというか、シンプルな解決法なのですがこれが結果的に一番簡単でした。

大量のファイルを処理する場合であれば少し面倒かもしれませんが、
MacであればImageOptimなどに壊れたファイルを突っ込むと壊れていないjpgになります。
元々壊れているファイルなので見た目がきれいな画像が出来上がる保証はありませんが、jpgファイルという意味では破損はなくなるようです。
(ついでにファイルサイズも小さくなりますが、画質が少し落ちるかな?という印象)

試してはいないですが、ブラウザから使えるJPEGminiなどを利用してもいいのではないかと思います。

修正したファイルであればGDライブラリは正常に動作するようですので、リサイズなりなんなり自由自在というわけです。
元々が破損したファイルなので「画像の半分が見れない!」などということもあるかもしれませんが、
業務などで大量の画像ファイルのリサイズ処理をGDでやる必要が出てきた場合には検討してみてください。
リサイズするだけなら縮小専用でいいような気もしますが。

とりあえず破損したままでも処理を続行

このサイトに書かれていた方法です。
http://www.atyks.org/blog/detail/2011-10-14-9
以下の記述を追加することで処理の実行は進むようです(未確認です。。。)。

ini_set("gd.jpeg_ignore_warning", 1);

おわりに

海外であれば情報はある程度あるのですが、日本語での情報が少ないようだったので簡単にですが紹介しました。
海外記事

株式会社みのモンでは、たくさんの画像を掲載する必要があるようなサイトの構築のご相談もお待ちしております。
上記GDライブラリも必要であれば使いますし、そのサイトにあった方法で構築をいたします。
PHPを使った大規模なシステム開発から、ホームページ(PC・スマホサイト)構築などのご相談はお気軽にどうぞ!
株式会社みのモンのホームページはこちら

【サイト管理者向け】スマホサイトに埋め込まれたYoutubeが再生できない場合の対処法

このページはサイトを作る方向けの情報です。サイトを閲覧している方向けの対処法は掲載しておりませんのでご注意ください。

自社のサイトにYoutubeにアップしたPR動画などを埋め込みたいことがあると思います。
埋め込んでみていざ確認してみると……「この動画は現在再生できません」と表示されるケースがあります。

これは埋め込む側の設定で対処できるケースがあるので、その対処法をまとめました。
※今回は検証した環境はiPhone5s(iOS 7.0.4)のSafariです。

Youtubeの動画の埋め込み方法

すでにYoutube動画の埋め込みコード取得の方法を知っている方はこの部分は読み飛ばしていただいてOKです。

1.埋め込みたい動画を表示する

まずは埋め込みたい動画のページを表示してください。
今回は説明用サンプルとして「https://www.youtube.com/watch?v=KyCYyoGusqs」を使っています。

2.動画の下にある「共有」タブをクリック

step2

3.「共有」タブをクリックして表示された部分にある「埋め込みコード」をクリック

step3

4.表示されたHTMLコードをコピーして、埋め込みたい部分に貼り付ける

step4

以上が基本的なYoutubeの動画を埋め込む際の手順になります。

埋め込んだ動画が再生されない!

ここからが本題です。
おそらく埋め込んだ動画はPCでは再生できると思います。
(PCでも再生できないケースがあるようですが、ここでは省略します)

Youtubeの埋め込みの標準設定

Youtubeから動画を埋め込む際の標準の設定は以下のようになっていると思います。
動画のサイズ:560×315
動画が終わったら関連動画を表示する(チェックあり
プライバシー強化モードを有効にする(チェックなし)
以前の埋め込みコードを使用する(チェックなし)

標準設定のままの動画


再生すると私の環境では「この動画は現在再生できません」と表示され、埋め込んだ動画が再生できませんでした。

解決方法

解決方法は至ってシンプルでした。
「プライバシー強化モードを有効にする」にチェックを入れる
これだけです!
answer

「動画が終わったら関連動画を表示する」にチェックを入れるかどうかはどちらでも大丈夫だと思います。
「以前の埋め込みコードを使用する」はチェックを入れない方がいいと思います(未検証)。

埋め込みコードを変更した後の動画

再生を始めるとYoutubeアプリが立ち上がって再生されました。

おわりに

動画のソースが「プライバシー強化モードを有効にする」にチェックを入れる前は、
www.youtube.com
だったのに対して、チェックを入れた後は、
www.youtube-nocookie.com
になっているようです。

Youtubeは動画をアップロードしてサイトに埋め込む際に非常に役に立つサービスですが、サイトに埋め込んでも実際に再生できないと意味がありません。
ちょっとした設定を変えるだけで再生可能になるので覚えておくと何かの時に役に立つかもしれませんね!

おまけ

スマホ向けのページに埋め込む場合にはプレイヤーのサイズを以下のようにしておくと良さそうです。
appendix
「動画のサイズ」の部分を「カスタムサイズ」にして、左側の入力ボックスに「320」と入力すればOKです。
(右側の入力ボックスには自動でサイズが計算されます)
iPhone向けだとこの設定がいいのではないでしょうか。

ランダム文字列生成ツールを公開します

ランダム文字列生成ツールを作成しましたので公開します。

一部の識別しにくい文字列を除いた文字の中から指定した文字数でランダムな文字列が生成されます。
複数件生成されるので、気にいる結果が出るまで何回もリロードする必要がないです。

tools_make_kw
ランダム文字列生成ツール

仮のパスワードを生成する場合など、何でもいいので長い文字列が欲しい!という際に使って下さい。

仕組みは、裏でPHPを使っています。

  1. リクエストされた文字種からランダム文字列用に使う文字を選ぶ
  2. 選ばれた文字群からランダムに字を決まった数だけ抽出

という超基本的なことをやってるだけなんですけどね^^

プログラム的には難しいものではないですが、
社内でのテストの際などに意外と活躍してくれてます。

他にも便利ツールを作成したら紹介したいと思います。

jQueryを使った確認アラート表示

管理ページなどで情報を削除する際など、確認のアラートボックスを表示したい時があると思います。
これはjQueryを使うと簡単に実装することができます。

» デモページ

<!DOCTYPE html>
<html>
  <head>
  	<title>【デモ】jQueryを使った確認アラート表示</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
  </head>
  <body>
	  <p><a class="confirm" href="./del.php">データを削除</a></p>
	  <p style="color:#aaa;">※デモなのでリンク先ページが開くだけです</p>

    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
    <script type="text/javascript">
      $(function(){
		$(".confirm").on('click', function(){
			if(window.confirm("データを削除しますがよろしいですか?")) {
				location.href = $(this).attr('href');
			} else {
				return false;
			}
		});
      });
    </script>
  </body>
</html>

解説

11行目でjQueryを読み込んでいます。今回はGoogleのCDNを使いました。

12行目から22行目がアラートボックス表示に関する部分です。
クリックイベントに対して定義してます。
クラスを指定することで複数のリンクがあった場合にも対応できるので便利です。
「データを削除しますがよろしいですか?」というメッセージを表示し、OKであればリンク先のページを開き、キャンセルであれば何もしないという指示を書いてます。

用途によってはフォームの送信前に最終確認メッセージを表示するなどいろいろな使い方ができると思います。

ちょっとした部分ですが、ユーザビリティをアップしヒューマンエラーを減らす効果があると思います。
目立つ部分ではないですがこんな気遣いがクオリティアップの一つになるので大切にしたいものですね。

WordPressのテーマTwenty Fourteenを使っている場合の「Tweet, Like, Google +1 and Share」プラグインについて

WordPressのデフォルトテーマの1つに「Twenty Fourteen」があります。
当ブログでも使っているテーマなのですが、このテーマを使っている際にTwitterやFacebookなどのソーシャルボタンを簡単に設置できるプラグイン「Tweet, Like, Google +1 and Share」を使う際に注意する点があります。
» WordPress › Tweet, Like, Google +1 and Share « WordPress Plugins

※執筆時点でのバージョンは、WordPressがv3.8、プラグインがv1.7.4です

スマホで崩れる

このプラグインの設定で「Size of Icons」というものがあるのですが、この設定を「Small」にすると以下のような表示になります。

■PCサイト表示(Mac+GoogleChrome)
cap20140122

■スマホサイト表示(iPhone5s+Safari)
cap20140122_2

見ていただければわかると思いますが、スマホ表示の場合にボタンの表示が崩れています。
「見た目もだけどクリックしにくそう・・・」と思います。

解決方法

この対応策として一番簡単なのは上記の設定の際に、「Large」を選ぶだけ!
結果的にすごく単純な解決方法になってしまうのですが、シンプルイズベストだと思います!!

■PCサイト表示(Mac+GoogleChrome)
cap20140122_3

■スマホサイト表示(iPhone5s+Safari)
cap20140122_4

自分でCSSを調整すれば解決する部分もあるかもしれませんが、パパっと設置したいという方は上記の対応をすると簡単です。

上記以外にも・・・

他にも「Vertical Scrolling sidebar」というスクロールしてもついてくるソーシャルボタンを付けれる機能がこのプラグインにはあります。
しかし、Twenty Fourteenと一緒に使うときれいに表示されないことがあります。
cap20140122_5
この画像のようにヘッダーの下に潜り込んだり、いいねボタンの右側が少し切れて表示されます。

変更箇所

※下記内容の変更をされる場合は自己責任で行って下さい。

スクロールするとヘッダーの下に潜り込む

「Margin Top」を60(デフォルト20)に変更

Facebookの「いいね」ボタンの右側が少し切れて表示される

※プラグイン本体を変更することになりますので、注意して作業をしてください。
変更前にバックアップを取っておくと安心です。

  1. 「プラグイン⇒インストール済みプラグイン」と進みプラグインの一覧ページを表示
  2. Tweet, Like, Google +1 and Shareの「編集」をクリック
  3. 以下のように変更する(変更箇所は2箇所)

【変更箇所1】
■変更前

function social4i_css() {
echo "<!-- This site is powered by Tweet, Like, Plusone and Share Plugin - http://techxt.com/tweet-like-google-1-and-share-plugin-wordpress/ -->\n";
s4_fb_share_thumb();
if (get_option('s4dmob', false )==true && social4i_check_mobile())return;
wp_enqueue_script('jquery');
echo '<style type="text/css">div.socialicons{float:left;display:block;margin-right: 10px;line-height: 1;}div.socialiconsv{line-height: 1;}div.socialicons p{margin-bottom: 0px !important;margin-top: 0px !important;padding-bottom: 0px !important;padding-top: 0px !important;}div.social4iv{background: none repeat scroll 0 0 #FFFFFF;border: 1px solid #aaa;border-radius: 3px 3px 3px 3px;box-shadow: 3px 3px 3px #DDDDDD;padding: 3px;position: fixed;text-align: center;top: 55px;width: 68px;display:none;}div.socialiconsv{padding-bottom: 5px;}</style>'."\n";
if(get_option('s4optimize',true)==true&&get_option( 's4scripthead', 'head' ) == "head" )
echo s4load_script();
$ccss=get_option('s4ccss','');
$cjscript=get_option('s4cjscript','');
if(trim($cjscript!=''))echo $cjscript;
if(trim($ccss!=''))echo '<style type="text/css">'.$ccss.'</style>';

}

■変更後

function social4i_css() {
echo "<!-- This site is powered by Tweet, Like, Plusone and Share Plugin - http://techxt.com/tweet-like-google-1-and-share-plugin-wordpress/ -->\n";
s4_fb_share_thumb();
if (get_option('s4dmob', false )==true && social4i_check_mobile())return;
wp_enqueue_script('jquery');
echo '<style type="text/css">div.socialicons{float:left;display:block;margin-right: 10px;line-height: 1;}div.socialiconsv{line-height: 1;}div.socialicons p{margin-bottom: 0px !important;margin-top: 0px !important;padding-bottom: 0px !important;padding-top: 0px !important;}div.social4iv{background: none repeat scroll 0 0 #FFFFFF;border: 1px solid #aaa;border-radius: 3px 3px 3px 3px;box-shadow: 3px 3px 3px #DDDDDD;padding: 3px;position: fixed;text-align: center;top: 55px;width: 69px;display:none;}div.socialiconsv{padding-bottom: 5px;}</style>'."\n";
if(get_option('s4optimize',true)==true&&get_option( 's4scripthead', 'head' ) == "head" )
echo s4load_script();
$ccss=get_option('s4ccss','');
$cjscript=get_option('s4cjscript','');
if(trim($cjscript!=''))echo $cjscript;
if(trim($ccss!=''))echo '<style type="text/css">'.$ccss.'</style>';

}

【変更箇所2】
■変更前

$btnarrver[2]='<div class="socialiconsv s4fblikev" ><iframe src="//www.facebook.com/plugins/like.php?href='.$plink.'&amp;send=false&amp;layout=box_count&amp;width=49&amp;show_faces=false&amp;font&amp;colorscheme=light&amp;action=like&amp;height=65" style="border:none; overflow:hidden; width:49px; height:65px;"></iframe></div>';

■変更後

$btnarrver[2]='<div class="socialiconsv s4fblikev" ><iframe src="//www.facebook.com/plugins/like.php?href='.$plink.'&amp;send=false&amp;layout=box_count&amp;width=69&amp;show_faces=false&amp;font&amp;colorscheme=light&amp;action=like&amp;height=65" style="border:none; overflow:hidden; width:69px; height:65px;"></iframe></div>';

変更内容としては、
・ソーシャルボタンのdivのcssを出力する部分でdiv.social4iv幅を58pxから59pxに変更
・いいねボタンの部分の幅を49pxから69pxに変更
となります。数字の変更以外は行っていません。

【変更箇所1】は出力されるcssを変更しているので、style.cssに

div.social4iv{width:69px !important;}

を追記する方法でも対応可能だと思います。
プラグインの設定ページで「Insert Custom CSS」という欄があるので、そこに入力してもいけるかもしれません(未検証)

以上の変更を行うと崩れること無く表示されるようになります。

終わりに

ソーシャルボタンの設置は今や常識とも言えるものですので、手軽に導入できるプラグインは非常にありがたいです。
他にもこのプラグインではいろいろな設定ができますので、興味がある方はゼヒ調べて自分なりのカスタマイズをしてみて下さい。

関連リンク

このプラグインにはてなブックマークのボタンを追加する方法は以下のブログ記事がわかりやすかったです。
» [Web’Notes] ソーシャルボタンを設置するWordPressプラグイン「Tweet, Like, Google +1 and Share」

jquery-1.10.2.min.mapが404 Not Found

fuelphpを使っていて謎のエラーが出ていたのを解決したので同じ問題を持った人のために記事にします。

そのエラーはjquery-1.10.2.min.mapが404 Not Foundというエラーでした。
そんなファイルを読み込んだ覚えもないし。。。と思いjsを読み込んでいる部分をのぞいてもそれっぽいのがない!

jqueryがらみなのは間違いなさそうだったので/assets/js/jquery.jsを確認すると、一番はじめに次のようなコメントが書かれていました。

/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
//@ sourceMappingURL=jquery-1.10.2.min.map
*/

ん〜ソースマップのURLが書かれてますね。。。

原因はこれなので、サクッと1行削除して

/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
*/

とするとエラーは消えます。
もしjquery.jsの変更をしたくない場合は、jquery-1.10.2.min.mapをjquery.jsと同じフォルダに置いてあげるとOKです。

上記の例の場合は以下のリンク先のファイルを配置することでエラーが無くなりました。
» jquery-1.10.2.min.map

上記のようにソースマップを同じ場所に置くことで解消されますが、ソースマップに対応したブラウザだとソースマップのファイルを読み込むために1リクエスト余計なアクセスが増えることになります。
「1行消す」か「ソースマップを配置する」かはお好みに応じて対処してください。

補足

このソースマップのURLの記述はどうやらjQuery1.9から追加されたようです。
ソースマップについて詳しく知りたい方や、ソースマップ対応されていることでどんなメリットがあるかについては、以下のURLにわかりやすい説明があります。
» [てっく煮ブログ]jQuery 1.9 のソースマップ対応で圧縮版でもデバッグが簡単になった話

ちなみに、現在ソースマップに対応しているブラウザはGoogleChromeのみのようです。
Firefoxも対応してきているようですが、まだ不十分のようです。
以下の記事にそのことが書かれてました。
» [terurouメモ] Firefox 23でSource Mapsが実装されたみたいだけど、まだちゃんと動いてない?

今回の私のケースはfuelphpでしたが少し古いwordpressを使っている場合にも同様のエラーが出るケースがあったようです。
» [設定やツールとか]WordPress 3.6でjquery-1.10.2.min.mapのエラー

WordPress 3.6だと、jquery-1.10.2.min.mapのエラーが出る。原因はWordPressで使っているjquery.jsのヘッダー記述の問題。
WordPress 3.6.1でこのバグが修正された。3.6.1以降を使っていればこの問題はおきない。

とのことです。

同様のエラーが出た人の参考になれば幸いです。

Google Maps JavaScript API v3の使い方(1)

今回から数回にわたって「Google Maps JavaScript API v3」の使い方について書いていきます。
公式ドキュメントの流れに沿って説明します。

執筆時点でのGoogle Maps JavaScript API v3のリリースバージョンは3.9です。
ご覧になったタイミングによっては、Google Maps JavaScript API v3のバージョンアップに伴い使用方法が異なる可能性があります。
(バージョンを指定してAPIを呼び出す方法は後述します)

現在の公式ドキュメントには、

すべての Maps API アプリケーション* では、API キーを使用して Maps API を読み込む必要があります。API キーを使用することで、アプリケーションの Maps API 使用状況を各自でモニタリングすることが可能になります。また、API キーを元に、必要に応じて、Google より、アプリケーションに関して連絡を取ることがあります。アプリケーションの Maps API 使用量が使用制限を超過した場合、API キーを使用して Maps API を読み込み、追加割り当てを購入する必要があります。

と書かれております。
以前はAPIキーは必要なかったのですが、Google Maps API for Businessの発表時にそれっぽいアナウンスがあっていたので、タイミング的にはその辺りかもしれません。

APIキーの取得

APIキーの作成方法の部分を公式ドキュメントから抜粋します。

  1. API コンソール https://code.google.com/apis/console にアクセスし、Google アカウントでログインします。
  2. 左側のメニューから [Services] をクリックします。
  3. Google Maps API v3 サービスをオンにします。
  4. 左側のメニューから [API Access] をクリックします。API キーは、[API Access] ページの [Simple API Access] セクションにあります。Maps API アプリケーションでは [Key for browser apps] を使用します。


デフォルトでは、このキーはどのサイトでも利用できます。不正なサイトでの使用を防ぐため、管理者権限を持つドメインでのみこのキーを使用することを強くおすすめします。API キーの [Edit allowed referrers…] をクリックすると、キーを使用できるドメインを指定することができます。
※上記説明は少し情報が古いようです。APIコンソールの画面が現在とは異なります

地図を表示する

まずは簡単な例を紹介します。以下のHTMLは、熊本城を中心とした地図を表示します。
(公式ドキュメントのサンプルを少し変更してます)

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0; padding: 0 }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript"
      src="http://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&sensor=SET_TO_TRUE_OR_FALSE">
    </script>
    <script type="text/javascript">
      function initialize() {
        var mapOptions = {
          center: new google.maps.LatLng(32.806187,130.705832),
          zoom: 14,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map_canvas"),
            mapOptions);
      }
    </script>
  </head>
  <body onload="initialize()">
    <div id="map_canvas" style="width:100%; height:100%"></div>
  </body>
</html>

例を表示(map-simple.html)

ここではbodyタグのonloadイベントから初期化していますが、jqueryを併用する場合は次のように書くこともできます。

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
      html { height: 100% }
      body { height: 100%; margin: 0; padding: 0 }
      #map_canvas { height: 100% }
    </style>
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
    <script type="text/javascript"
      src="http://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&sensor=SET_TO_TRUE_OR_FALSE">
    </script>
    <script type="text/javascript">
      $(function(){
        var mapOptions = {
          center: new google.maps.LatLng(32.806187,130.705832),
          zoom: 14,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map($("#map_canvas").get(0),
            mapOptions);
      });
    </script>
  </head>
  <body>
    <div id="map_canvas" style="width:100%; height:100%"></div>
  </body>
</html>

例を表示(map-simple_jquery.html)

どちらを使うかは必要に応じて使い分ければOKです。
以下の説明ではbodyのonloadイベントから初期化するパターンになります。

Google Maps APIを読み込む

<html>
  <head>
    <script type="text/javascript"
      src="http://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&sensor=SET_TO_TRUE_OR_FALSE">
    </script>

scriptタグ内のURLは、javascriptファイルの位置を示しており、このファイルにはGoogle Maps APIを使用する上で必要なシンボルと定義がすべて入っています。このscriptタグは必須です。

keyパラメータにはアプリケーションのAPIキーが含まれています。APIキーはAPIコンソールから生成する必要があります。
APIキーは必須です。

sensorパラメータは必須です。このアプリケーションがユーザーの位置情報を取得するのにセンサー(GPS など)を使用するかどうかを示します。この例では、パラメータの値を true または false に明示的に設定する必要があることを強調するために、set_to_true_or_false を変数のままにしています。

HTTPS

HTTPSアプリケーションの場合は、HTTPS接続で Google Maps JavaScript API を読み込むこともできます。

<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&sensor=SET_TO_TRUE_OR_FALSE"
  type="text/javascript"></script>

必要に応じて使い分けましょう。

地図のDOM要素

<div id="map_canvas" style="width: 100%; height: 100%"></div>

地図をウェブページに表示するには、そのための領域を用意する必要があります。それには、ブラウザのDOM内で名前付きの div 要素を作成し、この要素への参照を取得してください。

上の例では「map_canvas」というIDの<div> を定義し、style 属性でそのサイズを設定しています。この値は携帯端末で適切なサイズに拡張されるよう「100%」に設定されています。これらの値は、必要に応じてブラウザの画面サイズに合わせて調整します。地図は常にそのサイズを、地図を収容する要素のサイズから取得するので、<div>のサイズは常に明示的に設定する必要があります

地図のオプション

var mapOptions = {
  center: new google.maps.LatLng(32.806187,130.705832),
  zoom: 8,
  mapTypeId: google.maps.MapTypeId.ROADMAP
};

地図を初期化するために、まず地図の初期化変数を保持する Map options オブジェクトを作成します。このオブジェクトは構築するのではなく、オブジェクト リテラルとして作成します。
ここでは、「中心の位置」「ズームレベル」「マップタイプ」の3つが必須なのでその3つについて説明します。

緯度と経度

特定の地点を地図の中心として設定するには、その位置を格納するための LatLng オブジェクトを作成し、位置の座標を「緯度, 経度」の順序で渡します。

center = new google.maps.LatLng(32.806187,130.705832)

ズーム レベル

地図を表示するための最初の解像度は、zoom プロパティで設定します。ズーム 0 は、完全にズームアウトして地球全体を表示した状態です。ズーム レベルを上げるほど、ズームインして解像度が高くなります。

zoom: 8

地球全体の地図を 1 つの画像として表示するには、巨大な地図を用意するか、解像度をかなり下げて小さな地図で表示する必要があります。そのため、Google マップおよび Maps API では、地図画像を「タイル」に分割して「ズーム レベル」ごとに保持しています。低いズーム レベルでは、少数のマップ タイルで広い領域をカバーします。ズーム レベルが上がるほど、解像度の高いタイルで、より小さい領域をカバーします。

マップ タイプ

初期マップ タイプも明示的に設定する必要があります。

mapTypeId: google.maps.MapTypeId.ROADMAP

サポートされているマップ タイプは次のとおりです。

  • ROADMAP は、Google マップの通常のデフォルトである 2D タイルを表示します。
  • SATELLITE は、写真タイルを表示します。
  • HYBRID は、写真タイルと主要な対象物(道路、地名)のタイル レイヤを組み合わせて表示します。
  • TERRAIN は、物理的な起伏を示すタイルで、高度や水系の対象物(山、河川など)を表示します。
  • ほとんどの場合は上記の基本タイプを知っていれば十分です。

    地図オブジェクト

    var map = new google.maps.Map(document.getElementById("map_canvas"),
        mapOptions);
    

    地図を表す JavaScript クラスは、Map クラスです。このクラスのオブジェクトは、1 つの地図をページ上に定義します(このクラスのインスタンスを複数作成することで、別々の地図を同じページ上に生成することもできます)。JavaScript の new 演算子を使用して、このクラスの新しいインスタンスを作成します。

    新しい地図のインスタンスを作成するときは、地図のコンテナとして、ページ内で

    HTML ノードを指定します。HTML ノードは JavaScript の document オブジェクトの子要素となります。また、document.getElementById() メソッドでこの要素への参照を取得します。

    このコードでは変数(名前は map)を定義し、この変数を新しい Map オブジェクトに割り当てます。また、mapOptions オブジェクト リテラル内で定義したオプションを渡します。各オプションは、地図のプロパティを初期化するのに使用します。

    地図を読み込む

    <body onload="initialize()">
    

    HTML ページをレンダリングすると同時に、DOMを作成し、外部の画像とスクリプトをすべて取得して、document オブジェクトに組み込みます。必ずページの読み込みが完了した後に地図を配置するには、HTML ページの 要素が onload イベントを受け取ったときにのみ Map オブジェクトを作成する関数を実行します。これにより、予測できない動作を防ぎ、地図を描画する方法とタイミングを正確にコントロールすることができます。

    おわりに

    以上で冒頭に紹介した地図を表示できるようになります。
    まずは上記サンプルの中心の位置を変更して、別の位置が表示されるかを確かめるといいでしょう。
    次回はマーカーを配置する方法についての説明を予定してます。

Google Static Maps APIの使い方(2)

前回はGoogle Static Maps APIで基本的な地図を表示する方法を書きました。
今回は前回紹介しきれなかったパラメータを紹介していきます。

format

結果として得られる画像の形式を定義します。
標準ではPNG画像が作成されますが、用途に応じて以下の形式が選択可能です。
・png8 またはpng(デフォルト): 8 ビットの PNG 形式を指定します。
・png32: 32 ビットの PNG 形式を指定します。
・gif: GIF 形式を指定します。
・jpg: JPEG 圧縮形式を指定します。
・jpg-baseline: 非プログレッシブ JPEG 圧縮形式を指定します。

Googleの公式ドキュメントでは、

通常、最も圧縮率が高いのは JPEG で、GIF や PNG はより細かいところまで表示する場合に適しています。

と書かれております。
通常は特に指定しなくても問題ないパラメータですが、フィーチャーフォン向けに表示する場合には「jpg」を指定することを検討してもいいと思います。

pngの場合(デフォルト)

東京タワー周辺の地図

jpgの場合

東京タワー周辺の地図

scale

返されるピクセルの数に影響します。scale=2はscale=1の2倍のピクセル数を返しますが、地図の表示範囲と詳細度は維持されます(つまり、地図の内容は同じです)。
これはスマートフォン向けに地図を表示する際や、印刷用の地図を生成する場合に便利です。
デフォルト値は「1」です。指定可能な値は他に「2」と「4」がありますが、「4」を指定できるのはMaps API for Businessを利用している場合(ビジネス用に料金を払って利用している方)のみです。
(最近のiPhoneであればscale=2と指定することできれいな画像を表示することが可能です)

scale=1(デフォルト)

東京タワー周辺の地図

scale=2

東京タワー周辺の地図

maptype

作成する地図のタイプを定義します。maptype に指定できる値は、roadmap、satellite、hybrid、および terrain です。

・roadmap(デフォルト)
 Google マップ ウェブサイトで通常表示される標準の道路地図画像を指定します。
東京タワー周辺の地図
・satellite
 航空写真
東京タワー周辺の地図
・terrain
 地形図の画像を指定します。この画像では地形や植生がわかります。
東京タワー周辺の地図
・hybrid
 航空写真と道路地図の組み合わせを指定します。この画像では、航空写真の上に主要な道路や場所の名前の透過レイヤが表示されます。
東京タワー周辺の地図

おわりに

他にも、
・language
・region
・path
・visible
・style
などのパラメータが利用できます。

pathは地図上にラインを引く(道案内用のラインを引くなど)が可能になるパラメータですので、静的な地図にラインを引きたい方はこのパラメータを使うといいですよ。
ただし、静的マップのURLは2048文字のサイズに制限されているため、その制限を超えないように注意が必要になります。
(マーカーの数やパスの数が余程多くない限りこの制限を超えることはないでしょう)

次回は「Google Maps JavaScript API v3」について解説して行こうと思います。
質問などはFacebookページにお願いします。
» 株式会社みのモン 公式facebookページ




Google Static Maps APIの使い方(1)

今回はGoogleから提供されているGoogle Static Maps APIの使い方をご紹介します。

Google Static Maps APIというのは「JavaScript や動的なページ読み込みを使うことなく、Google マップ画像をウェブページに埋め込むことができる」ものです。

このAPIに関するドキュメントはhttps://developers.google.com/maps/documentation/staticmaps/index?hl=jaにまとめられていますので、このページの内容に沿って使い方を紹介します。

表示サンプル

次の例は、東京の港区の静的な地図画像のURLです。

http://maps.googleapis.com/maps/api/staticmap?center=%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC&zoom=14&size=600x300&maptype=roadmap
&markers=color:blue%7Clabel:H%7C35.660347,139.729207&markers=color:green%7Clabel:M%7C35.665185,139.730558
&markers=color:red%7Ccolor:red%7Clabel:Z%7C35.657392,139.748207&sensor=false
東京タワー周辺の地図

上の画像を表示するためにjavascriptを使う必要はなく、<img>タグ内に配置するだけで、ウェブサイト上のどの位置にでも置くことができます。

注意点

Google Static Maps APIには使用制限があります。
・1日につき、アプリケーションあたり 25,000 回の静的マップリクエスト
上記回数を超えた場合にはエラー画像が表示されるようになっており、追加の場合には料金を支払う必要があります。
(地図読み込み回数を超過した分のオンライン購入価格を教えてください)

概要

Google Static Maps API は、画像(GIF、PNG、または JPEG)を返します。
各リクエストでは、
・地図の場所
・画像サイズ
・ズームレベル
・地図のタイプ
・(オプション)地図上に配置できるマーカー
を指定できます。マーカーには、英数字を使用してラベルを追加できます。

簡単な使い方

リクエストURLは次の形式で指定する必要があります。

http://maps.googleapis.com/maps/api/staticmap?parameters

HTTPSでアクセスする場合は「HTTP→HTTPS」と変えるだけで利用することが可能です。

地図を表示するだけであれば、

http://maps.googleapis.com/maps/api/staticmap?center=%E6%9D%B1%E4%BA%AC%E3%82%BF%E3%83%AF%E3%83%BC&zoom=14&size=600x300&sensor=false
東京タワー周辺の地図

というように、
・center
・zoom
・size
・sensor
を指定するだけで表示されます。

それぞれについて簡単に説明します。

center

地図の中心を定義します。
緯度経度のペア(例:35.660347,139.729207。「緯度,経度」の順)または文字列による住所や場所(例:東京タワー)で定義できます。
ただし日本語で定義する場合には、エンコードは必須です。

zoom

地図の拡大レベルを定義します。
目的の地域のズームレベルに対応する数値(0〜21)を指定することになります。
※すべての場所を、すべてのズームレベルで表示できるわけではありません。場所によって画像データの粒度が異なるため、使用できるズームレベルも異なります。

size

表示する画像のサイズになります。
「横x縦」というように指定します。
無料版では「640×640」が最大のサイズとなります。

sensor

静的マップをリクエストしているアプリケーションが、センサーを使用してユーザーの位置情報を取得しているかどうかを指定します。
すごく簡単に書くと、スマホなどでGPSを使って位置情報を取得した情報に対して地図の表示などをする場合には「true」に設定しておいて、それ以外は「false」で問題ないでしょう(厳密には違うかもしれませんので気になる方は公式マニュアルを参照して下さい)。

マーカーを表示する

マーカーを表示するためには「markers」というパラメータを使用します。

マーカースタイル(全て省略可)

マーカースタイルの記述は、パイプ文字(|)で区切られます。
(最初に載せたサンプルURLではエンコードされているため「%7C」となってます。)

・size:(省略可能): マーカーのサイズを {tiny, mid, small} のセットから指定します。size パラメータが設定されていないと、マーカーはデフォルト(normal)サイズで表示されます。
・color:(省略可能): 24 ビット カラー(例: color=0xFFFFCC)、または {black, brown, green, purple, yellow, blue, gray, orange, red, white} から定義済みの色を指定します。
・label:(省略可能): {A-Z, 0-9} から大文字の英数字を 1 文字指定します。(大文字の使用は、このバージョンの API で新しく必須要件になりました。)alphanumeric-character パラメータを表示できるのは、デフォルト サイズと mid サイズのマーカーのみです。tiny および small のマーカーでは、英数字を表示することはできません。

※小さいサイズで、赤、Mという文字を指定の場合

&markers=size:tiny%7Ccolor:red%7Clabel:M

となります。(この後ろに後述するマーカーの位置情報をつなげることになります)

これらのマーカーの代わりに、カスタムアイコンを使用することができます。
興味がある方はこちらをご覧ください。

マーカーの場所

マーカーの場所は地図の中心を定義した時と同様に、緯度経度のペアまたは文字列による住所や場所で指定が可能です。
マーカースタイルを指定している場合にはパイプ文字(|)を使用して区切ります。

markersはマーカーごとに指定するため最初のサンプルのように複数のマーカーを表示したい場合は複数個になることがあります。
(マーカー内の文字や色が3つとも異なる場合)

&markers=color:blue%7Clabel:H%7C35.660347,139.729207&markers=color:green%7Clabel:M%7C35.665185,139.730558&markers=color:red%7Ccolor:red%7Clabel:Z%7C35.657392,139.748207
東京タワー周辺の地図

違う種類のマーカーでなければ「markers」パラメータは1つでOKです。
(マーカー内の文字や色が3つとも同じ場合。)

&markers=size:small%7Ccolor:red%7Clabel:M%7C35.660347,139.729207%7C35.665185,139.730558%7C35.657392,139.748207
東京タワー周辺の地図

ほかにもパラメータがあります

これで基本的な使い方の説明は終わりです。
今回紹介したのは基本的なパラメータのみでしたが、他にも設定可能なパラメータがあります。
・地図のタイプを変える(道路地図,衛星画像など)
・画像のフォーマット(jpg,gif,png)の選択
などいろんなことが可能です。
スマホ用に2倍の解像度で表示したい場合のために、きちんとパラメータが用意されてたりします。

次回は他のパラメータについて触れたいと思います。
(おそらく全部ではないですが使うかもしれないところをいくつか紹介予定です。)




営業時間検索サイトαバージョンを公開しました

営業時間を調べることができるサイトを公開しました。
http://eigyojikan.minomon.jp/
capt_eigyojikan

まだ十分に機能と情報が入っていませんが、αバージョンとして公開し反応を見て改善をしながら正式公開に向かおうと思っております。

夜中に急にCDやDVD・ゲームなどを買いたくなった時に、まとめて開いている店舗を探したい時などに使えます。
エリアとジャンルを絞って探せるので、探したい情報が見つかると思います。

今後の追加予定機能として、
・現在地周辺から探す機能
・地図から探す機能
・今開いているお店検索機能
を予定しております。

更新情報はtwitter(@eigyojikan_info)でも発信しておりますので、興味がある方はチェックしてみてください。