1

我試圖實施https://github.com/jawj/OverlappingMarkerSpiderfier來處理可能發生在同一地點的多個地圖標記。我使用下面的JavaScript從類.marker的div中獲取地圖數據並創建地圖。它運作良好,效果很好。實施Google地圖Spiderfier

function initialize() { 

function render_map($el) { 

    // var 
    var $markers = $el.find('.marker'); 

    // vars 
    var args = { 
     zoom  : 8, 
     center  : new google.maps.LatLng(42.7086815, -84.559032), 
     scrollwheel : false, 
     mapTypeId : google.maps.MapTypeId.ROADMAP 
    }; 

    // create map    
    var map = new google.maps.Map($el[0], args); 

    // add a markers reference 
    map.markers = []; 

    // add markers 
    $markers.each(function(){ 

     add_marker($(this), map); 

    }); 
    var padder = document.createElement('div'); 
    padder.style.height = '100px'; 
    padder.style.width = '100%'; 
    map.controls[google.maps.ControlPosition.TOP_CENTER].push(padder); 
    // center map 
    center_map(map); 

} 

function add_marker($marker, map) { 

    // var 
    var latlng = new google.maps.LatLng($marker.attr('data-lat'), $marker.attr('data-lng')); 

    // create marker 

    var marker = new google.maps.Marker({ 
     position : latlng, 
     map   : map 

    }); 

    // add to array 
    map.markers.push(marker); 

    // if marker contains HTML, add it to an infoWindow 
    if($marker.html()) 
    { 
     // create info window 
     var infowindow = new google.maps.InfoWindow({ 
      content  : $marker.html() 
     }); 

     // show info window when marker is clicked 
     google.maps.event.addListener(marker, 'click', function() { 

      infowindow.open(map, marker); 
      map.setCenter(marker.getPosition()); 

     }); 
    } 

}  

function center_map(map) { 

    // vars 
    var bounds = new google.maps.LatLngBounds(); 

    // loop through all markers and create bounds 
    $.each(map.markers, function(i, marker){ 

     var latlng = new google.maps.LatLng(marker.position.lat(), marker.position.lng()); 

     bounds.extend(latlng); 

    }); 

    // only 1 marker? 
    if(map.markers.length == 1) 
    { 
     // set center of map 
     map.setCenter(bounds.getCenter()); 

    } 
    else if(map.markers.length == 0) 
    { 
     // set center of map 
     map.setCenter(42.7086815, -84.559032); 


    } 
    else 
    { 
     // fit to bounds 
     map.fitBounds(bounds); 

    } 
    google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) { 
     if (this.getZoom() > 8) { 
     this.setZoom(8); 
     } 
}); 
} 

$(document).ready(function(){ 

    $('#acf-map').each(function(){ 

     render_map($(this)); 

    }); 

}); 

} 

但是,當我嘗試整合我與Spiderfier js所具有的功能時,地圖標記未顯示出來。這是我合併js的抱歉嘗試。對我如何使用Spiderfier有任何想法,但仍然從.marker div中獲取內容?

function initialize() { 

function render_map($el) { 

    // var 
    var $markers = $el.find('.marker'); 

    // vars 
    var args = { 
     zoom  : 8, 
     center  : new google.maps.LatLng(42.7086815, -84.559032), 
     scrollwheel : false, 
     mapTypeId : google.maps.MapTypeId.ROADMAP 
    }; 

    // create map    
    var map = new google.maps.Map($el[0], args); 
    var oms = new OverlappingMarkerSpiderfier(map); 
    var iw = new google.maps.InfoWindow(); 
     oms.addListener('click', function(marker, event) { 
      iw.setContent(marker.desc); 
      iw.open(map, marker); 
     }); 
    oms.addListener('spiderfy', function(markers) { 
     iw.close(); 
    }); 

    // var 
    var latlng = new google.maps.LatLng($marker.attr('data-lat'), $marker.attr('data-lng')); 

    // create marker 

    var marker = new google.maps.Marker({ 
     position : latlng, 
     map   : map 

    }); 
    marker.desc = $marker.html(); 
    oms.addMarker(marker); 


    var padder = document.createElement('div'); 
    padder.style.height = '100px'; 
    padder.style.width = '100%'; 
    map.controls[google.maps.ControlPosition.TOP_CENTER].push(padder); 
    // center map 
    center_map(map); 

} 


function center_map(map) { 

    // vars 
    var bounds = new google.maps.LatLngBounds(); 

    // loop through all markers and create bounds 
    $.each(map.markers, function(i, marker){ 

     var latlng = new google.maps.LatLng(marker.position.lat(), marker.position.lng()); 

     bounds.extend(latlng); 

    }); 

    // only 1 marker? 
    if(map.markers.length == 1) 
    { 
     // set center of map 
     map.setCenter(bounds.getCenter()); 

    } 
    else if(map.markers.length == 0) 
    { 
     // set center of map 
     map.setCenter(42.7086815, -84.559032); 


    } 
    else 
    { 
     // fit to bounds 
     map.fitBounds(bounds); 

    } 
    google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) { 
     if (this.getZoom() > 8) { 
     this.setZoom(8); 
     } 
}); 
} 


$(document).ready(function(){ 

    $('#acf-map').each(function(){ 

     render_map($(this)); 

    }); 

}); 

} 

回答

1

下面是正確集成的JavaScript,以防萬一對其他人有幫助。

function initialize() { 

/* 
* render_map 
* 
* This function will render a Google Map onto the selected jQuery element 
* 
* @type function 
* @date 8/11/2013 
* @since 4.3.0 
* 
* @param $el (jQuery element) 
* @return n/a 
*/ 

function render_map($el) { 

    // var 
    var $markers = $el.find('.marker'); 

    // vars 
    var args = { 
     zoom  : 8, 
     center  : new google.maps.LatLng(42.7086815, -84.559032), 
     scrollwheel : false, 
     mapTypeId : google.maps.MapTypeId.ROADMAP 
    }; 

    // create map    
    var map = new google.maps.Map($el[0], args); 
    var oms = new OverlappingMarkerSpiderfier(map); 
    var iw = new google.maps.InfoWindow(); 
    oms.addListener('click', function(marker, event) { 
     iw.setContent(marker.desc); 
     iw.open(map, marker); 
    }); 
    oms.addListener('spiderfy', function(markers) { 
     iw.close(); 
    }); 

    $markers.each(function(index, item) { 
     // create latlng 
     var latlng = new google.maps.LatLng($(item).attr('data-lat'), $(item).attr('data-lng')); 
     // create marker 
     var iconBase = '/images/'; 
     var marker = new google.maps.Marker({ 
      position : latlng, 
      map   : map, 
      icon: iconBase + 'marker.png' 
     }); 
     marker.desc = $(item).html(); 
     oms.addMarker(marker); 
    }); 

    var padder = document.createElement('div'); 
    padder.style.height = '100px'; 
    padder.style.width = '100%'; 
    map.controls[google.maps.ControlPosition.TOP_CENTER].push(padder); 

    // center map 
    center_map(map); 
} 



/* 
* center_map 
* 
* This function will center the map, showing all markers attached to this map 
* 
* @type function 
* @date 8/11/2013 
* @since 4.3.0 
* 
* @param map (Google Map object) 
* @return n/a 
*/ 

function center_map(map) { 

    // vars 
    var bounds = new google.maps.LatLngBounds(); 
    // loop through all markers and create bounds 

    $.each(map.markers, function(i, marker){ 
     var latlng = new google.maps.LatLng(marker.position.lat(), marker.position.lng()); 
     bounds.extend(latlng); 
    }); 

    // only 1 marker? 
    if(map.markers.length == 1) 
    { 
     // set center of map 
     map.setCenter(bounds.getCenter()); 

    } 
    else if(map.markers.length == 0) 
    { 
     // set center of map 
     map.setCenter(42.7086815, -84.559032); 


    } 
    else 
    { 
     // fit to bounds 
     map.fitBounds(bounds); 

    } 
    google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) { 
     if (this.getZoom() > 8) { 
     this.setZoom(8); 
     } 
    }); 


} 

/* 
* document ready 
* 
* This function will render each map when the document is ready (page has loaded) 
* 
* @type function 
* @date 8/11/2013 
* @since 5.0.0 
* 
* @param n/a 
* @return n/a 
*/ 

$(document).ready(function(){ 

    $('#acf-map').each(function(){ 

     render_map($(this)); 

    }); 

}); 

}