2010-06-17 4 views
541

Довольно неожиданно для Google Maps Api. У меня есть массив данных, которые я хочу прокрутить и нанести на карту. Похоже, это довольно просто, но все многомарочные обучающие программы, которые я нашел, довольно сложны.Google Maps JS API v3 - простой пример множественного маркера

Давайте использовать массив данных с сайта Google для примера:

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 всплывал при нажатии для отображения имени.

+0

InfoBox другой вариант для карты маркера всплывающего окна (не следует путать с InfoWindow). См. [Этот ответ] (http://stackoverflow.com/a/7628522/881250) для примера InfoBox. – Donamite

ответ

961

Это самый простой я мог бы уменьшить его:

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

Скриншот:

Google Maps Multiple Markers

Существует некоторое закрытие магия происходит при прохождении обратного вызова аргумент метода addListener. Это может быть довольно сложной темой, если вы не знакомы с тем, как работают замыкания. Я хотел бы предложить проверить следующую статью Mozilla для краткого введения, если это так:

+3

Привет, Daniel, Спасибо за трюк за событие с несколькими маркерами, тот же код, который я использовал в своем приложении. Все отлично работает на «Android», «iPhone», но, похоже, оно не работает на «Blackberry 6.0».Я думаю, что он не может регистрировать событие для объектов-маркеров. Не могли бы вы дать некоторые предложения о том, что еще можно сделать в таком случае? Благодарю. – Bhupi

+0

+1. Кстати, '(marker, i)' после окончания безымянной функции означает, что вы уже вызываете ее в качестве аргументов в качестве передатчика 'marker' и' i'? Но так как это безымянность, она не должна работать без этого? Или нет? Я немного смущен. – RaphaelDDL

+4

@RaphaelDDL: Да, эти скобки необходимы, чтобы фактически вызвать безымянную функцию. Аргументы должны быть переданы из-за того, как работает JavaScript (из-за закрытия). См. Мой ответ на этот вопрос для примера и дополнительную информацию: http://stackoverflow.com/a/2670420/222908 –

11

От Google Map API samples:

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

этот ответ не включает в себя часть infoWindow – omat

+0

@omat Странно, что собственные документы Google не предполагают, что должна быть часть infoWindow. Но, тем не менее, это не работает для меня :( –

46

Вот еще один пример из множества маркеров загрузка с уникальными title и infoWindow текста. Протестировано с последними картами Google 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 with Multiple Markers

Он будет автоматически рандомизации LAT/LNG, чтобы сделать его уникальным. Этот пример будет очень полезен, если вы хотите протестировать маркеры 500, 1000, xxx и производительность.

+1

Будьте осторожны, отправляя копии и вставляя шаблоны/дословные ответы на несколько вопросов, они, как правило, помечены сообществом сообществом «spammy». Если вы делаете это, это обычно означает, что вопросы - это дубликаты, поэтому вместо этого отмечайте их как таковые. – Kev

+1

Не отвечайте на вопрос ... –

+0

Это позволит получить много всплывающих 'infoWindow' для каждого маркера и не будет скрывать другую' infoWindow', если она в данный момент показана.это действительно полезно :) – Kannika

12

This is the working example map image

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

    }); 
} 

Полный рабочий пример. Вы можете просто копировать, вставлять и использовать.

+0

Я прикрепил с этим методом массива более 100 маркеров, вы также можете .. – Anup

28

Мне показалось, что я бы назвал это здесь, поскольку он, похоже, является популярной точкой посадки для тех, кто начинает использовать API Карт Google. Несколько маркеров, отображаемых на стороне клиента, вероятно, являются падением многих характеристик приложений сопоставления. Трудно тестировать, исправлять и в некоторых случаях даже устанавливать проблему (из-за различий в реализации браузера, оборудования, доступного клиенту, мобильных устройств, список продолжается).

Самый простой способ начать решение этой проблемы - использовать решение кластеризации маркеров. Основная идея состоит в том, чтобы группировать географически похожие местоположения в группу с количеством отображаемых точек. По мере того, как пользователь приближается к карте, эти группы расширяются, чтобы показывать отдельные маркеры внизу.

Возможно, самым простым в реализации является библиотека 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> 

маркеры, вместо того, чтобы быть добавлены непосредственно к карте добавляются в массив. Затем этот массив передается в библиотеку, которая обрабатывает сложные вычисления для вас и прикрепляется к карте.

Не только эти реализации значительно увеличивают производительность на стороне клиента, но также во многих случаях приводят к более простому и менее загроможденному интерфейсу и более простому перевариванию данных в больших масштабах.

Other implementations можно получить у Google.

Надеюсь, что это поможет некоторым из тех, кто знаком с нюансами картографии.

+1

Спасибо, большая помощь! В производительности есть разница в порядке или величине, сначала создавая точки данных google.map, а затем передавая их в библиотеку сопоставления, в этом случае MarketCluster для построения. с примерно 150 000 точками данных первое сообщение от «Daniel Vassallo» заняло около 2 минут, чтобы загрузить, это 5 секунд. Спасибо, кучка «Swires»! – Waqas

+1

Я думал, что это будет хорошим местом для этого, я бы подумал, что большинство людей, впервые приземлившихся на стек, когда связаны с картами Google, - это страница, а вторая - «почему моя карта так долго загружается». – Swires

+0

Что такое yourData? – Monic

15

Асинхронный версия:

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

Что делает "(маркер, я)" внутри "google.maps.event.addListener" do? Кажется мало запутанным. –

+0

Это параметры для события addListener: - marker - объект google.maps.Marker - i - это ключ для массива местоположений, который содержит некоторую информацию для маркера – sHaDeoNeR

10

Вот еще одна версия, которую я написал, чтобы сохранить карту недвижимости, которая помещает указатель InfoWindow на фактической широты и долго маркера, в то время как временно скрывает маркер в то время как отображается инфоиндустрия.

Он также отменяет назначение стандартного «маркера» и ускоряет обработку , напрямую назначая новый маркер массиву маркеров при создании маркеров. Обратите внимание, однако, что дополнительные свойства были добавлены как к маркеру, так и к infowindow, поэтому этот подход является немного нетрадиционным ... но это я!

В этих проблемах не упоминается, что стандартная информация НЕ, размещенная на латах и ​​lng точки маркера, а скорее в верхней части изображения маркера. Для этого нужно скрывать видимость маркера, иначе API Карт снова запустит привязку infowindow обратно в верхнюю часть изображения маркера.

Ссылка на маркеры в массиве «маркеры» создается сразу после объявления маркера для любых дополнительных задач обработки, которые могут быть желательны позже (скрытие/показ, захват коордов и т. Д.). Это сохраняет дополнительный шаг назначения объекта маркера «маркеру», а затем нажимает «маркер» на массив маркеров ... много ненужной обработки в моей книге.

В любом случае, другой подход к 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); 

Вот working JSFiddle

Дополнительное примечание
Вы заметите в этом данном примере данных Google четвертое место в массиве «локаций» с номером. С учетом этого в примере, вы можете также использовать это значение для маркеров идентификатора вместо текущего значения петли, такие, что ...

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

Исходя из Daniel Vassallo's answer, вот версия, которая имеет дело с проблемой закрытия более простым способом.

С, так как все маркеры будут иметь индивидуальный InfoWindow и поскольку JavaScript не волнует, если вы добавляете дополнительные свойства объекта, все, что вам нужно сделать, это добавить InfoWindow в свойства маркера, а затем звоните .open() на InfoWindow от себя!

Edit: При наличии достаточного количества данных, то Pageload может занять много времени, так что вместо строительства InfoWindow с маркером, строительство должно происходить только тогда, когда это необходимо. Обратите внимание, что любые данные, используемые для построения InfoWindow, должны быть добавлены к маркеру в качестве объекта (data). Также обратите внимание, что после первого события click, 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); 
    }) 
} 
0

Вот почти полная функция javascript, которая позволит использовать несколько маркеров в JSONObject.

Он отображает только маркеры, которые находятся в границах карты.

Это важно, поэтому вы не делаете дополнительной работы.

Вы также можете установить ограничение на маркеры, чтобы вы не показывали экстремальное количество маркеров (если есть возможность использования в вашем использовании);

он также не отображает маркеры, если центр карты не изменился более чем на 500 метров.
Это важно, потому что если пользователь нажимает на маркер и случайно перетаскивает карту, делая это, вы не хотите, чтобы карта перезагружала маркеры.

Я привязал эту функцию к прослушивателю событий простоя для карты, поэтому маркеры будут отображаться только тогда, когда карта неактивна и будет повторно отображать маркеры после другого события.

В действии снимок экрана есть небольшое изменение в снимке экрана, показывающее больше содержимого в инфо-окне. enter image description here вставленный из pastbin.com

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

3

Принято ответ, переписанной в 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); 
    }) 
}) 
2

Добавить маркер в программе очень просто. Вам просто нужно добавить этот код:

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

следующие поля особенно важны и обычно устанавливается при создании маркера:

  • position (обязательно) задает LatLng определения начального местоположения маркер. Одним из способов получения LatLng является использование Geocoding service.
  • map (необязательно) указывает карту, по которой следует поместить маркер. Если вы не укажете карту при построении маркера, маркер будет создан, но не будет привязан к карте (или отображен). Вы можете добавить маркер позже, вызвав метод маркера setMap().

Примечание, в моем примере, поле название набора название маркера, который будет отображаться в виде всплывающей подсказки.

У вас может быть Google documenation here.


Это полный код, чтобы установить один маркер на карте. Будьте заботиться полным, вы должны заменить YOUR_API_KEY вашим google API key:

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

Этот пример дает мне следующий результат:

enter image description here


Вы можете, также, положить 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!' 
    }); 

Вы можете иметь в документации компании Google о infoWindows here.


Теперь мы можем открыть 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. 
      }); 

Примечание, вы можете иметь некоторую документацию о Listenerhere в Google Developer.


И, наконец, мы можем построить информационное окно в маркере, если пользователь нажмет на него. Это мой полный код:

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

Как правило, вы должны иметь этот результат:

Your result

+0

, можно показать только метку на маркере, я имею в виду dont хотите эту функциональность щелчка. – 2017-08-23 14:48:27

+0

Это не предмет этого вопроса. Пожалуйста, @ h36p задайте новый вопрос. –

Смежные вопросы