Google Maps JS API v3-シンプルなマルチマーカーの例


657

Google Maps APIはかなり新しいものです。循環してマップにプロットしたいデータの配列があります。かなりシンプルに思えますが、私が見つけたすべてのマルチマーカーチュートリアルは非常に複雑です。

例としてグーグルのサイトからのデータ配列を使用してみましょう:

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

これらのすべてのポイントをプロットし、クリックして名前を表示するときにinfoWindowをポップアップ表示したいだけです。

回答:


1128

これは私がそれを次のように減らすことができる最も簡単なものです:

<!DOCTYPE html>
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
  <title>Google Maps Multiple Markers</title> 
  <script src="http://maps.google.com/maps/api/js?sensor=false" 
          type="text/javascript"></script>
</head> 
<body>
  <div id="map" style="width: 500px; height: 400px;"></div>

  <script type="text/javascript">
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var infowindow = new google.maps.InfoWindow();

    var marker, i;

    for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
  </script>
</body>
</html>

aコードペンで編集/フォーク→

スクリーンショット

Googleマップの複数のマーカー

addListenerメソッドにコールバック引数を渡すと、いくつかのクロージャマジックが発生します。クロージャの動作に慣れていない場合、これは非常に難しいトピックになる可能性があります。その場合は、次のMozillaの記事で簡単な紹介を確認することをお勧めします。

❯Mozilla Dev Center:クロージャーの操作


4
@RaphaelDDL:はい、名前のない関数を実際に呼び出すには括弧が必要です。JavaScriptが機能するため(クロージャーのため)、引数を渡す必要があります。例と詳細については、この質問に対する私の回答を参照してください:stackoverflow.com/a/2670420/222908
Daniel Vassallo

良い答えですが、さらに簡略化できます。すべてのマーカーには個別のInfoWindowsがあり、JavaScriptはオブジェクトに追加のプロパティを追加してもかまわないInfoWindowため、マーカーのプロパティにを追加して、.open()それ自体からInfoWindowでを呼び出すだけです。私はここに変更を投稿しましたが、変更が十分に大きかったため、自分の回答を投稿しました
Matthew Cordaro 2016年

new MarkerClusterer()大規模なパフォーマンスのバストに使用しないのはなぜですか?ChirsSwiresの回答を確認してください。
DevWL

こんにちは@ Daniel Vassallo、私も私のイオン角度プロジェクトに複数のマーカーを表示する同じ要件があります。私を助けてください、私はすでにstackoverflowについて質問しました。こちらが質問リンクです。stackoverflow.com
Saif

できます。ありがとう。マーカーの単一インスタンスを使用してループで初期化しているため、Googleマップからマーカーをどのように削除しますか。あなたの考えを共有してください。
Kamlesh

59

ここではユニークでロードする複数のマーカーの他の例であるtitleinfoWindowテキストが。最新のgoogle maps API V3.11でテストされています。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>Multiple Markers Google Maps</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
        <script src="https://maps.googleapis.com/maps/api/js?v=3.11&sensor=false" type="text/javascript"></script>
        <script type="text/javascript">
        // check DOM Ready
        $(document).ready(function() {
            // execute
            (function() {
                // map options
                var options = {
                    zoom: 5,
                    center: new google.maps.LatLng(39.909736, -98.522109), // centered US
                    mapTypeId: google.maps.MapTypeId.TERRAIN,
                    mapTypeControl: false
                };

                // init map
                var map = new google.maps.Map(document.getElementById('map_canvas'), options);

                // NY and CA sample Lat / Lng
                var southWest = new google.maps.LatLng(40.744656, -74.005966);
                var northEast = new google.maps.LatLng(34.052234, -118.243685);
                var lngSpan = northEast.lng() - southWest.lng();
                var latSpan = northEast.lat() - southWest.lat();

                // set multiple marker
                for (var i = 0; i < 250; i++) {
                    // init markers
                    var marker = new google.maps.Marker({
                        position: new google.maps.LatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random()),
                        map: map,
                        title: 'Click Me ' + i
                    });

                    // process multiple info windows
                    (function(marker, i) {
                        // add click event
                        google.maps.event.addListener(marker, 'click', function() {
                            infowindow = new google.maps.InfoWindow({
                                content: 'Hello, World!!'
                            });
                            infowindow.open(map, marker);
                        });
                    })(marker, i);
                }
            })();
        });
        </script>
    </head>
    <body>
        <div id="map_canvas" style="width: 800px; height:500px;"></div>
    </body>
</html>

250マーカーのスクリーンショット:

複数のマーカーを備えたGoogle Maps API V3.11

Lat / Lngを自動的にランダム化して一意にします。この例は、500、1000、xxxマーカーとパフォーマンスをテストする場合に非常に役立ちます。


1
複数の質問に対するボイラープレート/逐語的回答のコピーアンドペーストを投稿する場合は注意してください。これらはコミュニティによって「スパム行為」としてフラグが付けられる傾向があります。これを行っている場合、それは通常、質問が重複していることを意味するため、代わりにそのようにフラグを立てます。
Kev

1
これによりinfoWindow、マーカーごとに多くのポップアップが表示され、infoWindow現在表示されている場合は他を非表示にしません。それは本当に役に立ちます:)
Kannika

@Anup、質問を読んでコメントするだけの方がいいでしょう。問題は、「複数のマーカーの例」がランダムであるか、独自のブラブラであるかを尋ねることです。
Madan Sapkota 2015年

繰り返しますが、なぜnew MarkerClusterer()大規模なパフォーマンスバストを使用しないのですか?ChirsSwiresの回答を確認してください。
DevWL

1
@ DevWL、2013年に回答されました。更新は無料です。
Madan Sapkota

39

これは、Google Maps APIを使い始めた人にとって人気のある着陸地点のように見えるので、ここに置くと思いました。クライアント側でレンダリングされる複数のマーカーは、おそらく多くのマッピングアプリケーションのパフォーマンスの落とし穴です。ベンチマーク、修正、および場合によっては問題の確立さえ困難です(ブラウザの実装の違い、クライアント、モバイルデバイスで利用可能なハードウェア、リストが続くため)。

この問題に対処し始める最も簡単な方法は、マーカークラスタリングソリューションを使用することです。基本的な考え方は、地理的に類似した場所をグループにグループ化して、ポイントの数を表示することです。ユーザーがマップにズームインすると、これらのグループが展開して、下にある個々のマーカーが表示されます。

おそらく、最も簡単に実装できるのは、markerclustererライブラリです。基本的な実装は次のようになります(ライブラリのインポート後)。

<script type="text/javascript">
  function initialize() {
    var center = new google.maps.LatLng(37.4419, -122.1419);

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 3,
      center: center,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var markers = [];
    for (var i = 0; i < 100; i++) {
      var location = yourData.location[i];
      var latLng = new google.maps.LatLng(location.latitude,
          location.longitude);
      var marker = new google.maps.Marker({
        position: latLng
      });
      markers.push(marker);
    }
    var markerCluster = new MarkerClusterer(map, markers);
  }
  google.maps.event.addDomListener(window, 'load', initialize);
</script>

マーカーは、マップに直接追加されるのではなく、配列に追加されます。この配列は、複雑な計算を処理するライブラリに渡され、マップにアタッチされます。

これらの実装により、クライアント側のパフォーマンスが大幅に向上するだけでなく、多くの場合、UIがシンプルになり雑然としてなくなり、大規模なデータのダイジェストが容易になります。

その他の実装はGoogleから入手できます。

これがマッピングのニュアンスの新しい方を助けることを願っています。


2
ありがとう、大きな助けて!最初にgoogle.mapデータポイントを作成し、それをマッピングライブラリ(この場合は、プロットするMarketCluster)に渡すことにより、パフォーマンスにオーダーまたはマグニチュードの違いがあります。「Daniel Vassallo」による最初の投稿が約150,000データポイントでロードされるのに約2分、この5秒かかりました。たくさんの「Swires」に感謝します!
Waqas 14

1
これはこれに適した場所だと思いました。Googleマップに関連する場合、ほとんどの人が最初にスタックに着地するのはこのページだと思います。次に、「マップの読み込みに非常に時間がかかるのはなぜですか」です。
ChrisSwires 2014年

@Monicそれはあなたのデータセットが何であれ、それは単なるプレースホルダー変数です。
ChrisSwires 2015年

20

非同期バージョン:

<script type="text/javascript">
  function initialize() {
    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 10,
      center: new google.maps.LatLng(-33.92, 151.25),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var infowindow = new google.maps.InfoWindow();

    var marker, i;

    for (i = 0; i < locations.length; i++) {  
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(locations[i][1], locations[i][2]),
        map: map
      });

      google.maps.event.addListener(marker, 'click', (function(marker, i) {
        return function() {
          infowindow.setContent(locations[i][0]);
          infowindow.open(map, marker);
        }
      })(marker, i));
    }
}

function loadScript() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = 'https://maps.googleapis.com/maps/api/js?v=3.exp&' +
      'callback=initialize';
  document.body.appendChild(script);
}

window.onload = loadScript;
  </script>

15

これは実際のサンプルマップ画像です

var arr = new Array();
    function initialize() { 
        var i;  
        var Locations = [
                {
                  lat:48.856614, 
                  lon:2.3522219000000177, 
                  address:'Paris',
                  gval:'25.5',
                  aType:'Non-Commodity',
                  title:'Paris',
                  descr:'Paris'           
                },        
                    {
                  lat: 55.7512419, 
                  lon: 37.6184217,
                  address:'Moscow',
                  gval:'11.5',
                  aType:'Non-Commodity',
                  title:'Moscow',
                  descr:'Moscow Airport'              
                },     

                {
              lat:-9.481553000000002, 
              lon:147.190242, 
              address:'Port Moresby',
              gval:'1',
              aType:'Oil',
              title:'Papua New Guinea',
              descr:'Papua New Guinea 123123123'              
            },
            {
           lat:20.5200,
           lon:77.7500,
           address:'Indore',
            gval:'1',
            aType:'Oil',
            title:'Indore, India',
            descr:'Airport India'
        }
    ];

    var myOptions = {
        zoom: 2,
        center: new google.maps.LatLng(51.9000,8.4731),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById("map"), myOptions);

    var infowindow =  new google.maps.InfoWindow({
        content: ''
    });

    for (i = 0; i < Locations.length; i++) {
            size=15;        
            var img=new google.maps.MarkerImage('marker.png',           
                new google.maps.Size(size, size),
                new google.maps.Point(0,0),
                new google.maps.Point(size/2, size/2)
           );

        var marker = new google.maps.Marker({
            map: map,
            title: Locations[i].title,
            position: new google.maps.LatLng(Locations[i].lat, Locations[i].lon),           
                icon: img
        });

        bindInfoWindow(marker, map, infowindow, "<p>" + Locations[i].descr + "</p>",Locations[i].title);  

    }

}

function bindInfoWindow(marker, map, infowindow, html, Ltitle) { 
    google.maps.event.addListener(marker, 'mouseover', function() {
            infowindow.setContent(html); 
            infowindow.open(map, marker); 

    });
    google.maps.event.addListener(marker, 'mouseout', function() {
        infowindow.close();

    }); 
} 

完全に機能する例。コピーして貼り付けて使用できます。


12

GoogleマップAPIのサンプル

function initialize() {
  var myOptions = {
    zoom: 10,
    center: new google.maps.LatLng(-33.9, 151.2),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"),
                                myOptions);

  setMarkers(map, beaches);
}

/**
 * Data for the markers consisting of a name, a LatLng and a zIndex for
 * the order in which these markers should display on top of each
 * other.
 */
var beaches = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

function setMarkers(map, locations) {
  // Add markers to the map

  // Marker sizes are expressed as a Size of X,Y
  // where the origin of the image (0,0) is located
  // in the top left of the image.

  // Origins, anchor positions and coordinates of the marker
  // increase in the X direction to the right and in
  // the Y direction down.
  var image = new google.maps.MarkerImage('images/beachflag.png',
      // This marker is 20 pixels wide by 32 pixels tall.
      new google.maps.Size(20, 32),
      // The origin for this image is 0,0.
      new google.maps.Point(0,0),
      // The anchor for this image is the base of the flagpole at 0,32.
      new google.maps.Point(0, 32));
  var shadow = new google.maps.MarkerImage('images/beachflag_shadow.png',
      // The shadow image is larger in the horizontal dimension
      // while the position and offset are the same as for the main image.
      new google.maps.Size(37, 32),
      new google.maps.Point(0,0),
      new google.maps.Point(0, 32));
      // Shapes define the clickable region of the icon.
      // The type defines an HTML &lt;area&gt; element 'poly' which
      // traces out a polygon as a series of X,Y points. The final
      // coordinate closes the poly by connecting to the first
      // coordinate.
  var shape = {
      coord: [1, 1, 1, 20, 18, 20, 18 , 1],
      type: 'poly'
  };
  for (var i = 0; i < locations.length; i++) {
    var beach = locations[i];
    var myLatLng = new google.maps.LatLng(beach[1], beach[2]);
    var marker = new google.maps.Marker({
        position: myLatLng,
        map: map,
        shadow: shadow,
        icon: image,
        shape: shape,
        title: beach[0],
        zIndex: beach[3]
    });
  }
}

8
この回答にはinfoWindow部分は含まれていません
onurmatik

@omat奇妙なことに、Google自身のドキュメントでは、infoWindowパーツが必要であるとは示唆されていません。しかし、それでも私にとっては機能しません:(
EmilAhlbäck12年

11

これは、地図の不動産を節約するために私が書いた別のバージョンです。これは、情報ウィンドウのポインタが実際の緯度と経度に置かれ、情報ウィンドウが表示されている間は一時的にマーカーが非表示になります。

また、標準の「マーカー」の割り当てが不要になり、マーカーの作成時に新しいマーカーをマーカー配列に直接割り当てることで処理が高速化されます。ただし、マーカーと情報ウィンドウの両方に追加のプロパティが追加されているため、このアプローチは型破りなものですが、それは私です!

これらの情報ウィンドウの質問では、標準の情報ウィンドウがマーカーポイントの緯度と経度ではなく、マーカー画像の上部に配置されていることは決して言及されていません。これを機能させるには、マーカーの可視性を非表示にする必要があります。非表示にしないと、Maps APIが情報ウィンドウのアンカーをマーカー画像の上部に再度移動します。

'markers'配列内のマーカーへの参照は、後で必要になる可能性がある追加の処理タスク(非表示/表示、座標の取得など)のマーカー宣言と同時に作成されます。これにより、マーカーオブジェクトを「マーカー」に割り当て、「マーカー」をマーカー配列にプッシュするという追加の手順が不要になります。私の本では、多くの不要な処理が行われています。

とにかく、infowindowsの別の見方が、それがあなたに情報を与え、刺激を与えるのに役立つことを願っています。

    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];
    var map;
    var markers = [];

    function init(){
      map = new google.maps.Map(document.getElementById('map_canvas'), {
        zoom: 10,
        center: new google.maps.LatLng(-33.92, 151.25),
        mapTypeId: google.maps.MapTypeId.ROADMAP
      });

      var num_markers = locations.length;
      for (var i = 0; i < num_markers; i++) {  
        markers[i] = new google.maps.Marker({
          position: {lat:locations[i][1], lng:locations[i][2]},
          map: map,
          html: locations[i][0],
          id: i,
        });

        google.maps.event.addListener(markers[i], 'click', function(){
          var infowindow = new google.maps.InfoWindow({
            id: this.id,
            content:this.html,
            position:this.getPosition()
          });
          google.maps.event.addListenerOnce(infowindow, 'closeclick', function(){
            markers[this.id].setVisible(true);
          });
          this.setVisible(false);
          infowindow.open(map);
        });
      }
    }

google.maps.event.addDomListener(window, 'load', init);

これが動作しているJSFiddleです

追記
このGoogleのサンプルデータでは、「locations」配列の4番目に番号が付いています。この例では、現在のループ値の代わりに、マーカーIDにこの値を使用することもできます...

var num_markers = locations.length;
for (var i = 0; i < num_markers; i++) {  
  markers[i] = new google.maps.Marker({
    position: {lat:locations[i][1], lng:locations[i][2]},
    map: map,
    html: locations[i][0],
    id: locations[i][3],
  });
};

10

受け入れられた回答、ES6で書き直されました:

$(document).ready(() => {
  const mapEl = $('#our_map').get(0); // OR document.getElementById('our_map');

  // Display a map on the page
  const map = new google.maps.Map(mapEl, { mapTypeId: 'roadmap' });

  const buildings = [
    {
      title: 'London Eye, London', 
      coordinates: [51.503454, -0.119562],
      info: 'carousel'
    },
    {
      title: 'Palace of Westminster, London', 
      coordinates: [51.499633, -0.124755],
      info: 'palace'
    }
  ];

  placeBuildingsOnMap(buildings, map);
});


const placeBuildingsOnMap = (buildings, map) => {
  // Loop through our array of buildings & place each one on the map  
  const bounds = new google.maps.LatLngBounds();
  buildings.forEach((building) => {
    const position = { lat: building.coordinates[0], lng: building.coordinates[1] }
    // Stretch our bounds to the newly found marker position
    bounds.extend(position);

    const marker = new google.maps.Marker({
      position: position,
      map: map,
      title: building.title
    });

    const infoWindow = new google.maps.InfoWindow();
    // Allow each marker to have an info window
    google.maps.event.addListener(marker, 'click', () => {
      infoWindow.setContent(building.info);
      infoWindow.open(map, marker);
    })

    // Automatically center the map fitting all markers on the screen
    map.fitBounds(bounds);
  })
})

6

ソースリンク

デモリンク

完全なHTMLコード

  • クリックまたはホバーでInfoWindowを表示します。
  • 1つのInfoWindowのみが表示されます

ここに画像の説明を入力してください

    <!DOCTYPE html>
    <html>

    <head>
        <style>
            /*  <span class="metadata-marker" style="display: none;" data-region_tag="css"></span>       Set the size of the div element that contains the map */
            #map {
                height: 400px;
                /* The height is 400 pixels */
                width: 100%;
                /* The width is the width of the web page */
            }
        </style>
        <script>
            var map;
            var InforObj = [];
            var centerCords = {
                lat: -25.344,
                lng: 131.036
            };
            var markersOnMap = [{
                    placeName: "Australia (Uluru)",
                    LatLng: [{
                        lat: -25.344,
                        lng: 131.036
                    }]
                },
                {
                    placeName: "Australia (Melbourne)",
                    LatLng: [{
                        lat: -37.852086,
                        lng: 504.985963
                    }]
                },
                {
                    placeName: "Australia (Canberra)",
                    LatLng: [{
                        lat: -35.299085,
                        lng: 509.109615
                    }]
                },
                {
                    placeName: "Australia (Gold Coast)",
                    LatLng: [{
                        lat: -28.013044,
                        lng: 513.425586
                    }]
                },
                {
                    placeName: "Australia (Perth)",
                    LatLng: [{
                        lat: -31.951994,
                        lng: 475.858081
                    }]
                }
            ];

            window.onload = function () {
                initMap();
            };

            function addMarkerInfo() {
                for (var i = 0; i < markersOnMap.length; i++) {
                    var contentString = '<div id="content"><h1>' + markersOnMap[i].placeName +
                        '</h1><p>Lorem ipsum dolor sit amet, vix mutat posse suscipit id, vel ea tantas omittam detraxit.</p></div>';

                    const marker = new google.maps.Marker({
                        position: markersOnMap[i].LatLng[0],
                        map: map
                    });

                    const infowindow = new google.maps.InfoWindow({
                        content: contentString,
                        maxWidth: 200
                    });

                    marker.addListener('click', function () {
                        closeOtherInfo();
                        infowindow.open(marker.get('map'), marker);
                        InforObj[0] = infowindow;
                    });
                    // marker.addListener('mouseover', function () {
                    //     closeOtherInfo();
                    //     infowindow.open(marker.get('map'), marker);
                    //     InforObj[0] = infowindow;
                    // });
                    // marker.addListener('mouseout', function () {
                    //     closeOtherInfo();
                    //     infowindow.close();
                    //     InforObj[0] = infowindow;
                    // });
                }
            }

            function closeOtherInfo() {
                if (InforObj.length > 0) {
                    /* detach the info-window from the marker ... undocumented in the API docs */
                    InforObj[0].set("marker", null);
                    /* and close it */
                    InforObj[0].close();
                    /* blank the array */
                    InforObj.length = 0;
                }
            }

            function initMap() {
                map = new google.maps.Map(document.getElementById('map'), {
                    zoom: 4,
                    center: centerCords
                });
                addMarkerInfo();
            }
        </script>
    </head>

    <body>
        <h3>My Google Maps Demo</h3>
        <!--The div element for the map -->
        <div id="map"></div>

        <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>

    </body>

    </html>

1
closeOtherInfoおかげで、答えが出るまでmerkerclusterで動作する適切な解決策が見つかりませんでした。:)
クリス・ローナン

1
今それが私が探していたものです。おかげで男は2020年に素晴らしい仕事をします
ファイザンアンワーアリルパニ

5

プログラムにマーカーを追加するのはとても簡単です。このコードを追加するだけです。

var marker = new google.maps.Marker({
  position: myLatLng,
  map: map,
  title: 'Hello World!'
});

次のフィールドは特に重要であり、マーカーを作成するときに一般的に設定されます。

  • position(必須)マーカーの初期位置を識別するLatLngを指定します。LatLngを取得する1つの方法は、ジオコーディングサービスを使用することです。
  • map(オプション)マーカーを配置するマップを指定します。マーカーの作成時にマップを指定しない場合、マーカーは作成されますが、マップにアタッチ(または表示)されません。後でマーカーのsetMap()メソッドを呼び出して、マーカーを追加できます。

注は、一例では、タイトルフィールドがツールチップとして表示されますマーカーのタイトルを設定します。

ここで Google APIドキュメントを参照できます


これは、マップにマーカーを1つ設定する完全な例です。完全に注意してください、あなたはYOUR_API_KEYあなたのグーグルAPIキーで置き換える必要があります

<!DOCTYPE html>
<html>
<head>
   <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
   <meta charset="utf-8">
   <title>Simple markers</title>
<style>
  /* Always set the map height explicitly to define the size of the div
   * element that contains the map. */
  #map {
    height: 100%;
  }
  /* Optional: Makes the sample page fill the window. */
  html, body {
    height: 100%;
    margin: 0;
    padding: 0;
  }
</style>
</head>
<body>
 <div id="map"></div>
<script>

  function initMap() {
    var myLatLng = {lat: -25.363, lng: 131.044};

    var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 4,
      center: myLatLng
    });

    var marker = new google.maps.Marker({
      position: myLatLng,
      map: map,
      title: 'Hello World!'
    });
  }
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
</script>


ここで、配列のマーカーをマップにプロットする場合は、次のようにします。

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

function initMap() {
  var myLatLng = {lat: -33.90, lng: 151.16};

  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 10,
    center: myLatLng
    });

  var count;

  for (count = 0; count < locations.length; count++) {  
    new google.maps.Marker({
      position: new google.maps.LatLng(locations[count][1], locations[count][2]),
      map: map,
      title: locations[count][0]
      });
   }
}

この例では、次の結果が得られます。

ここに画像の説明を入力してください


ピンにinfoWindowを追加することもできます。あなたはこのコードが必要です:

var marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[count][1], locations[count][2]),
    map: map
    });

marker.info = new google.maps.InfoWindow({
    content: 'Hello World!'
    });

こちらで、infoWindowsに関するGoogleのドキュメントを入手できます


これで、マーカーが次のように「クリック」したときにinfoWindowを開くことができます。

var marker = new google.maps.Marker({
     position: new google.maps.LatLng(locations[count][1], locations[count][2]),
     map: map
     });

marker.info = new google.maps.InfoWindow({
     content: locations [count][0]
     });


google.maps.event.addListener(marker, 'click', function() {  
    // this = marker
    var marker_map = this.getMap();
    this.info.open(marker_map, this);
    // Note: If you call open() without passing a marker, the InfoWindow will use the position specified upon construction through the InfoWindowOptions object literal.
            });

注: Google開発者には、Listener ここに関するいくつかのドキュメントを用意できます。


そして最後に、ユーザーがクリックすると、マーカーにinfoWindowをプロットできます。これは私の完全なコードです:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Info windows</title>
    <style>
    /* Always set the map height explicitly to define the size of the div
    * element that contains the map. */
    #map {
        height: 100%;
    }
    /* Optional: Makes the sample page fill the window. */
    html, body {
        height: 100%;
        margin: 0;
        padding: 0;
    }
    </style>
</head>
<body>
    <div id="map"></div>
    <script>

    var locations = [
        ['Bondi Beach', -33.890542, 151.274856, 4],
        ['Coogee Beach', -33.923036, 151.259052, 5],
        ['Cronulla Beach', -34.028249, 151.157507, 3],
        ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
        ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];


    // When the user clicks the marker, an info window opens.

    function initMap() {
        var myLatLng = {lat: -33.90, lng: 151.16};

        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 10,
            center: myLatLng
            });

        var count=0;


        for (count = 0; count < locations.length; count++) {  

            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(locations[count][1], locations[count][2]),
                map: map
                });

            marker.info = new google.maps.InfoWindow({
                content: locations [count][0]
                });


            google.maps.event.addListener(marker, 'click', function() {  
                // this = marker
                var marker_map = this.getMap();
                this.info.open(marker_map, this);
                // Note: If you call open() without passing a marker, the InfoWindow will use the position specified upon construction through the InfoWindowOptions object literal.
                });
        }
    }
    </script>
    <script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
    </script>
</body>
</html>

通常、次の結果が得られます。

あなたの結果


4

Daniel Vassalloの回答に続き、こちらは閉鎖の問題をより簡単に扱うバージョンです。

すべてのマーカー以来以来、個々の必要があります情報ウィンドウを、あなたがオブジェクトに追加のプロパティを追加する場合はJavaScriptので、気にしない、すべてを行う必要がある追加情報ウィンドウをするマーカーのプロパティとその後、呼び出し.open()情報ウィンドウを自身から!

編集:十分なデータがあると、ページの読み込みに時間がかかる可能性があるため、マーカーでInfoWindowを構築するのではなく、必要な場合にのみ構築を行う必要があります。InfoWindowの作成に使用されるデータはすべて、プロパティ()としてマーカーに追加する必要がありますdata。また、最初のクリックイベントの後、はそのinfoWindowマーカーのプロパティとして存続するため、ブラウザは常に再構築する必要がないことに注意してください。

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

var map = new google.maps.Map(document.getElementById('map'), {
  center: new google.maps.LatLng(-33.92, 151.25)
});

for (i = 0; i < locations.length; i++) {  
  marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    map: map,
    data: {
      name: locations[i][0]
    }
  });
  marker.addListener('click', function() {
    if(!this.infoWindow) {
      this.infoWindow = new google.maps.InfoWindow({
        content: this.data.name;
      });
    }
    this.infoWindow.open(map,this);
  })
}

2

JSONObjectで定義された複数のマーカーを許可する、ほぼ完全なJavaScript関数の例を次に示します。

マップの境界内にあるマーカーのみが表示されます。

これは重要なので、余分な作業を行う必要はありません。

マーカーに制限を設定して、極端な量のマーカーを表示しないようにすることもできます(使用中に何かの可能性がある場合)。

また、マップの中心が500メートルを超えて変更されていない場合も、マーカーは表示されません。
ユーザーがマーカーをクリックして誤って地図をドラッグした場合、地図にマーカーを再読み込みさせたくないため、これは重要です。

この関数をマップのアイドルイベントリスナーにアタッチして、マップがアイドル状態のときにのみマーカーが表示され、別のイベントの後にマーカーが再表示されるようにしました。

アクションのスクリーンショットでは、スクリーンショットに少し変化があり、情報ウィンドウのコンテンツが増えています。 ここに画像の説明を入力してください pastbin.comから貼り付け

<script src="//pastebin.com/embed_js/uWAbRxfg"></script>


0

これはReactjsの複数のマーカーの例です。

ここに画像の説明を入力してください

以下は地図コンポーネントです

import React from 'react';
import PropTypes from 'prop-types';
import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react';

const MapContainer = (props) => {
  const [mapConfigurations, setMapConfigurations] = useState({
    showingInfoWindow: false,
    activeMarker: {},
    selectedPlace: {}
  });

  var points = [
    { lat: 42.02, lng: -77.01 },
    { lat: 42.03, lng: -77.02 },
    { lat: 41.03, lng: -77.04 },
    { lat: 42.05, lng: -77.02 }
  ]
  const onMarkerClick = (newProps, marker) => {};

  if (!props.google) {
    return <div>Loading...</div>;
  }

  return (
    <div className="custom-map-container">
      <Map
        style={{
          minWidth: '200px',
          minHeight: '140px',
          width: '100%',
          height: '100%',
          position: 'relative'
        }}
        initialCenter={{
          lat: 42.39,
          lng: -72.52
        }}
        google={props.google}
        zoom={16}
      >
        {points.map(coordinates => (
          <Marker
            position={{ lat: coordinates.lat, lng: coordinates.lng }}
            onClick={onMarkerClick}
            icon={{
              url: 'https://res.cloudinary.com/mybukka/image/upload/c_scale,r_50,w_30,h_30/v1580550858/yaiwq492u1lwuy2lb9ua.png',
            anchor: new google.maps.Point(32, 32), // eslint-disable-line
            scaledSize: new google.maps.Size(30, 30)  // eslint-disable-line
            }}
            name={name}
          />))}
        <InfoWindow
          marker={mapConfigurations.activeMarker}
          visible={mapConfigurations.showingInfoWindow}
        >
          <div>
            <h1>{mapConfigurations.selectedPlace.name}</h1>
          </div>
        </InfoWindow>
      </Map>
    </div>
  );
};

export default GoogleApiWrapper({
  apiKey: process.env.GOOGLE_API_KEY,
  v: '3'
})(MapContainer);

MapContainer.propTypes = {
  google: PropTypes.shape({}).isRequired,
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.