Google Maps API for Flash の PanTo と PanBy
2010 年 6月 26 日Google Maps API for Flashを使って、緯度経度によって指定された場所の地図を出す…みたいな仕事がきそうなので、予めその部分だけテスト&個人的メモ。Google Maps API for Flash はリリースされた時期にちょろちょろといじった以来。当時、航空写真のサンプルFlash作ろうと思ったら、航空写真のリクエスト数制限みたいなのにひっかかってしまって、結局泣く泣くMicrosoftの地図APIを使って作ったんでした(これ)。今はどうでしょう。リクエストの制限とかまだあるんでしょうか。
さて、Google Maps APIでは、特定の場所に地図を移動させるとき、PanTo か PanBy を使用します。
まずは PanTo を使った場合。
-
//次の行き先(LatLagオブジェクト)
-
var _latlngNext:LatLng = new LatLng(行き先の緯度, 行き先の経度);
-
-
//次の行き先へPanToする
-
g_map.panTo(_latlngNext);
行き先の緯度経度オブジェクト(LatLngオブジェクト)を panTo の引数に入れてあげればOKです。しかし、それではちょいと動きが味気ないので、アニメーション移動(トゥイーン的な移動)ができる PanBy を使ってみます。
(2010/07/29 追記 :panToも近距離間の移動であれば、トゥイーン的な移動をしていました。すみません。どれくらい近距離であればという条件は不明です)
-
//次の行き先(LatLagオブジェクト)
-
var _latlngNext:LatLng = new LatLng(行き先の緯度, 行き先の経度);
-
-
//次の行き先と現在の地図の左端の差分をポイント(xの差分、yの差分)で出す
-
var _ditancePoint:Point = g_map.fromLatLngToViewport(_latlngNext);
-
-
//次のポイントへPanByする(上の差分は地図の左上基準なので、中央に持ってくるために地図サイズの縦横半分分ずらす)
-
g_map.panBy(new Point(_ditancePoint.x - g_map.width / 2, _ditancePoint.y - g_map.height / 2), true);
PanBy の第一引数は Pointオブジェクトで、LatLngオブジェクトではありません。現在の地図を横(x)縦(y)何ピクセルずらすか、という感じで使います。ちなみに第二引数の「true」はアニメーションさせるかどうかの引数で「false」にすると、PanTo と全く同じ処理(アニメーションしない)になります。
で、ここで「じゃあ、行き先の(x,y)と現在の地図の中心地の(x,y)の差をどうやって求めるのか」というのが鍵になりますが、Mapオブジェクトのメソッドに「fromLatLngToViewport(LatLang)」というのがあり、これが『現在表示されている地図の左上点と、指定された緯度経度(LatLng)とのxとyの差』をPointオブジェクトで返してくれるので、これを使って PanBy しますが、左上点との差なので、目標の行き先を中央に持ってくるために、さらにそのPointから、地図の横縦それぞれの半分の値を引いたPointで、PanBy させています。
現在の地図の中央の緯度経度を取るメソッドはありますが(Map.getCenter())、緯度経度オブジェクトをPointオブジェクトに変換するメソッドが無いので、上の手段を用いました。
