0

マーカーのクラスタリングにGoogleMapsUtility Library v3(http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/docs/reference.html)を使用するGoogleMapsの実装があります。それは完璧に動作します。

ただし、マーカーにinfowindowsを追加したいと思います。クラスターマーカーはそのままで正常に動作するので、それらの動作を維持したい(つまり、クリックするとズームインする)が、通常の単一マーカーをクリックすると、情報ウィンドウを表示したい。

完全なコードは次のとおりです。

var _iconCenter = new google.maps.MarkerImage('/css/img/map-marker.png',
  new google.maps.Size(38, 48),
  new google.maps.Point(0,0),
  new google.maps.Point(19, 44));

var shadow = new google.maps.MarkerImage('/css/img/map-marker-shadow.png',
  new google.maps.Size(57, 49),
  new google.maps.Point(0,0),
  new google.maps.Point(7, 44));

var _icon = '/css/img/map-marker-purple.png';
var infowindow;
var markersArray = [];
var map;
var currentPosition = 0;
var currentmarker;
var firstload = true;
var maploaded = false;
var interval = 5000;
var geocoder;

var stylez = [];


function initialize(items,loop,zoom) {
  geocoder = new google.maps.Geocoder();
  if (items.length > 0) {
    var latlng = new google.maps.LatLng(items[0].Lat, items[0].Lng);
    var myOptions = {
      zoom: zoom,
      center: latlng,
      //mapTypeControl: false,
      streetViewControl: false,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById("map"), myOptions);
    map.setOptions({styles: stylez});

    for (var i = 0; i < items.length; i++) {
      var marker = new google.maps.Marker({
        position: new google.maps.LatLng(items[i].Lat, items[i].Lng),
        title: items[i].Title,
        icon: _icon,
        shadow: shadow,
        infocontent: items[i].Description
      });
      marker.setMap(map);
      markersArray.push(marker);
    }


    //set style options for marker clusters (these are the default styles)
    mcOptions = {
      gridSize: 44
    }

    var markerCluster = new MarkerClusterer(map, markersArray, mcOptions);
    google.maps.event.addListener(map, "tilesloaded", function () {
      if(loop == true){
        SetLoop();
      }
    });

    google.maps.event.addListener(marker, "click", function () {
      alert('test');
      //infowindow.setContent('test');
      //infowindow.open(map,this);
    });

  }
}


function SetLoop() {
//This will fire everytime map loads or recenteres
  maploaded = true;
  if (firstload) {
    firstload = false;
    Recenter();
  }
}

function Recenter() {
  //If previous iteration is not loaded completely, wait to avoid errors
  //It could happen for slow internet connection
  if (maploaded) {
    maploaded = false;
  } else {
    //keep adding 1 second to interval for slow connection till page loads
    interval = interval + 1;
    setTimeout("Recenter()", interval);
    return;
  }

  if (infowindow != null && currentmarker != null) {
    //currentmarker.icon = _icon;
    currentmarker.icon = _iconCenter;
    currentmarker.setMap(map);
    infowindow.close(map, currentmarker);
  }

  markersArray[currentPosition].icon = _iconCenter;
  markersArray[currentPosition].setMap(map);
  map.setCenter(new google.maps.LatLng(markersArray[currentPosition].getPosition().lat(), markersArray[currentPosition].getPosition().lng()));

  infowindow = new google.maps.InfoWindow({
    content: markersArray[currentPosition].infocontent,
    size: new google.maps.Size(50, 50)
  });
  infowindow.open(map, markersArray[currentPosition]);
  currentmarker = markersArray[currentPosition];
  if (currentPosition >= markersArray.length - 1) {
    currentPosition = 0;
  } else {
    currentPosition++;
  }
  if (markersArray.length > 1) {
    setTimeout("Recenter()", interval);
  }
}

ご覧のとおり、デモンストレーションの目的でのみ、マーカークリックリスナーで大まかなアラートイベントを呼び出していますが、まったく発生していません。通常のマーカーをクリックしても何も起こらず、ブラウザの開発ツールコンソールにエラーはありません。マップの読み込みをリッスンしている別のイベントがあることと関係があるのではないかと思いますが、私はこれを理解している最中であり、エラーなしでデバッグ方法を知るのに苦労しています。

誰かがこれを機能させるために正しい方向に私を向けることができますか?

皆さん、ありがとう!

4

2 に答える 2

2

問題は、イベントリスナーを追加する前にマーカーをクラスター化ツールに渡すことだと思います。マーカーが作成されたらすぐにリスナーを追加してみてください。これにより、markersArrayをクラスターに渡すときに、イベントリストテナントが既にアタッチされます。だから試してみてください:

for (var i = 0; i < items.length; i++) {
      var marker = new google.maps.Marker({
        position: new google.maps.LatLng(items[i].Lat, items[i].Lng),
        title: items[i].Title,
        icon: _icon,
        shadow: shadow,
        infocontent: items[i].Description
      });
      marker.setMap(map);

      //attach the listener now, before pushing into the array
      attachListener(marker,'marker:'+i);
      markersArray.push(marker);
    }

その後:

    function attachListener(marker,content){
        google.maps.event.addListener(marker, "click", function () {
//      alert('test');
        infowindow.setContent(content);
        infowindow.open(map,this);
        });

    }
于 2012-08-15T17:24:31.717 に答える
1

マーカーにinfowindowsを使用した、(xmlファイルからの)クラスタリングの実例。

于 2012-08-15T18:04:15.637 に答える