2

OSM を新しいベース マップ タイプとして Google Maps API アプリケーションに追加することに成功しました。

次に、地図に陰影を追加する新しいオーバーレイ マップ タイプを追加しました。https://developers.google.com/maps/documentation/javascript/maptypes?hl=en#OverlayMapTypesのオーバーレイ マップ タイプに関するドキュメントには、次のように書かれています。

「[...]既存の MapType にマップ タイプを追加できます[...]」

「オーバーレイ マップ タイプは、それらがアタッチされているベース マップの上に表示されます。」

また、「次の例は、ROADMAP マップ タイプの上にタイル オーバーレイ MapType を作成したことを除いて、前の例と同じです。」

ただし、コード例では、選択したいずれかのマップ タイプにオーバーレイ マップ タイプが常に表示されます。

  1. 陰影起伏オーバーレイ マップ タイプをマップ タイプ「ロードマップ」とカスタム「OSM」マップ タイプにのみ表示するにはどうすればよいですか? 編集:より正確に言うと、上記のドキュメントが示唆するようにこれを自動的に行う方法があるかどうか、実際に知りたいです。maptypeid_changed イベントをリッスンして手動でこれを行う方法を知っています。

  2. デフォルトの衛星マップ タイプの「ラベル」またはロードマップ マップ タイプの「地形」で行われるように、オーバーレイ マップ タイプをチェックボックスとして mapTypeControl に追加する方法はありますか? 編集:数日前まで、上記の公式ドキュメントでこれを行う方法が提案されていましたが、正確には説明されておらず、リンクされた例は壊れていました (404 リンク)。Thy ユーザーはここで同じ問題を発見しました: Google マップ API: 別のマップ オーバーレイ用に MapTypeControl をカスタマイズする

編集: 現在のソリューションの jsFiddl を以下に投稿しました。

4

3 に答える 3

5

オーバーレイ マップ タイプをベース マップ タイプにバインドしたり、オーバーレイ マップ タイプに Google のマップ タイプ コントロールを使用したりするネイティブな方法はないようです。

したがって、この問題を回避するために私が最終的に行ったことは次のとおりです。 http://jsfiddle.net/lejared/720L7wu0/3/

var ReliefCtrl = {/* see fiddle */};

カスタム コントロールを作成しました (ネイティブの Google マップ コントロールのルック アンド フィールを使用)。このコントロールは、オーバーレイ マップ タイプ (Hillshading) を切り替えます。このオーバーレイ マップ タイプに適したベース マップ タイプの配列を定義できます。適切なベース マップ タイプが選択されている場合、コントロールは自動的に表示/非表示になります。

2017-02-01: フィドルを更新して、Google マップ コントロールの新しいネイティブ ルックに合わせます。

于 2012-09-04T22:09:46.010 に答える
2

あなたの質問には2つの部分がありました:

  1. 特定のマップタイプがアクティブな場合にのみカスタムオーバーレイを自動的に表示するmaptypeid_changedには、オブジェクトのイベントをリッスンする必要がありmapます。そのイベントリスナーでオーバーレイを追加/削除する必要があります。

  2. 現在、独自のオーバーレイ/マップタイプをデフォルトのマップタイプコントロールに階層的に追加する方法はありません。詳細については、この問題を参照してスターを付けてください:http ://code.google.com/p/gmaps-api-issues/issues/detail?id=2490

于 2012-08-22T18:14:18.683 に答える
1

質問 1.) ROADMAP を選択すると、特定の overlayMapType が表示され (他のモードでは非表示になります)、test.html にコピー & ペーストして、表示して楽しむことができる例を作成しました。うまくいけば、ニーズに合わせてこれを編集できます。

<!DOCTYPE html>
<html>
  <head>
    <title>Google Maps JavaScript API v3 Example: Overlay MapTypes</title>
    <link href="https://developers.google.com/maps/documentation/javascript/examples/default.css" rel="stylesheet">
    <script src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>
    <script>

      function CoordMapType(tileSize) {
        this.tileSize = tileSize;
      }

      CoordMapType.prototype.getTile = function(coord, zoom, ownerDocument) {
        var div = ownerDocument.createElement('div');
        div.innerHTML = coord;
        div.style.width = this.tileSize.width + 'px';
        div.style.height = this.tileSize.height + 'px';
        div.style.fontSize = '10';
        div.style.borderStyle = 'solid';
        div.style.borderWidth = '1px';
        div.style.borderColor = '#AAAAAA';
        return div;
      };

      var map;
      var chicago = new google.maps.LatLng(41.850033,-87.6500523);

      function initialize() {
        var mapOptions = {
    zoom: 4,
    center: new google.maps.LatLng(-33, 151),
    mapTypeControl: true,
    mapTypeControlOptions: {
      style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
    },
    zoomControl: true,
    zoomControlOptions: {
      style: google.maps.ZoomControlStyle.SMALL
    },
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }

        map = new google.maps.Map(document.getElementById('map_canvas'),
                                          mapOptions);

        // Insert this overlay map type as the first overlay map type at
        // position 0. Note that all overlay map types appear on top of
        // their parent base map.
        map.overlayMapTypes.insertAt(0, new CoordMapType(new google.maps.Size(256, 256)));

        // we check mapType when it is changing
        google.maps.event.addListener( map, "maptypeid_changed", function( evnt ) {
            if(map.mapTypeId === "roadmap") {
                // show my custom map layer - but only if its not already there
                // note: you could also check more specifily your map type here
                if(map.overlayMapTypes.getLength() == 0) {
                    map.overlayMapTypes.insertAt(0, new CoordMapType(new google.maps.Size(256, 256)));
                }
            } else {
                // if something else, remove it 
                // note: you could also check more specifily your map type here, but for now
                // we just check if something is already there
                if (map.overlayMapTypes.getLength() > 0){
                    map.overlayMapTypes.removeAt(0);
                }
            }
        });     

      }

    </script>
  </head>
  <body onload="initialize()">
    <div id="map_canvas" style="width: 640px; height: 480px;">map div</div>
  </body>
</html>

質問 2.)試してみましたが不可能でした (高度に保護されています)。代わりに Google カスタム マップ コントロールを使用してください - それは唯一のオプションのようです :(

https://developers.google.com/maps/documentation/javascript/controls#CustomControls

編集:

この例のように独自の名前を付けることができるように、独自のベースレイヤーとしてGoogleロードマップタイプを追加しようとしましたか(右上隅の選択を表示): https://google-developers.appspot.com/maps/documentation/javascript/examples /maptype-base?hl=fiそして、CoordMapType グリッド (または必要なオーバーレイ マップ) を表示する Google マップにオーバーレイ マップ (私の例のように) を追加します。このようにして、まだそのチェックボックスを取得することはできませんが、少なくとも通常の Google マップ コントローラー内で独自の選択と名前で表示できますか? 私は今、この理論をテストする時間がありません。仕事中です笑。:)

しかし、基本的には、ドロップダウンの場所を達成できます

  1. 地図(グーグルロードマップ)
  2. 私のレイヤー(オーバーレイマップがその上にあるグーグルロードマップ、またはいくつか)?

あるいは、console.log(map); を使用することもできます。だけでなく、より多くの方法を見つけようとします。

CoordMapType.prototype.name = 'My base layer';
CoordMapType.prototype.alt = 'My base layer map type';

..これがすでにベースレイヤーの選択として作成されている場合、そのチェックボックスオプションが非表示になっている可能性があります。これらのチェックボックスは常にオーバーレイ マップ選択トグルでなければなりません。

于 2012-08-22T18:28:19.977 に答える