Карты Google с несколькими маркерами [дубликаты]

Здесь - эффективное решение для быстрого создания рандомизированного массива. После рандомизации вы можете просто выбрать n -й элемент e массива, increment n и return e. Это решение имеет O (1) для получения случайного числа и O (n) для инициализации, но поскольку компромисс требует хорошего объема памяти, если n становится достаточно большим.

0
задан czmarc 7 December 2015 в 23:34
поделиться

1 ответ

Геокодер является асинхронным, когда функция обратного вызова запускает цикл, и icon_marker остается установленным последним значением в массиве (зеленый).

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

доказательство концепции fiddle

фрагмент кода :

function geocodeAddress(location, bounds, infowindow, geocoder, map) {
  var address = location[0];
  var icon_marker = location[1];
  geocoder.geocode({
    'address': address
  }, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {

      var marker = new google.maps.Marker({
        position: results[0].geometry.location,
        map: map,
        icon: icon_marker
      });

      google.maps.event.addListener(marker, 'click', function(evt) {
        infowindow.setContent(results[0].formatted_address);
        infowindow.open(map, marker);
      });

      bounds.extend(results[0].geometry.location);
      map.fitBounds(bounds);
    } else {
      alert("Geocode of " + address + " failed," + status);
    }

  });
}

function initialize() {
  var myOptions = {
    zoom: 2,
    panControl: true,
    zoomControl: false,
    mapTypeControl: false,
    streetViewControl: false,
    center: {
      lat: 0,
      lng: 0
    },
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    mapTypeControl: false,
    scrollwheel: false,
  };
  var bounds = new google.maps.LatLngBounds();
  var map = new google.maps.Map(document.getElementById("google-container"), myOptions);
  var geocoder = new google.maps.Geocoder();

  var locations = [
    ['Russia', 'http://maps.google.com/mapfiles/ms/icons/blue.png'],
    ['Japan', 'http://maps.google.com/mapfiles/ms/icons/blue.png'],
    ['London', 'http://maps.google.com/mapfiles/ms/icons/green.png'],
    ['Brazil', 'http://maps.google.com/mapfiles/ms/icons/green.png']
  ];

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

  for (i = 0; i < locations.length; i++) {
    geocodeAddress(locations[i], bounds, infowindow, geocoder, map)
  }
}
google.maps.event.addDomListener(window, 'load', initialize);
html,
body,
#google-container {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js"></script>
<div id="google-container"></div>

0
ответ дан geocodezip 15 August 2018 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: