top of page

GoogleMap で作成した商業施設ラベル無しの白地図に任意のマーカーとラベルを配置する方法

前回ご紹介した、「GoogleMap で商業施設等のアイコンや表示ラベルがない白地図を作る方法」で作成したマップに、任意で指定した座標にラベルとマーカーを配置する方法をご説明します。

まずは前回の確認から。


初期状態の新宿駅近辺のGoogle map では商業施設や駅名などが所狭しと表示されています。


前回はGoogle Cloud Platform」を使って以下のようなコードで、商業施設や景観、駅などを非表示にしました。

<!DOCTYPE html>
<html>
  <head>
    <title>Custom Map</title>
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSy*********pwm5A0"></script> //Keyは取得した値
    <script>
      function initMap() {
        var map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: 35.6905, lng: 139.6995},    //参照したい場所の座標
          zoom: 15,						       //縮尺度
          styles: [
            {
              featureType: 'poi',
              stylers: [{visibility: 'off'}] // 関心のある場所を非表示
            },
            {
              featureType: 'landscape',
              stylers: [{visibility: 'off'}] // 景観を非表示
            },
            {
              featureType: 'transit.station',
              stylers: [{visibility: 'off'}] // 交通機関の駅を非表示にする
            },
          ]
        });
      }
    </script>
  </head>
  <body onload="initMap()">
    <div id="map" style="height: 500px; width: 100%;"></div>//高さ、幅指定
  </body>
</html>

下の図の様に路線名、道路名などのラベルだけが残りました。

今回はこの施設名がない地図の任意の場所に、施設名のラベルとマーカーを表示する方法をご説明します。

Javascriptの繰り返し文を使って、指定した座標にテキストとマーカーを追加、テキスト周辺に枠を作成、スタイルシートでラベルの様に見せています。

<!DOCTYPE html>
<html>
  <head>
    <title>Custom Map with Labels and Markers</title>
 	<style>     /*装飾指定部分*/
      #map {
        height: 500px;  
        width: 100%;
      }
      .custom-label {
        background-color: white;          /*ラベル背景色*/
        border: 1px solid black;          /*ラベル文字色*/
        padding: 5px;                     /*ラベル内余白*/
        position: absolute;
        transform: translate(-50%, 0);    /*ラベル位置指定*/
      }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSy*********pwm5A0"></script>
    <script>
      function initMap() {
        // 地図の初期設定を行う
        var map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: 35.6905, lng: 139.6995}, // 中心の緯度と経度を設定
          zoom: 15, // ズームレベルを設定
          styles: [
            {
              featureType: 'poi',
              stylers: [{visibility: 'off'}] // ビジネスのポイントを非表示にする
            },
            {
              featureType: 'landscape',
              stylers: [{visibility: 'off'}] // 景観を非表示にする
            },
            {
              featureType: 'transit.station',
              stylers: [{visibility: 'off'}] // 交通機関の駅を非表示にする
            },
          ]
        });

        // ラベルとマーカーの情報を含む場所の配列
        var locations = [
          {lat: 35.6895, lng: 139.6917, label: '東京都庁'},
          {lat: 35.6854, lng: 139.7099, label: '新宿御苑'},
        ];

        // 各場所に対してマーカーとラベルを追加する
        locations.forEach(function(location) {
          // マーカーを作成し、地図に追加
          var marker = new google.maps.Marker({
            position: {lat: location.lat, lng: location.lng},
            map: map,
            title: location.label // マーカーにラベルを設定
          });

          // ラベルのためのカスタムHTML要素を作成
          var labelDiv = document.createElement('div');
          labelDiv.className = 'custom-label';
          labelDiv.innerHTML = location.label;

          // カスタムオーバーレイを作成
          var customLabel = new google.maps.OverlayView();
          customLabel.onAdd = function() {
            // オーバーレイが追加されたときに呼ばれる
            var panes = this.getPanes();
            panes.overlayLayer.appendChild(labelDiv); // ラベルをオーバーレイレイヤーに追加
          };

          customLabel.draw = function() {
            // オーバーレイの描画時に呼ばれる
            var point = this.getProjection().fromLatLngToDivPixel(marker.getPosition());
            if (point) {
              labelDiv.style.left = point.x + 'px'; // ラベルの左位置を設定
              labelDiv.style.top = (point.y + 20) + 'px'; // ラベルの上位置を設定(マーカーの下に配置)
            }
          };

          customLabel.onRemove = function() {
            // オーバーレイが削除されたときに呼ばれる
            if (labelDiv.parentElement) {
              labelDiv.parentElement.removeChild(labelDiv); // ラベルを削除
            }
          };

          // カスタムオーバーレイを地図に設定
          customLabel.setMap(map);
        });
      }
    </script>
  </head>
  <body onload="initMap()">
    <div id="map"></div>
  </body>
</html>

ちょっと長いコードになりましたが、テンプレートにしておけば毎回流用できそうです。

上のサンプルでは「東京都庁」と「新宿御苑」のラベルを作りましたが、いくつでも対応可能です。


 

ファイブボックスでは、ちょっとしたお困りごとやご質問、スクラッチやUnityの個別指導のオンラインレッスンも行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

Comments


bottom of page