API Google Maps v3 - Ví dụ nhiều điểm đánh dấu đơn giản


657

Khá mới với Api Google Maps. Tôi đã có một mảng dữ liệu mà tôi muốn chuyển qua và vẽ trên bản đồ. Có vẻ khá đơn giản, nhưng tất cả các hướng dẫn đa điểm mà tôi đã tìm thấy đều khá phức tạp.

Hãy sử dụng mảng dữ liệu từ trang web của google làm ví dụ:

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]
];

Tôi chỉ đơn giản muốn vẽ tất cả các điểm này và có một thông tinWindow bật lên khi nhấp vào để hiển thị tên.

Câu trả lời:


1128

Đây là cách đơn giản nhất tôi có thể giảm nó thành:

<!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>

👨💻 Edit / ngã ba trên Codepen →

MÀN HÌNH

Google Maps Nhiều điểm đánh dấu

Có một số phép thuật đóng xảy ra khi truyền đối số gọi lại cho addListenerphương thức. Đây có thể là một chủ đề khá phức tạp nếu bạn không quen với cách đóng cửa hoạt động. Tôi sẽ đề nghị kiểm tra bài viết Mozilla sau đây để giới thiệu ngắn gọn nếu đó là trường hợp:

Mozilla Dev Center: Làm việc với đóng cửa


4
@RaphaelDDL: Có, những dấu ngoặc đơn đó là cần thiết để thực sự gọi hàm không tên. Các đối số cần phải được thông qua vì cách JavaScript hoạt động (vì đóng). Xem câu trả lời của tôi cho câu hỏi này để biết ví dụ và biết thêm thông tin: stackoverflow.com/a/2670420/222908
Daniel Vassallo

Câu trả lời tốt, nhưng nó có thể được đơn giản hóa hơn nữa. Vì tất cả các điểm đánh dấu sẽ có InfoWindows riêng lẻ và vì JavaScript không quan tâm nếu bạn thêm các thuộc tính bổ sung cho một đối tượng, nên tất cả những gì bạn cần làm là thêm một InfoWindowthuộc tính .open()của Markerer và sau đó gọi InfoWindow từ chính nó. Tôi đã có thể đăng thay đổi ở đây, nhưng nó đã sửa đổi đủ lớn để tôi đăng câu trả lời của riêng mình .
Matthew Cordaro

Tại sao không sử dụng new MarkerClusterer()cho bức tượng bán thân lớn? Kiểm tra câu trả lời của ChirsSwires.
DevWL

hi @ Daniel Vassallo, tôi cũng có cùng một yêu cầu hiển thị nhiều điểm đánh dấu trong dự án góc ion của tôi. Xin hãy giúp tôi, tôi đã hỏi một câu hỏi về stackoverflow. đây là đường dẫn câu hỏi: stackoverflow.com/questions/57985967/ từ
Saif

Nó hoạt động. Cảm ơn. Làm thế nào bạn sẽ loại bỏ các điểm đánh dấu khỏi google map bởi vì bạn đang sử dụng một thể hiện của điểm đánh dấu và khởi tạo trong vòng lặp. Hãy chia sẻ suy nghĩ của bạn.
Kam Meat

59

Dưới đây là một ví dụ khác về việc đánh dấu nhiều điểm với một văn bản titlevà duy nhất infoWindow. Đã thử nghiệm với API bản đồ mới nhất 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>

Ảnh chụp màn hình của 250 Markers:

API Google.11 V3.11 với nhiều điểm đánh dấu

Nó sẽ tự động chọn ngẫu nhiên Lat / Lng để làm cho nó độc đáo. Ví dụ này sẽ rất hữu ích nếu bạn muốn kiểm tra 500, 1000, điểm đánh dấu xxx và hiệu suất.


1
Hãy cẩn thận khi đăng bản sao và dán câu trả lời soạn sẵn / nguyên văn cho nhiều câu hỏi, những câu hỏi này có xu hướng bị cộng đồng đánh dấu là "spam". Nếu bạn đang làm điều này thì điều đó thường có nghĩa là các câu hỏi là trùng lặp, vì vậy hãy gắn cờ chúng như vậy.
Kev

1
Điều này sẽ nhận được nhiều cửa sổ bật lên infoWindowcho mỗi điểm đánh dấu và sẽ không ẩn điểm khác infoWindownếu nó hiện được hiển thị. nó thực sự hữu ích :)
Kannika

@Anup, nếu bạn chỉ đọc câu hỏi và bình luận thì sẽ tốt hơn. câu hỏi là hỏi "ví dụ cho nhiều điểm đánh dấu" cho dù đó là ngẫu nhiên hay bla bla của riêng bạn.
Madan Sapkota

Một lần nữa tại sao không sử dụng new MarkerClusterer()cho bức tượng bán thân lớn? Kiểm tra câu trả lời của ChirsSwires.
DevWL

1
@DevWL, nó đã được trả lời vào năm 2013. Bạn có thể cập nhật miễn phí.
Madan Sapkota

39

Tôi nghĩ rằng tôi sẽ đặt cái này ở đây vì nó dường như là một điểm hạ cánh phổ biến cho những người bắt đầu sử dụng Google Maps API. Nhiều điểm đánh dấu được hiển thị ở phía máy khách có lẽ là sự suy giảm của nhiều ứng dụng ánh xạ hiệu năng khôn ngoan. Rất khó để đánh giá, sửa chữa và trong một số trường hợp thậm chí có vấn đề (do sự khác biệt về trình duyệt, phần cứng có sẵn cho máy khách, thiết bị di động, danh sách vẫn tiếp tục).

Cách đơn giản nhất để bắt đầu giải quyết vấn đề này là sử dụng giải pháp phân cụm đánh dấu. Ý tưởng cơ bản là nhóm các vị trí tương tự về mặt địa lý thành một nhóm với số lượng điểm được hiển thị. Khi người dùng phóng to bản đồ, các nhóm này mở rộng để hiển thị các điểm đánh dấu riêng lẻ bên dưới.

Có lẽ đơn giản nhất để thực hiện là thư viện markerclusterer . Việc triển khai cơ bản sẽ như sau (sau khi nhập thư viện):

<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>

Các điểm đánh dấu thay vì được thêm trực tiếp vào bản đồ được thêm vào một mảng. Mảng này sau đó được chuyển đến thư viện xử lý tính toán phức tạp cho bạn và được đính kèm vào bản đồ.

Những triển khai này không chỉ làm tăng hiệu suất của máy khách một cách ồ ạt mà trong nhiều trường hợp còn dẫn đến một giao diện người dùng đơn giản và ít lộn xộn hơn và tiêu hóa dữ liệu dễ dàng hơn trên quy mô lớn hơn.

Các triển khai khác có sẵn từ Google.

Hy vọng điều này hỗ trợ một số trong những người mới hơn với các sắc thái của ánh xạ.


2
Cảm ơn, một sự giúp đỡ lớn Có một sự khác biệt về thứ tự hoặc độ lớn trong hiệu suất, bằng cách tạo các điểm dữ liệu google.map trước rồi sau đó chuyển nó đến thư viện ánh xạ, trong trường hợp này là MarketCluster để vẽ đồ thị. với khoảng 150.000 điểm dữ liệu, bài đăng đầu tiên của 'Daniel Vassallo' mất khoảng 2 phút để tải, trong 5 giây này. Cảm ơn một bó 'Swires'!
Waqas

1
Tôi nghĩ rằng đây sẽ là một nơi tốt cho việc này, tôi sẽ tưởng tượng hầu hết mọi người lần đầu tiên hạ cánh trên stack khi liên quan đến bản đồ Google là trang này và thứ hai là "tại sao bản đồ của tôi mất quá nhiều thời gian để tải".
ChrisSwires

@Monic đó là bất kể tập dữ liệu của bạn là gì, nó chỉ là biến giữ chỗ.
ChrisSwires

20

Phiên bản không đồng bộ:

<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

Đây là hình ảnh bản đồ ví dụ làm việc

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();

    }); 
} 

Ví dụ làm việc đầy đủ. Bạn chỉ có thể sao chép, dán và sử dụng.


12

Từ các mẫu API của Google Map :

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
câu trả lời này không bao gồm phần thông
tinWindow

@omat Các tài liệu riêng của Google không đề xuất rằng phải có một phần thông tin. Nhưng dù sao nó cũng không hiệu quả với tôi :(
Emil Ahlbäck

11

Đây là một phiên bản khác mà tôi đã viết để lưu bất động sản bản đồ, đặt con trỏ infowindow trên lat và long thực tế của điểm đánh dấu, trong khi tạm thời ẩn điểm đánh dấu trong khi infowindow đang được hiển thị.

Nó cũng loại bỏ việc gán 'điểm đánh dấu' tiêu chuẩn và tăng tốc độ xử lý bằng cách gán trực tiếp điểm đánh dấu mới vào mảng đánh dấu trên phần tạo điểm đánh dấu. Tuy nhiên, xin lưu ý rằng các thuộc tính bổ sung đã được thêm vào cả điểm đánh dấu và thông tin, vì vậy cách tiếp cận này là một cách không thông thường ... nhưng đó là tôi!

Điều này không bao giờ được đề cập trong các câu hỏi infowindow này, rằng infowindow tiêu chuẩn KHÔNG được đặt ở lat và lng của điểm đánh dấu, mà là ở trên cùng của hình ảnh đánh dấu. Khả năng hiển thị điểm đánh dấu phải được ẩn để điều này hoạt động, nếu không, API Bản đồ sẽ đưa neo vô hướng trở lại đầu hình ảnh đánh dấu một lần nữa.

Tham chiếu đến các điểm đánh dấu trong mảng 'điểm đánh dấu' được tạo ngay lập tức khi khai báo điểm đánh dấu cho bất kỳ tác vụ xử lý bổ sung nào có thể mong muốn sau này (ẩn / hiển thị, lấy các coords, v.v ...). Điều này lưu lại bước bổ sung của việc gán đối tượng đánh dấu cho 'điểm đánh dấu', và sau đó đẩy 'điểm đánh dấu' vào mảng đánh dấu ... rất nhiều xử lý không cần thiết trong cuốn sách của tôi.

Dù sao, một sự khác biệt về infowindow, và hy vọng nó sẽ giúp thông báo và truyền cảm hứng cho bạn.

    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);

Đây là một JSFiddle hoạt động

Lưu ý bổ sung
Bạn sẽ nhận thấy trong dữ liệu ví dụ Google đã cho này, vị trí thứ tư trong mảng 'vị trí' có một số. Trong ví dụ này, bạn cũng có thể sử dụng giá trị này cho id đánh dấu thay cho giá trị vòng lặp hiện tại, sao cho ...

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

Câu trả lời được chấp nhận, viết lại trong 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

Liên kết nguồn

Liên kết demo

Mã HTML hoàn chỉnh

  • Hiển thị InfoWindow trên Click hoặc Hover.
  • Chỉ có một InfoWindow sẽ được hiển thị

nhập mô tả hình ảnh ở đây

    <!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
Cảm ơn bạn vì closeOtherInfo, tôi không thể tìm thấy một giải pháp hợp lý để làm việc với merkercluster cho đến khi bạn trả lời. :)
chris loughnane

1
Bây giờ đó là những gì tôi đang tìm kiếm. Cảm ơn người đàn ông làm việc tuyệt vời vào năm 2020
Faizan Anwer Ali Rupani

5

Thêm một điểm đánh dấu trong chương trình của bạn là rất dễ dàng. Bạn chỉ có thể thêm mã này:

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

Các trường sau đặc biệt quan trọng và thường được đặt khi bạn tạo điểm đánh dấu:

  • position(bắt buộc) chỉ định LatLng xác định vị trí ban đầu của điểm đánh dấu. Một cách để lấy LatLng là sử dụng dịch vụ Mã hóa địa lý .
  • map(tùy chọn) chỉ định Bản đồ để đặt điểm đánh dấu. Nếu bạn không chỉ định bản đồ khi xây dựng điểm đánh dấu, điểm đánh dấu được tạo nhưng không được đính kèm (hoặc hiển thị trên) bản đồ. Bạn có thể thêm điểm đánh dấu sau bằng cách gọi setMap()phương thức đánh dấu .

Lưu ý , trong ví dụ, trường tiêu đề đặt tiêu đề của người đánh dấu sẽ xuất hiện dưới dạng một chú giải công cụ.

Bạn có thể tham khảo thông tin về api của Google tại đây .


Đây là một ví dụ hoàn chỉnh để đặt một điểm đánh dấu trong bản đồ. Hãy cẩn thận, bạn phải thay thế YOUR_API_KEYbằng khóa Google API của mình :

<!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>


Bây giờ, nếu bạn muốn vẽ các điểm đánh dấu của một mảng trong bản đồ, bạn nên làm như thế này:

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]
      });
   }
}

Ví dụ này cho tôi kết quả như sau:

nhập mô tả hình ảnh ở đây


Bạn cũng có thể, thêm một thông tinWindow trong pin của bạn. Bạn chỉ cần mã này:

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!'
    });

Bạn có thể có tài liệu của Google về thông tin tại đây .


Bây giờ, chúng ta có thể mở thông tinWindow khi điểm đánh dấu là "clik" như thế này:

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.
            });

Lưu ý , bạn có thể có một số tài liệu về Listener đây trong nhà phát triển google.


Và cuối cùng, chúng ta có thể vẽ một thông tinWindow trong một điểm đánh dấu nếu người dùng nhấp vào nó. Đây là mã hoàn chỉnh của tôi:

<!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>

Thông thường, bạn nên có kết quả này:

Kết quả của bạn


4

Theo câu trả lời của Daniel Vassallo , đây là phiên bản xử lý vấn đề đóng cửa một cách đơn giản hơn.

Kể từ khi vì tất cả các dấu hiệu sẽ có một cá nhân InfoWindow và vì JavaScript không quan tâm nếu bạn thêm các thuộc tính thêm vào một đối tượng, tất cả các bạn cần làm là thêm một InfoWindow đến của Marker tính và sau đó gọi .open()vào InfoWindow từ bản thân!

Chỉnh sửa: Với đủ dữ liệu, tải trang có thể mất nhiều thời gian, vì vậy thay vì xây dựng InfoWindow bằng điểm đánh dấu, việc xây dựng chỉ diễn ra khi cần thiết. Lưu ý rằng mọi dữ liệu được sử dụng để xây dựng InfoWindow phải được thêm vào Marker dưới dạng một thuộc tính ( data). Cũng lưu ý rằng sau sự kiện nhấp chuột đầu tiên, infoWindowsẽ tồn tại như một thuộc tính của điểm đánh dấu để trình duyệt không cần phải liên tục xây dựng lại.

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

Dưới đây là một ví dụ gần như đầy đủ chức năng javascript sẽ cho phép nhiều điểm đánh dấu được xác định trong JSONObject.

Nó sẽ chỉ hiển thị các điểm đánh dấu trong giới hạn của bản đồ.

Điều này rất quan trọng để bạn không phải làm thêm.

Bạn cũng có thể đặt giới hạn cho các điểm đánh dấu để bạn không hiển thị số lượng điểm đánh dấu cực lớn (nếu có khả năng có một điều trong cách sử dụng của bạn);

nó cũng sẽ không hiển thị các điểm đánh dấu nếu trung tâm bản đồ không thay đổi hơn 500 mét.
Điều này rất quan trọng vì nếu người dùng nhấp vào điểm đánh dấu và vô tình kéo bản đồ trong khi thực hiện thì bạn không muốn bản đồ tải lại các điểm đánh dấu.

Tôi đã gắn chức năng này vào trình nghe sự kiện nhàn rỗi cho bản đồ để các điểm đánh dấu sẽ chỉ hiển thị khi bản đồ không hoạt động và sẽ hiển thị lại các điểm đánh dấu sau một sự kiện khác.

Trong ảnh chụp màn hình hành động, có một chút thay đổi trong ảnh chụp màn hình hiển thị nhiều nội dung hơn trong infowindow. nhập mô tả hình ảnh ở đây dán từ pastbin.com

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


0

Dưới đây là một ví dụ về nhiều điểm đánh dấu trong Reactjs .

nhập mô tả hình ảnh ở đây

Dưới đây là thành phần bản đồ

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,
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.