« OL蔡桃桂2006/07/28 | メイン | 夏になりました - 八坂鳥居前 »

GoogleMaps活用するぞ!(12) - ポリラインをひこう

(カテゴリ:GoogleMaps

Google Mapsが用意するポリラインは、次々に各点を指定することによって多角形を地図上に書くことができます。色や太さ、不透明度も指定することができます。


ポリラインの使う際の注意

インタネットエクスプローラでポリラインを表示する場合には、ページの冒頭に下の赤字の部分を追加しなければならないようです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:v="urn:schemas-microsoft-com:vml">

Google Maps API Documentationの"XHTML and VML"の項目では、違うことが書かれています。しかし、私が試してみた限り、上の指定で十分なようです。

ポリラインの基本スクリプト

Google Maps API が用意するポリラインを作るための GPolylineは、以下の4つのパラメーターで作られています。(原文はGoogle Maps API DocumentationのClass Referenceにあり。)

GPolyline(points[ , color, weight, opacity])

points ポリラインの始点から終点までの各点の緯度・経度を指定する(必須)。
color ポリラインの色を指定する(オプション)。"#ffffff"のように16進法で指定する。
weight ポリラインの幅をピクセルで指定する(オプション)。
opacity ポリラインの不透明度を0から1までの数値で指定する(オプション)。

たとえば、赤で不透明度80%のポリラインをひく場合には、このように書きます。

GPolyline(変数 , "#ff0000", , "0.8")

変数の部分は、ポリラインの各点を示す緯度経度の値の列を含んだものとなります。


具体的な例を、下に挙げます。5つの頂点を持った、赤色、幅3ピクセル、不透明度90%のポリラインです。頂点を変数として指定する式は、マーカーの場合と同じです。その後それらの変数を連ねた変数"line001"を用意して、GPolylineの変数に代入する構造となっています。もっと多くの点を指定する場合も同様の形となります。

var polpoint001=new GLatLng(34.867834540841116, 135.65540313720703);
var polpoint002=new GLatLng(34.89163364963405, 135.68042278289795);
var polpoint003=new GLatLng(34.92612307758587, 135.69806098937988);
var polpoint004=new GLatLng(34.9643260674448, 135.72046279907226);
var polpoint005=new GLatLng(34.97923658319042, 135.74621200561523);
var line001 = [polpoint001,polpoint002,polpoint003,polpoint004,polpoint005];
map.addOverlay(new GPolyline(line001, "#ff0000","3","0.9"));


では、前回のスクリプトに、ポリラインを書き加えます。

赤字の部分が、今回追加した部分です(一番下の"body"部分の変更は除く)。冒頭の箇所にも追加が行なわれていることに注意してください。下の例では、色の違う二本のポリラインを地図上に書くことにします。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:v="urn:schemas-microsoft-com:vml">

<head>

<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps JavaScript API Example</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=xxxxxxxxxxxxxxxxxxxxxxxxxxx"
type="text/javascript"></script>

<script type="text/javascript">

function load() {

if (GBrowserIsCompatible()) {

var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GScaleControl());
map.addControl(new GMapTypeControl());

GEvent.addListener(map, "moveend", function() {
var center = map.getCenter();
document.getElementById("message").innerHTML = center.toString();
});

map.setCenter(new GLatLng(34.903671401859576, 135.6913661956787), 14);

var icon1 = new GIcon();
icon1.image = "mitsu.png";
icon1.iconSize = new GSize(20, 20);
icon1.iconAnchor = new GPoint(6, 20);
icon1.infoWindowAnchor = new GPoint(5, 1);

var icon2 = new GIcon();
icon2.image = "hide.png";
icon2.iconSize = new GSize(20, 20);
icon2.iconAnchor = new GPoint(6, 20);
icon2.infoWindowAnchor = new GPoint(5, 1);


var point101 = new GLatLng(34.9144141335787, 135.69767475128174);
var marker101 = new GMarker(point101, icon1);
map.addOverlay(marker101);

var point102 = new GLatLng(34.908633821168436, 135.6767749786377);
var marker102 = new GMarker(point102, icon1);
map.addOverlay(marker102);


≪ここは省略されています≫


var point201 = new GLatLng(34.89346406486655, 135.68012237548828);
var marker201 = new GMarker(point201, icon2);
map.addOverlay(marker201);

var point202 = new GLatLng(34.90155964310935, 135.6764316558838);
var marker202 = new GMarker(point202, icon2);
map.addOverlay(marker202);


≪ここは省略されています≫


var polpoint001=new GLatLng(34.867834540841116, 135.65540313720703);
var polpoint002=new GLatLng(34.89163364963405, 135.68042278289795);
var polpoint003=new GLatLng(34.92612307758587, 135.69806098937988);
var polpoint004=new GLatLng(34.9643260674448, 135.72046279907226);
var polpoint005=new GLatLng(34.97923658319042, 135.74621200561523);
var line001 = [polpoint001,polpoint002,polpoint003,polpoint004,polpoint005];
map.addOverlay(new GPolyline(line001, "#00a800","3","0.9"));

var polpoint011=new GLatLng(34.97923658319042, 135.74621200561523);
var polpoint012=new GLatLng(34.9323859290129, 135.7448387145996);
var polpoint013=new GLatLng(34.90740204293937, 135.71874618530273);
var polpoint014=new GLatLng(34.89416805986599, 135.7009792327881);
var line002 = [polpoint011,polpoint012,polpoint013,polpoint014];
map.addOverlay(new GPolyline(line002, "#ff0000","3","0.9"));

}
}

</script>
</head>


<body onload="load()" onunload="GUnload()" bgcolor="#b188f7">

<table><tr><td width="510">
<div align="center"><font size="4" color="white"<b><GoogleMapで見る山崎大合戦></b></font></div>
<div align="center">- 天正十年(1582)六月十三日夕刻の布陣 -lt;/div><br>
<img src="mitsu.png">明智光秀方(総兵力15,000)   <img src="hide.png">羽柴秀吉方(総兵力35,000)<br>
<font color="#00a800">緑色は西国街道</font>、<font color="#ff0000">赤色は鳥羽街道</font>を示す。
<table cellspacing="2" bgcolor="black"><tr><td>
<div id="map" style="width: 500px; height: 450px"></div>
</td></tr></table>
<div id="message"></div>

</body>
</html>

下をクリックすれば、今回作った例を具体的に表示したページが表れます。(もちろん、Googleから取得したAPI Keyをページ内に埋め込んであります。)



Google Mapsの具体例:その2


大阪方面から京に入る道は、緑色の西国街道と赤色の鳥羽街道がありました。光秀は、決戦当日六月十三日の午前中まで、地図右上の鳥羽街道上に離れて置いたマーカーの付近(下鳥羽)に軍を置いていました。これは、秀吉軍が西国街道、鳥羽街道のどちらから京に侵入しても出動迎撃できる地点に立っていたのです。当時の京都府大山崎町付近の淀川は今よりもっと川幅が広く、容易に渡河できないことに注意してください。兵数で圧倒的に劣る光秀軍は、淀川が大阪府から京都府に入る口にある山崎(現大山崎町)と男山(現京都府八幡市男山)の両方をふさいで通れなくする策を取れませんでした。そんなことをしていたら背後から筒井順慶などにすら襲われるおそれがあったからです。秀吉軍が平地に展開しかけたところに全軍を集中投入して、粉砕するしか勝ち目がなかったのです。

次回以降は、インフォウィンドウを表示する方法を検討していきます。インフォウィンドウを使うことによって、データベースマップの意義が全面的に出てくることでしょう。