【问题标题】:Javascript array push it (Salt n Pepa style)Javascript 数组推送它(Salt n Pepa 风格)
【发布时间】:2015-05-10 08:56:05
【问题描述】:

大家好,我在为 Google Maps API V3 添加到我的数组时需要一些帮助。

下面是我用位置标记填充地图的代码:

var geocoder;
var map;
var infowindow = null;
var addresses = [];
var theMarkers = [];

function initialize() {
    var centerMap = new google.maps.LatLng(45.3517923, 6.3101660);

    geocoder = new google.maps.Geocoder();    
    addresses.push("11111","22222","33333");

    for(i in addresses) {
          var address = addresses[i];

          geocoder.geocode( { 'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var bounds = new google.maps.LatLngBounds();

                map.setCenter(results[0].geometry.location);

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

                var tmpAddress = results[0].formatted_address;

                tmpAddress = tmpAddress.split(',');             
                theMarkers.push([tmpAddress[0], results[0].geometry.location.lat(), results[0].geometry.location.lng(), i, 'This location is ' + tmpAddress[0]]);
            } else {
                alert('Geocode was not successful for the following reason: ' + status);
            }
          });
    }

    /*theMarkers = [
        ['city1', 00.0000, -00.000000, 1, 'This is HTML Test 1'],
        ['city2', 00.00000, -00.000000000, 2, 'This is HTML Test 2'],
        ['city3', 00.00000, -00.000000, 3, 'This is HTML Test 3']
    ];*/

    var mapOptions = {
        zoom: 0,
        center: centerMap,
        panControl: false,
        zoomControl: false,
        scaleControl: false,
        streetViewControl: false,
        mapTypeControl: false
    }

    map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 
    setZoom(map, theMarkers);
    setMarkers(map, theMarkers);    

    infowindow = new google.maps.InfoWindow({
        content: "Loading..."
    });
}

function setZoom(map, markers) {
    var boundbox = new google.maps.LatLngBounds();

    for ( var i = 0; i < markers.length; i++ )
    {
      boundbox.extend(new google.maps.LatLng(markers[i][1], markers[i][2]));
    }

    map.setCenter(boundbox.getCenter());
    map.fitBounds(boundbox);
}

function setMarkers(map, markers) {
    for (var i = 0; i < markers.length; i++) {
        var site = markers[i];
        var site = markers[i];
        var siteLatLng = new google.maps.LatLng(site[1], site[2]);      
        var marker = new google.maps.Marker({
            position: siteLatLng,
            map: map,
            title: site[0],
            zIndex: site[3],
            html: site[4],
            draggable: false,
            //Markers drop on the map
            animation: google.maps.Animation.DROP
        });

        google.maps.event.addListener(marker, "click", function () {
            infowindow.setContent(this.html);
            infowindow.open(map, this);
            //marker.setAnimation(google.maps.Animation.BOUNCE);
        });
    }
}

尽管它在上面没有错误地工作,但我不再有以前在静态设置 theMarkers 时所拥有的标记周围的放大区域。

for(i in addresses) {} 中使用 theMarkers.push 时,地图如下所示:

但是当我手动制作 theMarkers 完成 for(i in addresses) {} 时:

theMarkers = [
    ['city1', 00.0000, -00.000000, 1, 'This is HTML Test 1'],
    ['city2', 00.00000, -00.000000000, 2, 'This is HTML Test 2'],
    ['city3', 00.00000, -00.000000, 3, 'This is HTML Test 3']
];

那么地图是这样的:

我需要让它在循环中完成。

【问题讨论】:

  • 我很想仅对标题进行投票,但这会滥用我的权力。 :-)
  • 地理编码器是异步的,需要在最后一个回调中设置缩放才能运行。
  • @geocodezip 介意展示一个例子吗?

标签: javascript arrays google-maps google-maps-api-3


【解决方案1】:

地理编码器是异步的,您需要在最后一个回调中设置缩放才能运行。最简单的修复,将 bounds.extend/fitBounds 移动到回调中并使边界全局化:

bounds.extend(results[0].geometry.location);
geocodedResults++;
if (geocodedResults >= (addresses.length - 1)) map.fitBounds(bounds);

更新初始化函数:

function initialize() {
    var centerMap = new google.maps.LatLng(45.3517923, 6.3101660);

    geocoder = new google.maps.Geocoder();
    addresses = ["New York, NY", "Newark, NJ", "Philadelphia, PA"];

    for (var i = 0; i < addresses.length; i++) {
        var address = addresses[i];
        geocoder.geocode({
            'address': address
        }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setCenter(results[0].geometry.location);

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

                var tmpAddress = results[0].formatted_address;

                tmpAddress = tmpAddress.split(',');
                theMarkers.push([tmpAddress[0], results[0].geometry.location.lat(), results[0].geometry.location.lng(), i, 'This location is ' + tmpAddress[0]]);
                bounds.extend(results[0].geometry.location);
                geocodedResults++;
                if (geocodedResults >= (addresses.length - 1)) map.fitBounds(bounds);
            } else {
                alert('Geocode was not successful for the following reason: ' + status);
            }
        });
    }

    var mapOptions = {
        zoom: 0,
        center: centerMap,
        panControl: false,
        zoomControl: false,
        scaleControl: false,
        streetViewControl: false,
        mapTypeControl: false
    };

    map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
    setMarkers(map, theMarkers);

    infowindow = new google.maps.InfoWindow({
        content: "Loading..."
    });
}

working fiddle

代码sn-p:

var map;
var bounds = new google.maps.LatLngBounds();
var infowindow = null;
var addresses = [];
var theMarkers = [];
var geocodedResults = 0;

function geocodeAddress(address, i) {
  geocoder.geocode({
    'address': address
  }, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      map.setCenter(results[0].geometry.location);

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

      var tmpAddress = results[0].formatted_address;

      tmpAddress = tmpAddress.split(',');
      theMarkers.push([tmpAddress[0], results[0].geometry.location.lat(), results[0].geometry.location.lng(), i, 'This location is ' + tmpAddress[0]]);
      bounds.extend(results[0].geometry.location);
      geocodedResults++;
      if (geocodedResults >= (addresses.length - 1))
        map.fitBounds(bounds);
    } else {
      alert('Geocode was not successful for the following reason: ' + status);
    }
  });
}

function initialize() {
  var centerMap = new google.maps.LatLng(45.3517923, 6.3101660);

  geocoder = new google.maps.Geocoder();
  addresses = ["New York, NY", "Newark, NJ", "Philadelphia, PA"];

  for (var i = 0; i < addresses.length; i++) {
    var address = addresses[i];
    geocodeAddress(address, i);
  }

  var mapOptions = {
    zoom: 0,
    center: centerMap,
    panControl: false,
    zoomControl: false,
    scaleControl: false,
    streetViewControl: false,
    mapTypeControl: false
  };

  map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
  // setZoom(map, theMarkers);
  setMarkers(map, theMarkers);

  infowindow = new google.maps.InfoWindow({
    content: "Loading..."
  });
}

function setZoom(map, markers) {
  var boundbox = new google.maps.LatLngBounds();

  for (var i = 0; i < markers.length; i++) {
    boundbox.extend(new google.maps.LatLng(markers[i][1], markers[i][2]));
  }

  map.setCenter(boundbox.getCenter());
  map.fitBounds(boundbox);
}

function setMarkers(map, markers) {
  for (var i = 0; i < markers.length; i++) {
    var site = markers[i];
    var siteLatLng = new google.maps.LatLng(site[1], site[2]);
    var marker = new google.maps.Marker({
      position: siteLatLng,
      map: map,
      title: site[0],
      zIndex: site[3],
      html: site[4],
      draggable: false,
      //Markers drop on the map
      animation: google.maps.Animation.DROP
    });

    google.maps.event.addListener(marker, "click", function() {
      infowindow.setContent(this.html);
      infowindow.open(map, this);
      //marker.setAnimation(google.maps.Animation.BOUNCE);
    });
  }
}
google.maps.event.addDomListener(window, 'load', initialize);
<script src="http://maps.googleapis.com/maps/api/js"></script>
<div id="map-canvas" style="height: 500px; width:500px;"></div>

【讨论】:

  • 这似乎也不起作用。它放大但(1)它不是正确的位置和(2)它不再有我的地图上的 3 个标记?控制台中没有错误。
  • 也许您可以提供一个演示该问题的小提琴。问题中提供的小提琴有效。
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多