Maps JavaScript API v2 は、2021 年 5 月 26 日をもってご利用いただけなくなりました。その結果、サイトの v2 の地図は機能しなくなり、JavaScript エラーが返されます。サイト上で地図を引き続き使用するには、Maps JavaScript API v3 に移行してください。このガイドでは、このプロセスについて説明します。
概要
移行プロセスはアプリケーションごとに若干異なりますが、すべてのプロジェクトに共通する手順がいくつかあります。
- 新しい鍵を取得する。Maps JavaScript API では、Google Cloud コンソールを使用してキーを管理するようになりました。まだ v2 キーを使用している場合は、移行を開始する前に必ず新しい API キーを取得してください。
- API ブートストラップを更新します。ほとんどのアプリケーションは、次のコードを使用して Maps JavaScript API v3 を読み込みます。
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
- コードを更新します。必要な変更の量は、アプリケーションによって大きく異なります。一般的な変更には次のようなものがあります。
- 常に google.maps 名前空間を参照します。v3 では、すべての Maps JavaScript API コードはグローバル名前空間ではなく
google.maps.*
名前空間に格納されます。このプロセスの一環として、ほとんどのオブジェクトの名前も変更されています。たとえば、GMap2
ではなく google.maps.Map
を読み込みます。
- 廃止されたメソッドへの参照をすべて削除します。
GDownloadURL
や GLog
など、多くの汎用ユーティリティ メソッドが削除されました。この機能をサードパーティのユーティリティ ライブラリに置き換えるか、コードからこれらの参照を削除してください。
- (省略可)コードにライブラリを追加します。多くの機能はユーティリティ ライブラリに外部化されているため、各アプリは API のうち使用する部分を読み込むだけで済みます。
- (省略可)v3 外部を使用するようにプロジェクトを構成します。v3 エクスターンを使用して、Closure Compiler でコードを検証したり、IDE でオートコンプリートをトリガーしたりできます。詳細については、
高度なコンパイルとエクスターンをご覧ください。
- テストを繰り返す。この時点でまだ行うべき作業はありますが、新しい v3 マップ アプリケーションの作成に向けて順調に進んでいることでしょう。
Maps JavaScript API V3 の変更点
移行を計画する前に、Maps JavaScript API v2 と Maps JavaScript API v3 の違いを理解しておく必要があります。Maps JavaScript API の最新バージョンは、最新の JavaScript プログラミング技術、ライブラリの使用の増加、API の簡素化に重点を置いてゼロから記述されています。多くの新機能が API に追加され、なじみのある機能も変更または削除されています。このセクションでは、2 つのリリースの主な違いについて説明します。
v3 API の主な変更点は次のとおりです。
- コア ライブラリを簡素化。補足関数の多くはライブラリに移動されました。これにより、Core API の読み込みと解析時間が短縮され、どのデバイスでも地図をすばやく読み込むことができます。
- ポリゴンのレンダリングやマーカーの配置など、いくつかの機能のパフォーマンスが向上しました。
- クライアント側の使用制限に対する新しいアプローチにより、モバイル プロキシと企業ファイアウォールで使用される共有アドレスにより適切に対応できます。
- いくつかの最新ブラウザとモバイル ブラウザのサポートを追加しました。Internet Explorer 6 のサポートは終了しました。
- 多くの汎用ヘルパークラス(
GLog
または
GDownloadUrl
)を削除しました。現在、Closure や jQuery など、同様の機能を提供する優れた JavaScript ライブラリが多数存在します。
- あらゆるモバイル端末でロードされる HTML5 ストリート ビューが実装されました。
- 自分で撮影した写真でカスタム ストリートビュー パノラマを作成して、スキー場や売り場などの興味深い場所のパノラマ画像を共有できます。
- スタイル付き地図のカスタマイズ: 独自の表示スタイルに合わせて、基本地図の要素の表示を変更できます。
- ElevationService や Distance Matrix などの新しいサービスをサポートします。
- 改善されたルートサービスでは、代替ルート、ルートの最適化(
移動販売員の問題のおおよその解決策)、自転車ルート(
自転車レイヤを使用)、乗換案内、
ドラッグ可能なルートが提供されます。
- Geocoding API v2 の
accuracy
値よりも正確なタイプ情報を提供するように更新されたジオコーディング形式。
- 1 つのマップ上での複数の情報ウィンドウのサポート
新しいキー
Maps JavaScript API v3 では、v2 から新しいキーシステムが使用されています。アプリケーションですでに v3 鍵を使用している場合、変更は必要ありません。これを確認するには、Maps JavaScript API の読み込み元の URL の key
パラメータを確認します。鍵の値が「ABQIAA」で始まる場合は、v2 鍵を使用しています。v2 鍵をお持ちの場合は、移行の一環として v3 鍵にアップグレードする必要があります。これにより、次のようになります。
キーは、Maps JavaScript API v3 を読み込むときに渡されます。API キーの生成の詳細
Google Maps API for Work をご利用の場合は、key
パラメータの代わりに、client
パラメータでクライアント ID を使用している可能性があります。クライアント ID は Maps JavaScript API v3 でも引き続きサポートされており、キーのアップグレード プロセスを行う必要はありません。
API の読み込み
最初にコードに変更を加える必要があるのは、API のロード方法に関する変更です。v2 では、http://maps.google.com/maps
へのリクエストによって Maps JavaScript API を読み込みます。Maps JavaScript API v3 を読み込む場合は、次の変更を行う必要があります。
//maps.googleapis.com/maps/api/js
から API を読み込む
file
パラメータを削除します。
- 新しい v3 鍵で
key
パラメータを更新します。Google Maps API for Work をご利用の場合は、client
パラメータを使用する必要があります。
- (Google Maps Platform プレミアム プランのみ)
Google Maps Platform プレミアム プランのデベロッパー ガイドで説明されているように、
client
パラメータが指定されていることを確認します。
v
パラメータを削除して最新のリリース バージョンをリクエストするか、v3 バージョニング スキームに合わせて値を変更します。
- (省略可)
hl
パラメータを language
に置き換えて、その値を保持します。
- (省略可)
libraries
パラメータを追加して、オプションのライブラリを読み込みます。
最も単純なケースでは、v3 ブートストラップで API キー パラメータのみを指定します。
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
次の例では、Maps JavaScript API v2 の最新バージョンをドイツ語でリクエストしています。
<script src="//maps.google.com/maps?file=api&v=2.x&key=YOUR_API_KEY&hl=de"></script>
次の例は、v3 の場合の同等のリクエストです。
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=de"></script>
google.maps 名前空間の導入
Maps JavaScript API v3 で最も顕著な変更点は、google.maps
名前空間の導入です。v2 API はデフォルトですべてのオブジェクトをグローバル名前空間に配置するため、名前の競合が発生する可能性があります。v3 では、すべてのオブジェクトは google.maps
名前空間内に配置されます。
アプリケーションを v3 に移行する場合は、新しい名前空間を使用するようにコードを変更する必要があります。残念ながら、「G」を検索して「google.maps.」に置き換えても完全には機能しませんが、コードを確認する際は経験則として適用することをおすすめします。以下に、v2 と v3 の同等のクラスの例を示します。
v2 |
v3 |
GMap2 |
google.maps.Map |
GLatLng |
google.maps.LatLng |
GInfoWindow |
google.maps.InfoWindow |
GMapOptions |
google.map.MapOptions |
G_API_VERSION |
google.maps.version |
GPolyStyleOptions |
google.maps.PolygonOptions or
google.maps.PolylineOptions |
廃止されたコードの削除
Maps JavaScript API v3 は、v2 のほとんどの機能に対応していますが、一部のクラスのサポートは終了しています。移行の一環として、これらのクラスをサードパーティのユーティリティ ライブラリに置き換えるか、これらの参照をコードから削除する必要があります。Closure や jQuery など、同様の機能を提供する優れた JavaScript ライブラリが多数存在します。
次のクラスには、Maps JavaScript API v3 に対応するクラスがありません。
GBounds | GLanguage |
GBrowserIsCompatible | GLayer |
GControl | GLog |
GControlAnchor | GMercatorProjection |
GControlImpl | GNavLabelControl |
GControlPosition | GObliqueMercator |
GCopyright | GOverlay |
GCopyrightCollection | GPhotoSpec |
GDownloadUrl | GPolyEditingOptions |
GDraggableObject | GScreenOverlay |
GDraggableObjectOptions | GStreetviewFeatures |
GFactualGeocodeCache | GStreetviewLocation |
GGeoAddressAccuracy | GStreetviewOverlay |
GGeocodeCache | GStreetviewUserPhotosOptions |
GGoogleBar | GTileLayerOptions |
GGoogleBarAdsOptions | GTileLayerOverlayOptions |
GGoogleBarLinkTarget | GTrafficOverlayOptions |
GGoogleBarListingTypes | GUnload |
GGoogleBarOptions | GXml |
GGoogleBarResultList | GXmlHttp |
GInfoWindowTab | GXslt |
GKeyboardHandler |
|
コードの比較
v2 と v3 の API を使用して作成された、かなりシンプルな 2 つのアプリケーションを比較してみましょう。
<!DOCTYPE html>
<html>
<head>
<script src="//maps.google.com/maps?file=api&v=2&key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(
document.getElementById('map'));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.setUIToDefault();
map.addOverlay(new GMarker(new GLatLng(37.4419, -122.1419)));
}
}
</script>
</head>
<body onload="initialize()" onunload="GUnload()">
<div id="map"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<script src="//maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
<style>
html, body, #map { height: 100%; margin: 0; }
</style>
<script>
function initialize() {
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(37.4419, -122.1419),
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: new google.maps.LatLng(37.4419, -122.1419),
map: map
});
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
</head>
<body>
<div id="map"></div>
</body>
</html>
ご覧のとおり、この 2 つのアプリケーションの間にはいくつかの違いがあります。主な変更点は、以下のとおりです。
- API のロード元のアドレスが変更されています。
GBrowserIsCompatible()
メソッドと GUnload()
メソッドは v3 では不要になったため、API から削除されました。
GMap2
オブジェクトは、API の中心オブジェクトとして google.maps.Map
に置き換えられます。
- プロパティは、Options クラスを通じて読み込まれるようになりました。上記の例では、インラインの
MapOptions
オブジェクトを介して、地図の読み込みに必要な 3 つのプロパティ(center
、zoom
、mapTypeId
)を設定しています。
- V3 では、デフォルト ユーザー インターフェースがデフォルトでオンになっています。これを無効にするには、
MapOptions
オブジェクトで disableDefaultUI
プロパティを true に設定します。
まとめ
これで、Maps JavaScript API を v2 から v3 に移行する際の重要なポイントの一部を理解できました。他にも知っておくべき情報がありますが、これはアプリケーションによって異なります。以降のセクションでは、発生する可能性のある特定のケースの移行手順について説明します。また、アップグレード プロセスに役立つリソースもいくつかあります。
この記事について問題やご質問がある場合は、このページの上部にある [フィードバックを送信] リンクをご利用ください。
このセクションでは、Maps JavaScript API の v2 と v3 でよく利用される機能を詳細に比較しています。リファレンスの各セクションは個別に読むように構成されています。このリファレンス全体を読むのではなく、状況に応じてこの資料を使用して移行を支援することをおすすめします。
- イベント: イベントの登録と処理を行います。
- コントロール - 地図上に表示されるナビゲーション コントロールの操作。
- オーバーレイ - 地図上のオブジェクトの追加や編集。
- マップタイプ - 基本地図を構成するタイル。
- レイヤ - KML レイヤや交通状況レイヤなどのコンテンツをグループとして追加したり、編集したりします。
- サービス - Google のジオコーディング、ルート、ストリートビュー サービスを使用。
イベント
Maps JavaScript API v3 のイベントモデルは、v2 のイベントモデルに似ていますが、内部で多くの変更が加えられています。
MVC をサポートするための新しいイベント
V3 API は、MVC の状態変化を反映する新しいタイプのイベントが追加されています。現在、次の 2 種類のイベントがあります。
- ユーザー イベント(「クリック」マウスイベントなど)は、DOM から Maps JavaScript API に伝播されます。これらのイベントは、標準の DOM イベントとは別物です。
- MVC の状態変化の通知は、Maps API オブジェクトの変化を反映したもので、
property_changed
規則に従って名前が付けられます。
各 Maps API オブジェクトは、いくつかの名前付きイベントをエクスポートします。アプリケーションで特定のイベントを処理する場合は、そのイベントに対するイベント リスナーを登録し、イベントの受信時にコードを実行する必要があります。このイベント ドリブンのメカニズムは、名前空間が GEvent
から google.maps.event
に変更されている点を除き、Maps JavaScript API v2 と v3 で同じです。
GEvent.addListener(map, 'click', function() {
alert('You clicked the map.');
});
google.maps.event.addListener(map, 'click', function() {
alert('You clicked the map.');
});
イベント リスナーの削除
パフォーマンス上の理由から、不要になったイベント リスナーは削除することをおすすめします。イベント リスナーの削除は、v2 と v3 で同じです。
- イベント リスナーを作成すると、不透明オブジェクト(v2 では GEventListener、v3 では MapsEventListener)が返されます。
- イベント リスナーを削除する場合は、このオブジェクトを
removeListener()
メソッド(v2 では GEvent.removeListener()
、v3 では google.maps.event.removeListener()
)に渡してイベント リスナーを削除します。
DOM イベントのリッスン
DOM(ドキュメント オブジェクト モデル)イベントをキャプチャして応答する場合、v3 には、v2 の GEvent.addDomListener()
メソッドに相当する google.maps.event.addDomListener()
静的メソッドが用意されています。
イベントで渡された引数を使用する
多くの場合、UI イベントはイベント引数を渡します。この引数には、イベント リスナーがアクセスできます。v3 のほとんどのイベント引数は、API のオブジェクトに対する一貫性を高めるために簡素化されています。(詳しくは、v3 リファレンスをご覧ください)。
v3 イベント リスナーに overlay
引数は存在しません。v3 の地図で click
イベントを登録すると、ユーザーが基本地図をクリックしたときにのみコールバックが発生します。クリック可能なオーバーレイのクリックに応答する必要がある場合は、追加のコールバックを登録できます。
// Passes an overlay argument when clicking on a map
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
GEvent.addListener(map,'click', function(overlay, latlng) {
if (latlng) {
var marker = new GMarker(latlng);
map.addOverlay(marker);
}
});
// Passes only an event argument
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
google.maps.event.addListener(map, 'click', function(event) {
var marker = new google.maps.Marker({
position: event.latLng,
map: map
});
});
コントロールの数
Maps JavaScript API は、ユーザーが地図を操作できるようにする UI コントロールを表示します。API を使用して、これらのコントロールの表示方法をカスタマイズできます。
コントロール タイプの変更
v3 API では、control
型に対するいくつかの変更が行われました。
- v3 API では、地形マップやカスタムのマップタイプを追加する機能など、追加のマップタイプがサポートされています。
- v2 階層コントロール
GHierarchicalMapTypeControl
は使用できなくなりました。google.maps.MapTypeControlStyle.HORIZONTAL_BAR
コントロールでも同様の効果が得られます。
- v2 の
GMapTypeControl
によって提供される水平レイアウトは、v3 では使用できません。
地図にコントロールを追加する
Maps JavaScript API v2 では、マップ オブジェクトの addControl()
メソッドを使用して地図にコントロールを追加します。v3 では、コントロールに直接アクセスまたは修正するのではなく、関連する MapOptions
オブジェクトを変更します。以下のサンプルは、地図をカスタマイズして次のコントロールを追加する方法を示しています。
- 使用可能なマップタイプをユーザーが切り替えることができるボタン
- マップの縮尺
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add controls
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add controls
mapTypeControl: true,
scaleControl: true
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
マップ上のコントロールの配置
V3 では、コントロールの配置方法が大きく変更されています。v2 では、addControl()
メソッドにオプションの 2 番目のパラメータがあり、地図の隅を基準としたコントロールの位置を指定できます。
v3 では、コントロールの位置は、コントロール オプションの position
プロパティを使って設定します。これらのコントロールの配置は絶対的なものではありません。API は、指定された制約(地図サイズなど)の範囲内で、既存の地図要素の周囲にコントロールを「並べて」インテリジェントにレイアウトします。これにより、デフォルトのコントロールと既存のコントロールとの互換性が確保されます。
詳しくは、v3 でのコントロールの配置をご覧ください。
次のコードは、上のサンプルのコントロールを再配置します。
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
// Add map type control
map.addControl(new GMapTypeControl(), new GControlPosition(
G_ANCHOR_TOP_LEFT, new GSize(10, 10)));
// Add scale
map.addControl(new GScaleControl(), new GControlPosition(
G_ANCHOR_BOTTOM_RIGHT, new GSize(20, 20)));
var myOptions = {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP,
// Add map type control
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.TOP_LEFT
},
// Add scale
scaleControl: true,
scaleControlOptions: {
position: google.maps.ControlPosition.BOTTOM_RIGHT
}
};
var map = new google.maps.Map(document.getElementById('map'),
myOptions);
カスタム コントロール
Maps JavaScript API を使用すると、カスタム ナビゲーション コントロールを作成できます。v2 API でコントロールをカスタマイズするには、GControl
クラスをサブクラス化して、initialize()
メソッドと getDefaultPosition()
メソッドのハンドラを定義します。v3 には、GControl
クラスに相当するクラスはありません。代わりに、コントロールは DOM 要素として表されます。v3 API でカスタム コントロールを追加するには、コンストラクタ内にコントロールの DOM 構造(<div>
要素など)を Node
の子として作成し、DOM イベントを処理するイベント リスナーを追加します。Node
を地図の controls[position]
配列にプッシュして、カスタム コントロールのインスタンスを地図に追加します。
以下のコードサンプルでは、上記のインターフェース要件(詳細についてはカスタム コントロールに関するドキュメントを参照)に準拠した HomeControl
クラスの実装を前提として、カスタム コントロールを地図に追加する方法を示します。
map.addControl(new HomeControl(),
GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10, 10)));
var homeControlDiv = document.createElement('DIV');
var homeControl = new HomeControl(homeControlDiv, map);
map.controls[google.maps.ControlPosition.TOP_RIGHT].push(
homeControlDiv);
オーバーレイ
オーバーレイは、点、線、領域、またはオブジェクトの集合を示すために地図に「追加」するオブジェクトを反映します。
オーバーレイの追加と削除
オーバーレイで表されるオブジェクトのタイプは、v2 と v3 で同じですが、処理方法が異なります。
v2 API のオーバーレイは、GMap2
オブジェクトの addOverlay()
メソッドと removeOverlay()
メソッドを使用して、地図に追加および地図から削除されていました。v3 では、関連するオーバーレイ オプション クラスの map
プロパティを使用して、地図をオーバーレイに割り当てます。オーバーレイ オブジェクトの setMap()
メソッドを呼び出して、目的の地図を指定することで、オーバーレイを直接追加または削除することもできます。map プロパティを null
に設定すると、オーバーレイが削除されます。
v3 には clearOverlays()
メソッドは存在しません。複数のオーバーレイを管理する場合は、オーバーレイを保持する配列を作成する必要があります。この配列を使用して、配列内の各オーバーレイで setMap()
を呼び出すことができます(削除する必要がある場合は null
を渡します)。
ドラッグ可能マーカー
デフォルトでは、マーカーはクリック可能ですが、ドラッグ可能ではありません。次の 2 つのサンプルは、ドラッグ可能なマーカーを追加します。
var myLatLng = new GLatLng(-25.363882, 131.044922);
var map = new GMap2(document.getElementById('map'));
map.setCenter(myLatLng, 4);
var marker = new GMarker(latLng, {
draggable: true
});
map.addOverlay(marker);
var myLatLng = new google.maps.LatLng(-25.363882, 131.044922);
var map = new google.maps.Map(
document.getElementById('map'), {
center: myLatLng,
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
position: myLatLng,
draggable: true,
map: map
});
アイコン
デフォルトのマーカーの代わりに表示するカスタム アイコンを定義できます。v2 でカスタム イメージを使用するには、G_DEFAULT_ICON type
から GIcon
インスタンスを作成して変更します。画像がデフォルトのアイコンより大きい、または小さい場合は、GSize
インスタンスで指定する必要があります。v3 API では、このプロセスが少し簡素化されています。マーカーの icon
プロパティにカスタム画像の URL を設定するだけで、API によってアイコンのサイズが自動的に調整されます。
Maps JavaScript API は、複雑なアイコンもサポートしています。複雑なアイコンには、複数のタイルや複雑なシェイプを含めることや、画像を他のオーバーレイに対してどのように表示するかの「重ね順序」を指定できます。v2 でマーカーにシェイプを追加するには、各 GIcon
インスタンスで追加のプロパティを指定し、それをオプションとして GMarker
コンストラクタに渡す必要があります。v3 では、この方法で指定したアイコンの icon
プロパティを Icon
タイプのオブジェクトに設定する必要があります。
v3 では、マーカー シャドウはサポートされません。
次の例では、オーストラリアのボンダイ ビーチのビーチフラグを表示しています。アイコンの透明な部分はクリックできません。
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(-25.363882, 131.044922), 4);
map.setUIToDefault();
var flagIcon = new GIcon(G_DEFAULT_ICON);
flagIcon.image = '/images/beachflag.png';
flagIcon.imageMap = [1, 1, 1, 20, 18, 20, 18 , 1];
var bbLatLng = new GLatLng(-33.890542, 151.274856);
map.addOverlay(new GMarker(bbLatLng, {
icon: flagIcon
}));
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(-25.363882, 131.044922),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var shape = {
coord: [1, 1, 1, 20, 18, 20, 18 , 1],
type: 'poly'
};
var bbLatLng = new google.maps.LatLng(-33.890542, 151.274856);
var bbMarker = new google.maps.Marker({
icon: '/images/beachflag.png'
shape: shape,
position: bbLatLng,
map: map
});
ポリライン
ポリラインは、LatLng
の配列と、これらの位置を決まった順序で結ぶ一連の線分で構成されます。
v3 での Polyline
オブジェクトの作成と表示は、v2 での GPolyline
オブジェクトの使用と似ています。以下のサンプルでは、チューリッヒからシンガポール経由でシドニーまでの、半透明で幅 3 ピクセルの測地線ポリラインを描画します。
var polyline = new GPolyline(
[
new GLatLng(47.3690239, 8.5380326),
new GLatLng(1.352083, 103.819836),
new GLatLng(-33.867139, 151.207114)
],
'#FF0000', 3, 0.5, {
geodesic: true
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: [
new google.maps.LatLng(47.3690239, 8.5380326),
new google.maps.LatLng(1.352083, 103.819836),
new google.maps.LatLng(-33.867139, 151.207114)
],
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
geodesic: true
});
polyline.setMap(map);
エンコードしたポリライン
v3 では、エンコードされたポリラインから Polyline
オブジェクトを直接作成することはできません。代わりに、ジオメトリ ライブラリにはポリラインをエンコードおよびデコードするメソッドが用意されています。このライブラリを読み込む方法について詳しくは、v3 Maps API のライブラリをご覧ください。
以下の例では、同じエンコードされたポリラインを描画します。v3 のコードでは、google.maps.geometry.encoding
名前空間の decodePath()
メソッドを使用します。
var polyline = new GPolyline.fromEncoded({
points: 'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H',
levels: 'PPP',
zoomFactor: 2,
numLevels: 18,
color: '#ff0000',
opacity: 0.8,
weight: 3
});
map.addOverlay(polyline);
var polyline = new google.maps.Polyline({
path: google.maps.geometry.encoding.decodePath(
'kwb`Huqbs@ztzwGgvpdQbw}uEoif`H'),
strokeColor: '#FF0000',
strokeOpacity: 0.5,
strokeWeight: 3,
});
polyline.setMap(map);
ポリゴン
ポリゴンは、閉ループ内の領域を定義します。Polyline
オブジェクトと同様に、Polygon
オブジェクトは、指定された順序の一連の点で構成されます。v3 の Polygon
クラスは、v2 の GPolygon
クラスとほぼ同じですが、ループを閉じるためにパスの最後に開始頂点を繰り返す必要がなくなった点が異なります。v3 API は、最後の座標を最初の座標に接続するストロークを描画することで、自動的にポリゴンを閉じます。次のコード スニペットは、バミューダ トライアングルを表すポリゴンを作成します。
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(24.886436, -70.268554), 5);
var bermudaTriangle = new GPolygon(
[
new GLatLng(25.774252, -80.190262),
new GLatLng(18.466465, -66.118292),
new GLatLng(32.321384, -64.75737),
new GLatLng(25.774252, -80.190262)
],
'#FF0000', 2, 0.8, '#FF0000', 0.35);
map.addOverlay(bermudaTriangle);
var map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(24.886436, -70.268554),
mapTypeId: google.maps.MapTypeId.TERRAIN,
zoom: 5
});
var bermudaTriangle = new google.maps.Polygon({
paths: [
new google.maps.LatLng(25.774252, -80.190262),
new google.maps.LatLng(18.466465, -66.118292),
new google.maps.LatLng(32.321384, -64.75737)
],
strokeColor: '#FF0000',
strokeWeight: 2,
strokeOpacity: 0.8,
fillColor: '#FF0000',
fillOpacity: 0.35
});
bermudaTriangle.setMap(map);
ユーザーによる編集が可能なシェイプ
ポリラインとポリゴンは、ユーザーによる編集を可能にすることができます。次のコード スニペットは同じ意味を持ちます。
map.addOverlay(polyline);
polyline.enableEditing();
polyline.setMap(map);
polyline.setEditable(true);
より高度な描画機能については、v3 ドキュメントの描画ライブラリをご覧ください。
情報ウィンドウ
InfoWindow
は、地図上のフローティング ウィンドウにコンテンツを表示します。v2 と v3 の情報ウィンドウの主な違いは次のとおりです。
- v2 API は地図ごとに
GInfoWindow
のみをサポートしますが、v3 API は各地図で複数の InfoWindow
を同時にサポートします。
- v3 の
InfoWindow
は、地図をクリックしても開いたままになります。v2 の GInfoWindow
は、地図をクリックすると自動的に終了します。v2 の動作をエミュレートするには、Map
オブジェクトに click
リスナーを追加します。
- v3 API では、タブ形式の
InfoWindow
のネイティブ サポートは提供されていません。
地面オーバーレイ
地図に画像を配置するには、GroundOverlay
オブジェクトを使用する必要があります。GroundOverlay
のコンストラクタは、v2 と v3 で基本的に同じです。画像の URL と画像の境界をパラメータとして指定します。
次の例では、ニュージャージー州ニューアークのアンティーク地図をオーバーレイとして地図上に配置しています。
var bounds = new GLatLngBounds(
new GLatLng(40.716216, -74.213393),
new GLatLng(40.765641, -74.139235));
var overlay = new GGroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
map.addOverlay(overlay);
var bounds = new google.maps.LatLngBounds(
new google.maps.LatLng(40.716216, -74.213393),
new google.maps.LatLng(40.765641, -74.139235));
var overlay = new google.maps.GroundOverlay(
'http://lib.utexas.edu/maps/historical/newark_nj_1922.jpg',
bounds);
overlay.setMap(map);
マップタイプ
v2 と v3 では使用できる地図のタイプが若干異なりますが、すべての基本の地図タイプは API の両方のバージョンで使用できます。デフォルトでは、v2 は標準の「ペイントされた」道路地図タイルを使用します。ただし、v3 では、google.maps.Map
オブジェクトの作成時に特定のマップタイプを指定する必要があります。
共通のマップタイプ
v2 および v3 では、次の 4 つの基本マップタイプを使用できます。
MapTypeId.ROADMAP
(G_NORMAL_MAP
の後継): 道路地図ビューを表示します。
MapTypeId.SATELLITE
(G_SATELLITE_MAP
の後継): Google Earth の衛星画像を表示します。
MapTypeId.HYBRID
(G_HYBRID_MAP
の後継): 通常のビューと衛星画像ビューが混在して表示されます。
MapTypeId.TERRAIN
(G_PHYSICAL_MAP
の後継)は、地形情報に基づいた物理地図を表示します。
次に、マップを地形ビューに設定している v2 と v3 の例を示します。
map.setMapType(G_PHYSICAL_MAP);
map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
Maps JavaScript API v3 では、あまり一般的でないマップタイプにもいくつかの変更が加えられています。
- 地球以外の天体のマップタイルは、v3 API ではマップタイプとして使用できませんが、こちらの例に示すように、カスタムのマップタイプとしてアクセスできます。
- v3 には、v2 の
G_SATELLITE_3D_MAP
タイプを置き換える特別なマップタイプはありません。代わりに、こちらのライブラリを使用して、Google Earth プラグインを v3 の地図に統合できます。
最大ズーム画像
航空写真の場合、高いズーム レベルが利用できるとは限りませんズームレベルを設定する前に使用可能な最大ズームレベルを確認したい場合は、google.maps.MaxZoomService
クラスを使用します。このクラスは、v2 の GMapType.getMaxZoomAtLatLng()
メソッドに代わるものです。
var point = new GLatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new GMap2(document.getElementById("map"));
map.setUIToDefault();
map.setCenter(point);
map.setMapType(G_HYBRID_MAP);
map.getCurrentMapType().getMaxZoomAtLatLng(point,
function(response) {
if (response.status) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
var myLatlng = new google.maps.LatLng(
180 * Math.random() - 90, 360 * Math.random() - 180);
var map = new google.maps.Map(
document.getElementById("map"),{
zoom: 0,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.HYBRID
});
var maxZoomService = new google.maps.MaxZoomService();
maxZoomService.getMaxZoomAtLatLng(
myLatlng,
function(response) {
if (response.status == google.maps.MaxZoomStatus.OK) {
map.setZoom(response.zoom);
} else {
alert("Error in Max Zoom Service.");
}
});
空気遠近法画像
v3 で航空画像を有効にした場合、コントロールは v2 の GLargeZoomControl3D
コントロールとほぼ同じですが、サポートされている方向に回転するためのインタースティシャルの回転コントロールが追加されています。
現在 45° 画像が利用可能な都市は、こちらの地図で確認できます。45° 画像が利用可能な場合、Maps API の航空写真ボタンにサブメニュー オプションが追加されます。
レイヤ
レイヤは、1 つ以上のオーバーレイで構成される地図上のオブジェクトです。これらは単一のユニットとして操作でき、通常はオブジェクトの集合を反映します。
サポートされるレイヤ
V3 API は、さまざまなレイヤに対するアクセスを可能にします。これらのレイヤは、以下の部分で v2 GLayer
クラスと重複しています。
-
KmlLayer
オブジェクトは、KML 要素と GeoRSS 要素を v3 オーバーレイにレンダリングし、v2 の GeoXml
レイヤと同等の機能を提供します。
TrafficLayer
オブジェクトは、v2 の GTrafficOverlay
オーバーレイと同様に、交通状況を示すレイヤをレンダリングします。
各レイヤは、V2 とは異なります。その違いについて以下で説明します。レイヤを地図に追加するには、setMap()
を呼び出して、レイヤを表示する Map
オブジェクトを渡します。
サポートされているレイヤの詳細については、レイヤのドキュメントをご覧ください。
KML レイヤと GeoRSS レイヤ
Maps JavaScript API は、地理情報を表示するために KML および GeoRSS のデータ形式をサポートしています。KML ファイルや GeoRSS ファイルを地図に含めるには、それらのファイルが一般公開されている必要があります。v3 では、これらのデータ形式は KmlLayer
のインスタンスを使用して表示されます。これは v2 の GGeoXml
オブジェクトに代わるものです。
v3 API は、KML をレンダリングする際の柔軟性が高く、情報ウィンドウを抑制してクリック レスポンスを変更できます。詳細については、V3 の KML レイヤと GeoRSS レイヤのドキュメントをご覧ください。
KmlLayer
をレンダリングする場合は、サイズと複雑さの制限が適用されます。詳細については、KmlLayer のドキュメントをご覧ください。
次のサンプルは、KML ファイルをロードする方法を比較しています。
geoXml = new GGeoXml(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml');
map.addOverlay(geoXml);
var layer = new google.maps.KmlLayer(
'https://googlearchive.github.io/js-v2-samples/ggeoxml/cta.kml', {
preserveViewport: true
});
layer.setMap(map);
交通状況レイヤ
v3 では、TrafficLayer
オブジェクトを使用してリアルタイムの交通情報(サポートされている場合)を地図に追加できます。トラフィック情報は、リクエストが行われた時点のものです。次の例は、ロサンゼルスの交通情報を示しています。
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(34.0492459, -118.241043), 13);
map.setUIToDefault();
var trafficOptions = {incidents:false};
trafficInfo = new GTrafficOverlay(trafficOptions);
map.addOverlay(trafficInfo);
var map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(34.0492459, -118.241043),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 13
});
var trafficLayer = new google.maps.TrafficLayer();
trafficLayer.setMap(map);
v2 とは異なり、v3 には TrafficLayer
コンストラクタのオプションが存在しません。インシデントは v3 では使用できません。
サービス
Geocoding
Maps JavaScript API には、ユーザー入力から住所を動的にジオコーディングするための geocoder
オブジェクトが用意されています。既知の住所を静的にジオコーディングしたい場合は、Geocoding API のドキュメントをご覧ください。
Geocoding API は大幅にアップグレードおよび強化され、新機能の追加とデータの表現方法の変更が行われました。
v2 API の GClientGeocoder
では、フォワード ジオコーディングとリバース ジオコーディングの 2 つの異なるメソッドと、ジオコーディングの実行方法に影響を与える追加のメソッドが提供されていました。一方、v3 の Geocoder
オブジェクトには geocode()
メソッドのみがあり、Geocoding リクエスト オブジェクトの形式で入力用語を含むオブジェクト リテラルとコールバック メソッドを受け取ります。リクエストにテキスト形式の address
属性と LatLng
オブジェクトのどちらが含まれているかに応じて、Geocoding API はフォワード ジオコーディングまたはリバース ジオコーディングのレスポンスを返します。追加のフィールドをジオコーディング リクエストに渡すことで、ジオコーディングの実行方法を調整できます。
- テキスト形式の
address
を含めると、フォワード ジオコーディングがトリガーされます。これは、getLatLng()
メソッドを呼び出すのと同じです。
latLng
オブジェクトを含めると、リバース ジオコーディングがトリガーされます。これは、getLocations()
メソッドを呼び出すのと同じです。
bounds
属性を含めると、ビューポートのバイアスが有効になります(setViewport()
メソッドを呼び出す場合と同等)。
region
属性を含めると、地域コードのバイアスが有効になります。これは、setBaseCountryCode()
メソッドを呼び出す場合と同じです。
v3 のジオコーディングのレスポンスは、v2 のレスポンスと大きく異なります。v3 API では、v2 で使用されているネスト構造が、解析しやすいよりフラットな構造に置き換えられています。さらに、v3 のレスポンスはより詳細です。各結果には複数の住所コンポーネントが含まれており、各結果の解像度をより正確に把握できます。
次のコードは、テキスト形式の住所を受け取り、ジオコーディングの最初の結果を表示します。
var geocoder = new GClientGeocoder();
var infoPanel;
var map;
var AccuracyDescription = [
'Unknown accuracy', 'country level accuracy',
'region level accuracy', 'sub-region level accuracy',
'town level accuracy', 'post code level accuracy',
'street level accuracy', 'intersection level accuracy',
'address level accuracy', 'premise level accuracy',
];
function geocode_result_handler(response) {
if (!response || response.Status.code != 200) {
alert('Geocoding failed. ' + response.Status.code);
} else {
var bounds = new GLatLngBounds(new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.south,
response.Placemark[0].ExtendedData.LatLonBox.west
), new GLatLng(
response.Placemark[0].ExtendedData.LatLonBox.north,
response.Placemark[0].ExtendedData.LatLonBox.east
));
map.setCenter(bounds.getCenter(),
map.getBoundsZoomLevel(bounds));
var latlng = new GLatLng(
response.Placemark[0].Point.coordinates[1],
response.Placemark[0].Point.coordinates[0]);
infoPanel.innerHTML += '<p>1st result is <em>' +
// No info about location type
response.Placemark[0].address +
'</em> of <em>' +
AccuracyDescription[response.Placemark[0].
AddressDetails.Accuracy] +
'</em> at <tt>' + latlng + '</tt></p>';
var marker_title = response.Placemark[0].address +
' at ' + latlng;
map.clearOverlays();
var marker = marker = new GMarker(
latlng,
{'title': marker_title}
);
map.addOverlay(marker);
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.getLocations(address, geocode_result_handler);
}
function initialize() {
map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(38, 15), 2);
map.setUIToDefault();
infoPanel = document.getElementById('info-panel');
}
var geocoder = new google.maps.Geocoder();
var infoPanel;
var map;
var marker;
function geocode_result_handler(result, status) {
if (status != google.maps.GeocoderStatus.OK) {
alert('Geocoding failed. ' + status);
} else {
map.fitBounds(result[0].geometry.viewport);
infoPanel.innerHTML += '<p>1st result for geocoding is <em>' +
result[0].geometry.location_type.toLowerCase() +
'</em> to <em>' +
result[0].formatted_address + '</em> of types <em>' +
result[0].types.join('</em>, <em>').replace(/_/, ' ') +
'</em> at <tt>' + result[0].geometry.location +
'</tt></p>';
var marker_title = result[0].formatted_address +
' at ' + latlng;
if (marker) {
marker.setPosition(result[0].geometry.location);
marker.setTitle(marker_title);
} else {
marker = new google.maps.Marker({
position: result[0].geometry.location,
title: marker_title,
map: map
});
}
}
}
function geocode_address() {
var address = document.getElementById('input-text').value;
infoPanel.innerHTML = '<p>Original address: ' + address + '</p>';
geocoder.geocode({'address': address}, geocode_result_handler);
}
function initialize() {
map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(38, 15),
zoom: 2,
mapTypeId: google.maps.MapTypeId.HYBRID
});
infoPanel = document.getElementById('info-panel');
}
Directions
Maps JavaScript API v3 では、v2 の GDirections
クラスがルート計算用の DirectionsService
クラスに置き換えられました。
v3 の route()
メソッドは、v2 API の load()
メソッドと loadFromWaypoints()
メソッドの両方に代わるものです。このメソッドは、入力語句を含む単一の DirectionsRequest
オブジェクト リテラルと、レスポンスの受信時に実行するコールバック メソッドを受け取ります。このオブジェクト リテラルでは、v2 の GDirectionsOptions
オブジェクト リテラルと同様に、オプションを指定できます。
Maps JavaScript API v3 では、ルート リクエストを送信するタスクと、リクエストをレンダリングするタスクは分離され、レンダリング タスクは DirectionsRenderer
クラスで処理されるようになりました。DirectionsRenderer
オブジェクトの setMap()
メソッドと setDirections()
メソッドを使用すると、任意の地図または DirectionsResult
オブジェクトを関連付けることができます。レンダラは MVCObject
であるため、プロパティへの変更があればそれを検出して、関連付けられたルートが変更されると地図を更新します。
次のコードは、住所から歩道を使用して、特定の場所までの徒歩ルートをリクエストする方法を示しています。ダブリン動物園の歩道を歩くルートを指定できるのは、v3 のみです。
var map;
var directions;
var directionsPanel;
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsPanel = document.getElementById("route");
map = new GMap2(document.getElementById('map'));
map.setCenter(origin, 10);
map.setUIToDefault();
directions = new GDirections(map, directionsPanel);
directions.loadFromWaypoints(
[origin, destination], {
travelMode: 'G_TRAVEL_MODE_WALKING',
});
}
var map;
var directionsRenderer;
var directionsService = new google.maps.DirectionsService();
function initialize() {
var origin = new google.maps.LatLng(53.348172, -6.297285);
var destination = new google.maps.LatLng(53.355502, -6.30557);
directionsRenderer = new google.maps.DirectionsRenderer();
map = new google.maps.Map(
document.getElementById('map'), {
center: origin,
zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
directionsRenderer.setPanel(document.getElementById("route"));
directionsRenderer.setMap(map);
directionsService.route({
origin: origin,
destination: destination,
travelMode: google.maps.DirectionsTravelMode.WALKING
}, function(result, status) {
if (status == google.maps.DirectionsStatus.OK) {
directionsRenderer.setDirections(result);
}
});
}
ストリートビュー
Google ストリートビューは、対象地域内の指定された場所からのインタラクティブな 360 度ビューを提供します。ストリートビューの画像を表示するために Flash® プラグインが必要だった v2 とは異なり、v3 API はブラウザ内でストリートビューをネイティブにサポートします。
ストリートビュー画像は、v3 では StreetViewPanorama
オブジェクト、v2 では GStreetviewPanorama
オブジェクトを使用することでサポートされます。これらのクラスはインターフェースが異なりますが、div
コンテナをストリートビュー画像に接続し、ストリートビュー パノラマの位置と POV(視点)を指定できるように、同じ役割を果たします。
function initialize() {
var fenwayPark = new GLatLng(42.345573, -71.098326);
panoramaOptions = {
latlng: fenwayPark,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new GStreetviewPanorama(
document.getElementById('pano'),
panoramaOptions);
GEvent.addListener(myPano, "error", handleNoFlash);
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
function initialize() {
var fenway = new google.maps.LatLng(42.345573, -71.098326);
var panoramaOptions = {
position: fenway,
pov: {
heading: 35,
pitch: 5,
zoom: 1
}
};
var panorama = new google.maps.StreetViewPanorama(
document.getElementById('pano'),
panoramaOptions);
}
ストリートビュー データに直接アクセスするには、v3 では StreetViewService
オブジェクト、v2 では同様の GStreetviewClient
オブジェクトを使用します。どちらも、ストリートビュー データの取得や利用可否の確認や、場所やパノラマ ID による検索を可能にする同様のインターフェースを備えています。
V3 では、ストリートビューはデフォルトで有効になっています。地図にストリートビューのペグマン コントロールが表示され、API によって地図の div が再利用され、ストリートビュー パノラマが表示されます。次のコードは、ストリートビュー パノラマを別の div に分割して、v2 の動作をエミュレートする方法を示しています。
var marker;
var panoClient = new GStreetviewClient();
function initialize() {
if (GBrowserIsCompatible()) {
var myPano = new GStreetviewPanorama(
document.getElementById('pano'));
GEvent.addListener(myPano, 'error', handleNoFlash);
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(42.345573, -71.098326), 16);
map.setUIToDefault();
GEvent.addListener(map, 'click', function(overlay, latlng) {
if (marker) {
marker.setLatLng(latlng);
} else {
marker = new GMarker(latlng);
map.addOverlay(marker);
}
var nearestPano = panoClient.getNearestPanorama(
latlng, processSVData);
});
function processSVData(panoData) {
if (panoData.code != 200) {
alert("Panorama data not found for this location.");
}
var latlng = marker.getLatLng();
var dLat = latlng.latRadians()
- panoData.location.latlng.latRadians();
var dLon = latlng.lngRadians()
- panoData.location.latlng.lngRadians();
var y = Math.sin(dLon) * Math.cos(latlng.latRadians());
var x = Math.cos(panoData.location.latlng.latRadians()) *
Math.sin(latlng.latRadians()) -
Math.sin(panoData.location.latlng.latRadians()) *
Math.cos(latlng.latRadians()) * Math.cos(dLon);
var bearing = Math.atan2(y, x) * 180 / Math.PI;
myPano.setLocationAndPOV(panoData.location.latlng, {
yaw: bearing
});
}
function handleNoFlash(errorCode) {
if (errorCode == FLASH_UNAVAILABLE) {
alert('Error: Your browser does not support Flash');
return;
}
}
}
}
// Load the API with libraries=geometry
var map;
var marker;
var panorama;
var sv = new google.maps.StreetViewService();
function radians(degrees) { return Math.PI * degrees / 180.0 };
function initialize() {
panorama = new google.maps.StreetViewPanorama(
document.getElementById("pano"));
map = new google.maps.Map(
document.getElementById('map'), {
center: new google.maps.LatLng(42.345573, -71.098326),
mapTypeId: google.maps.MapTypeId.ROADMAP,
zoom: 16
});
google.maps.event.addListener(map, 'click', function(event) {
if (!marker) {
marker = new google.maps.Marker({
position: event.latLng,
map: map
});
} else {
marker.setPosition(event.latLng);
}
sv.getPanoramaByLocation(event.latLng, 50, processSVData);
});
}
function processSVData(panoData, status) {
if (status == google.maps.StreetViewStatus.OK) {
alert("Panorama data not found for this location.");
}
var bearing = google.maps.geometry.spherical.computeHeading(
panoData.location.latLng, marker.getPosition());
panorama.setPano(panoData.location.pano);
panorama.setPov({
heading: bearing,
pitch: 0,
zoom: 1
});
panorama.setVisible(true);
marker.setMap(panorama);
}