ダリの雑記:WEBプログラム版

GoogleマップAPI v3で地図とマーカー・バルーンを表示(複数版) version1.4b

【追記】

2012.06.30 バージョンアップしました。(version1.4b4)

2011.11.11 バージョンアップしました。(version1.4b3)

2011.08.13 バージョンアップしました。(version1.4b2)


ここから本文

バージョン1.3で見つかった、「geocoder.geocodeを使用した住所からの座標取得は、一度に取得できる件数に制限がある」という問題に対して、修正を行ったバージョンをアップロードしました。

スクリプトをダウンロードする

サンプルを見る

 

注意点

今回のバージョンではPHPも使用しております。もしPHP5.2以上が利用できないサーバをご利用の場合は、申し訳ございませんが、このバージョンは使用しないでください。

またサーバのPHPの設定(php.ini)で「allow_url_fopen」が有効になっていないと利用できませんので、こちらもご注意ください。

なお、PHPを使用するといっても、AJAXリクエストで実行させているだけなので、実際にマップを表示するページをPHP化させる必要はありません。

※作った直後でまだ十分な実験を行えていないので、このバージョンを使用する際は、よく動作をご確認の上、ご利用ください。

※現在ではv3でもAPIキーが必要となっています。
https://developers.google.com/maps?hl=ja

 

まず、前バージョンのバグの原因と、その対処方法について説明いたします。

そんなことより設置手順だ

 

原因

上記にも書いてある通り、Google Map APIにて、「geocoder.geocode」を使った住所からの座標取得は、短時間で取得できる件数に制限があります。(Google Map APIの仕様)

 

対処方法

こちらのサイトにて、PHPを用いた住所から座標を取得する方法を発見。

[googlemap]phpで住所から座標を割り出す

しかもPHPから取得する場合、件数制限がないっぽい。
【追記】※短時間で、というのは大丈夫ですが、1日における制限ありました。
1日に住所から取得できる件数というのは、大体2500件くらいと決まってるみたいです。[ Google Geocoding API - Google Maps API Web サービス - Google Codeの使用制限参照 ]
ご注意ください。)

とはいえ、毎回取得しに行くのも無駄なので、一度取得できた住所の座標データはCSV形式でサーバに出力しておき、以降はそれを見に行くという方式にしました。(もちろん新しく住所が追加された場合は、取得しに行き、それをCSVに追加します。)

ただ、正直読み込み速度などが微妙なので、まだまだ改良点はありそう。
【追記】※バージョン1.4b2で速度問題はかなり解消されました。

 

設置手順

では設置方法です。「スクリプトの設定」と「map.js」へのパスが変わる(map.jsがgoogle_map_api_jsフォルダの中に入るため)部分以外は、前バージョンと同じです。

 

1.bodyタグに、バルーン用情報を記述します。複数なんでちょっと長くなりますが4件ほどデータを入れます。(以下例)

[html]

<ul id="gmap_list">

<li>
<div class='gmap_title'><a name="gmap_title">アロチ本家丸高</a></div>
<div class='gmap_photo'><img src="img/marutaka.jpg" width="120" alt="京橋幸太郎" /></div>
<div class='gmap_info'>
<span class='gmap_address'>和歌山県和歌山市友田町2-50</span><br />
TEL:073-432-3313<br />
営業時間:17:30~3:00<br />
定休日:日曜
</div>
<div class='clear'></div>
<div class='gmap_description'>
醤油でひと煮立ちさせ、一晩寝かせた豚骨でとったスープはコクが生かされクセになる味
</div>
</li>

<li>
<div class='gmap_title'><a name="gmap_title">井出商店</a></div>
<div class='gmap_photo'><img src="img/yamatame.jpg" width="120" alt="山為食堂" /></div>
<div class='gmap_info'>
<span class='gmap_address'>和歌山県和歌山市田中町4-84</span><br />
TEL:073-424-1689<br />
営業時間:11:30~23:30<br />
定休日:木曜(年始休)
</div>
<div class='clear'></div>
<div class='gmap_description'>
和歌山ラーメンの名を全国に知らしめたのがこちらの店。
</div>
</li>

<li>
<div class='gmap_title'><a name="gmap_title">まるイ</a></div>
<div class='gmap_photo'><img src="img/marui.jpg" width="120" alt="まるイ" /></div>
<div class='gmap_info'>
<span class='gmap_address'>和歌山県和歌山市中之島2323</span><br />
TEL:073-427-2662<br />
営業時間:平日19:00~翌3:00/土19:00~翌4:00<br />
定休日:日曜
</div>
<div class='clear'></div>
<div class='gmap_description'>
全国から集まる麺ファンを虜にするこんもりと盛られたネギの山!
</div>
</li>

<li>
<div class='gmap_title'><a name="gmap_title">ラグマン</a></div>
<div class='gmap_photo'><img src="img/raguman.jpg" width="120" alt="ラグマン" /></div>
<div class='gmap_info'>
<span class='gmap_address'>和歌山県和歌山市黒田258-7 玉置マンション1F</span><br />
TEL:073-475-1200<br />
営業時間:12:00~14:00/17:30~23:30 <br />
定休日:水曜日
</div>
<div class='clear'></div>
<div class='gmap_description'>
“らぐまん”ならではのオリジナルラーメンは、34種類!レゲエが流れるログハウス作りのオシャレなお店。
</div>
</li>

</ul>

<div id="map" style="width:500px;height:500px;"></div>
<div class='clear'></div>

[/html]

※それぞれに情報は必ずリスト形式にしてください。

ここで必要なものは

となっています。

もちろんこれまでのバージョン同様、座標データからマーカーを表示することもできます。その場合は前バージョンと同じく「class="gmap_coord"」を含んだタグを追記してください。

[html highlight_lines="14,15,16"]

<li>
<div class='gmap_title'><a name='gmap_title'>アロチ本家丸高</a></div>
<div class='gmap_photo'><img src='img/marutaka.jpg' width='120' alt='京橋幸太郎' /></div>
<div class='gmap_info'>
和歌山県和歌山市友田町2-50<br />
TEL:073-432-3313<br />
営業時間:17:30~3:00<br />
定休日:日曜
</div>
<div class='clear'></div>
<div class='gmap_description'>
醤油でひと煮立ちさせ、一晩寝かせた豚骨でとったスープはコクが生かされクセになる味
</div>
<div class='gmap_coord'>
34.2326948,135.1848098
</div>
</li>

[/html]

class="gmap_coord"の中の座標は

マーカー緯度,マーカー経度

となっています。(座標についてはこちらから手動で取得できます)

 

※ここで注意点。

マーカー座標を設定する際、以下のパターンが考えられます。

(1) すべて住所から座標に変換する場合。(gmap_addressのみ)

(2) すべて座標を「gmap_coord」に用意しておく場合。(gmap_coordのみ)

(3) 住所から変換するものと、座標が用意されているものが混ざっている場合(gmap_address+gmap_coord)

 

(1) のパターンでは、各項目(<li>内部の記述)の中に「gmap_address」を設定すればOKです。
(この場合「gmap_coord」は必要ありません。)サンプル

(2) のパターンについても、各項目の中に「gmap_coord」を設定すれば問題ありません。
(この場合「gmap_address」は必要ありません。)サンプル

問題は (3) のパターンについて。
一度でも住所から座標を取得する項目がある場合は、すべての項目に「class="gmap_address"」を設定してください。その中で「class="gmap_coord"」がある場合は、そちらが優先されます。
つまり「class="gmap_address"」はとりあえずすべての項目の住所に設定しておき、座標に微調整を加えたいなどの項目がある場合のみ、それに「class="gmap_coord"」をつけて設定する、という感じで設定してください。
サンプル

上記のサンプルはどれも見た目変わりませんが、ソースがそれぞれ違いますので各ページのソースをご覧ください。

 

2.以下のスクリプトをダウンロードしてください。

 

3.スクリプトの設定を行います。

google_map_api_js.zipをダウンロードしましたら、解凍してください。「google_map_api_js」というフォルダができます。

フォルダの中には

の3ファイルが入っています。

map.jsをプログラムが編集できるテキストエディタで開き、27行目付近の

[javascript num="27"]
var php_path = "js/v1.4b2/google_map_api_js/get_coord.php";
[/javascript]

の部分に、「get_coord.php」までのURLパスを記述してください。

例えば、ウェブルートの「js」フォルダに「google_map_api_js」フォルダをまるごとアップロードする場合は

[javascript num="27"]
var php_path = "http://ドメイン/js/google_map_api_js/get_coord.php";
[/javascript]

となります。

また、17~22行目付近にかけて、座標やズーム値の初期値を設定できます。

[javascript num="17"]
var mc_lat = 34.6862971;    //中心座標の緯度(初期値)
var mc_lng = 135.5196609;    //中心座標の経度(初期値)
var mp_lat = 34.6862971;    //マーカーの緯度(初期値)
var mp_lng = 135.5196609;    //マーカーの経度(初期値)
var zoom = 5;        //ズーム値(初期値)
var zoom_max = 15;    //ズームの最大値(MAX20 MIN1)寄り過ぎを防ぐ
[/javascript]

以上の設定が終わりましたら、「google_map_api_js」フォルダをまるごとサーバにアップロードしてください。ただし、上記で設定した通り、map.jsには「get_coord.php」までのパスが記述されているので、それに沿った場所にアップロードしてください。

また、「google_map_api_js」フォルダには、CSVファイルを書き出す必要があるため、パーミッションを777にするなど、書き込み権限をつけてください。

 

4.htmlファイルのheadタグにjqueryとmap.js、Google Map APIを読み込んでください。

[html]
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="js/google_map_api_js/map.js"></script>
[/html]

※metaタグで文字コードをutf-8にするのを忘れずに。これがないと正常に動作しない場合があります。
※「jquery」とスクリプトファイル一式(「google_map_api_js」フォルダ)は、「js」フォルダにアップロードしたと仮定して記述しています。

 

5.bodyタグのonloadにて、マップ表示用関数を呼び出します。

[html]
<body onload="map_all('map','gmap_list')">
[/html]

map_allの引数について

これで、マーカー・バルーン付きマップが表示できます。

 

6.スタイルを整えます。以下をheadタグ内に記述するか、別ファイルに保存してheadタグで埋め込んでください。(スタイルシートのダウンロードはこちら

[css]

#map{
float:left;
}

.clear{
clear:both;
}

/*吹き出しのスタイル*/
.gmap_block{
width:320px;
}
.gmap_block .gmap_title{
font-size:100%;
font-weight:bold;
margin-bottom:10px;
}

.gmap_block .gmap_photo{
float:right;
margin-left:10px;
overflow:hidden;
}

.gmap_block .gmap_info{
font-size:75%;
}

.gmap_block .gmap_description{
font-size:75%;
margin-top:10px;
}
/*お店の情報(個別用)*/
#gmap_data{
float:left;
margin-right:10px;
width:320px;
}

#gmap_data .gmap_photo{
float:left;
width:130px;
}

#gmap_data .gmap_title{
font-size:100%;
font-weight:bold;
line-height:1.5em;
}

#gmap_data .gmap_info,
#gmap_data .gmap_description{
font-size:75%;
line-height:1.5em;
}

#gmap_data .gmap_description{
padding-top:5px;
}

/*お店の情報(リスト用)*/
#gmap_list{
width:300px;
height:500px;
overflow:scroll;
float:left;
margin:0px;
padding:0px;
}

#gmap_list li{
list-style-type:none;
margin:0px 0px 20px 0px;
padding:0px;
}

#gmap_list .gmap_photo{
float:left;
width:130px;
}

#gmap_list .gmap_title{
font-size:100%;
font-weight:bold;
line-height:1.5em;
}

#gmap_list .gmap_title a{
color:#0000FF;
text-decoration: underline;
cursor:pointer;
}

#gmap_list .gmap_info,
#gmap_list .gmap_description{
font-size:75%;
line-height:1.5em;
}

#gmap_list .gmap_description{
padding-top:5px;
}

.gmap_coord{
display:none;
}

[/css]

ここまで、ラーメン屋の記述を例にとっておいてなんですが、10件以上表示可能であることをお見せするため、サンプルでは全都道府県の表示例をご用意いたしました。

全都道府県の表示例(47件):サンプル [新しいウィンドウで開く]

【追記】全都道府県の市区表示例(979件):サンプル [新しいウィンドウで開く]

979件ともなるとさすがに重いです^^;

キャッシュができている状態でも表示まで3,4秒かかります。ちなみにキャッシュなしの状態だとマーカーが表示されるまで2分ほどかかりました。

マーカー件数限界は特に調べてませんが多分1000件くらいでも耐えれると思います。ただ上記に書いているように表示まで時間がかかるので、地区別やカテゴリ別で表示するなど件数を減らしてから表示することをお勧めします。

また、1日に住所から取得できる件数というのは、大体2500件くらいらしい(Google Geocoding API - Google Maps API Web サービス - Google Codeの使用制限参照)ので、そちらもご注意ください(キャッシュされているのであればいいですが、1日のうちに2500件以上新規に住所から取得しようとしても多分できません。)

以上です。

バグなどありましたらご連絡いただけるとありがたいです。

モバイルバージョンを終了