2009年9月30日水曜日

Google MapでOverlayBaseを使ってカスタムオーバーレイを作る

Google Mapで,独自のカスタムオーバーレイを作成するにはcom.google.maps.overlays.OverlayBaseを使えばいい。

ただ,OverlayBaseを単にnew・extendsしただけではランタイムエラーが出て使えない。このクラスはJavaでいうところのAbstractクラスのような構造になっているようで,下記のメソッドは最低限実装しなければならないようだ。

・getDefaultPane()
・positionOverlay()

例えば,地図のすぐ上のレイヤーに半透明のオーバーレイを表示するというミニマムなコードはこのようになる。

package {

  import com.google.maps.MapEvent;
  import com.google.maps.interfaces.IMap;
  import com.google.maps.interfaces.IPane;
  import com.google.maps.overlays.OverlayBase;

  //カスタムオーバーレイクラス
  public class CustomOverlay extends OverlayBase {


    //関連づけられた地図
    var map:IMap;


    //コンストラクタ
    public function CustomOverlay() {
      super();
      addEventListener(MapEvent.OVERLAY_ADDED, onOverlayAdded);
      function onOverlayAdded():void {
        update(); //このオーバーレイ追加と同時に更新処理
      }
    }


    //更新処理メソッド
    public function update():void {
      var w:Number = map.getDisplayObject().width;
      var h:Number = map.getDisplayObject().height;
      graphics.clear();
      graphics.beginFill(0x000000, 0.5); //半透明の黒で
      graphics.drawRect(0, 0, w, h); //マップの幅高さの領域を塗る
      graphics.endFill();
    }


    //必須実装メソッド
    public override function getDefaultPane(map:IMap):IPane {

      //後で使うために取っとく
      this.map = map;

      //地図のすぐ上のレイヤー(idx=0)にこのオーバーレイのペインを作成
      return map.getPaneManager().createPane(0);

    }


    //必須実装メソッド
    public override function positionOverlay(zoomChanged:Boolean):void {
      //あえて何も実装無し。実装なしにすると,オーバーレイはマップの動きに追随して移動する
    }


  } //END class

} //END package