如何将Marker Clusters添加到我的Google Map?

时间:2013-11-26 17:42:04

标签: wordpress google-maps google-maps-api-3 markerclusterer

我无法弄清楚如何将Marker Clusters添加到此地图中。它与Wordpress一起使用,因此用户可以从Wordpress仪表板向其添加位置。我对Google API很陌生,而且我没有找到任何我找到的例子。任何帮助表示赞赏!

<?php // Index template
get_header(); ?>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<div class="twelve column">
        <?php if (have_posts()) : while (have_posts()) : the_post(); ?>

            <div class="intro">
                <?php the_excerpt(); ?>
                <hr>
            </div>

                <?php the_content(); ?>

                <header class="clearfix"></header>
                        <div id="mapcanvas"></div>
                                <?php
                                // For creating multiple, customized loops.
                                // http://codex.wordpress.org/Class_Reference/WP_Query
                                $custom_query = new WP_Query('post_type=locations'); // exclude category 9
                                while($custom_query->have_posts()) : $custom_query->the_post(); ?>
                            s       <?php if(get_field('link')): ?>
                                      <div>
                                        <?php while(has_sub_field('link')): ?>
                                          <div>
                                              <p><?php the_sub_field('url'); ?></p>
                                          </div>
                                        <?php endwhile; ?>
                                      </div>
                                    <?php endif; ?>
                                <?php endwhile; ?>
                                <?php wp_reset_postdata(); // reset the query ?>

                                <?php
                                function get_single_term($post_id, $taxonomy)
                                {
                                  $terms = wp_get_object_terms($post_id, $taxonomy);
                                  if(!is_wp_error($terms)) {
                                    return '<a href="'.get_term_link($terms[0]->slug, $taxonomy).'">'.$terms[0]->name.'</a>';
                                  }
                                }

                                $i = 0;

                                // For creating multiple, customized loops.
                                // http://codex.wordpress.org/Class_Reference/WP_Query
                                    $custom_query = new WP_Query('post_type=location&posts_per_page=-1');
                                    while($custom_query->have_posts()) : $custom_query->the_post();

                                      $title = get_the_title(); // Location title
                                      $map   = get_field('location'); // ACF location contains address and coordinates
                                      $terms = strip_tags( get_the_term_list( $post->ID, 'distributors', '', ' & ' )); // Get distributor terms and rm links
                                      $info  = '<strong>' . $title . '</strong><br>' . $map['address']; // Info window content
                                      $link = get_field('link');
                                      if($link){
                                        $info .= '<br><a href="http://'. $link .'">'. $link .'</a>';
                                      }
                                      $location[$i][0] = $title; // Store the post title
                                      $location[$i][1] = $map['coordinates']; // Store the ACF coordinates
                                      $location[$i][2] = json_encode($info); // Store info window content
                                      $location[$i][3] = strip_tags( get_single_term( $post->ID, 'distributors' )); // Get first term for marker icon

                                      $i ++;
                                    endwhile; ?>
                                    <?php wp_reset_postdata(); // reset the query ?>

                                <script>
                                  var geocoder;
                                  var map;
                                $(function initialize() {
                                  geocoder = new google.maps.Geocoder();
                                  // Center map on our main location
                                  var myLatLng = new google.maps.LatLng(41.583013,-93.63701500000002);
                                  var bounds = new google.maps.LatLngBounds();

                                  // https://developers.google.com/maps/documentation/javascript/styling
                                  // Create an array of styles.
                                  var styles = [
                                    {
                                      stylers: [
                                        { saturation: -99.9 }
                                      ]
                                    }
                                  ];

                                  // Create a new StyledMapType object, passing it the array of styles,
                                  // as well as the name to be displayed on the map type control.
                                  var styledMap = new google.maps.StyledMapType(styles, {name: 'exile'});

                                  // Create a map object, and include the MapTypeId to add
                                  // to the map type control.
                                  var mapOptions = {
                                    mapTypeId: 'roadmap',
                                    center: myLatLng,
                                    zoom: 14,
                                    disableDefaultUI: false,
                                    scrollwheel: true,
                                    draggable: true
                                  };
                                  // Display a map on the page
                                  map = new google.maps.Map(document.getElementById("mapcanvas"), mapOptions);
                                  map.setTilt(45);

                                  //Associate the styled map with the MapTypeId and set it to display.
                                  map.mapTypes.set('exile', styledMap);
                                  map.setMapTypeId('exile');

                                // Marker icons
                                  typeObject = {
                                    "Others" : {
                                      "icon" : new google.maps.MarkerImage('http://exilebrewing.com/site/img/beer-mug.png', new google.maps.Size(18,26), new google.maps.Point(0,0), new google.maps.Point(9,26)),
                                      "shadow" : new google.maps.MarkerImage('http://maps.google.com/mapfiles/shadow50.png', new google.maps.Size(40,34))
                                    }
                                  }

                                  // http://wrightshq.com/playground/placing-multiple-markers-on-a-google-map-using-api-3/
                                  // Multiple Markers
                                  var markers = [
                                    ["Exile Brewing Co", 41.583013,-93.63701500000002,"Others"],
                                    <?php
                                    if (count($location)>0) {
                                      foreach ($location as $key => $value){
                                        if ($key < (count($location)-1)){
                                          echo '["' . $location[$key][0] . '",' . $location[$key][1] . ',"' . $location[$key][3] . '"], ' . "\n";
                                        } else {
                                          echo '["' . $location[$key][0] . '",' . $location[$key][1] . ',"' . $location[$key][3] . '"]';
                                        }
                                      }
                                    }
                                    ?>
                                  ];

                                  // Info Window Content
                                  var infoWindowContent = [
                                    ["<strong>Exile Brewing Co.</strong><br>1514 Walnut Street, Des Moines"],
                                    <?php
                                    if (count($location)>0) {
                                      foreach ($location as $key => $value){
                                        if ($key < (count($location)-1)) {
                                          echo '[' . $location[$key][2] . '], ' . "\n";
                                        } else {
                                          echo '[' . $location[$key][2] . ']';
                                        }
                                      }
                                    }
                                    ?>
                                  ];

                                  // Display multiple markers on a map
                                  var infoWindow = new google.maps.InfoWindow(), marker, i;

                                  // Loop through our array of markers & place each one on the map
                                  for( i = 0; i < markers.length; i++ ) {
                                    var position = new google.maps.LatLng(markers[i][1], markers[i][2]); // ACF coordinates
                                    var icon = typeObject[markers[i][3]]['icon'];
                                    var shadow = typeObject[markers[i][3]]['shadow'];
                                    bounds.extend(position);
                                    marker = new google.maps.Marker({
                                      position: position,
                                      map: map,
                                      title: markers[i][0],
                                      icon: icon,
                                      shadow: shadow
                                    });

                                    // Allow each marker to have an info window
                                    google.maps.event.addListener(marker, 'click', (function(marker, i) {
                                      return function() {
                                        infoWindow.setContent(infoWindowContent[i][0]);
                                        infoWindow.open(map, marker);
                                      }
                                    })(marker, i));

                                    // Automatically center the map fitting all markers on the screen
                                    //map.fitBounds(bounds);
                                  }
                                  function codeAddress() {
                                  var address = document.getElementById('address').value;
                                  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
                                      });
                                    } else {
                                      alert('Geocode was not successful for the following reason: ' + status);
                                    }
                                  });
                                }
                                  // Override our map zoom level once our fitBounds function runs (Make sure it only runs once)
                                  var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) {
                                    this.setZoom(15);
                                    google.maps.event.removeListener(boundsListener);
                                  });

                                });
                                </script>
                                  <div id="panel">
                                    <input id="address" type="textbox" value="Sydney, NSW">
                                    <input type="button" value="Geocode" onclick="codeAddress()">
                                  </div>
                                <div id="map-canvas"></div>


                <footer class="clearfix"></footer>
    <?php endwhile;?>
    <?php endif; ?>
    </div>
</div>

<?php get_footer(); ?>

一些

2 个答案:

答案 0 :(得分:0)

可以有三种标记聚类如下

基于网格的群集 基于网格的聚类可能是聚类标记的最常用方法。它会将地图划分为网格,并将每个方块内的所有标记分组为一个群集。虽然它是一种有效的技术,但它有一些明显的局限性,因为它会导致不必要的结果例如,两个非常靠近但在单独的正方形中的标记将不会被分组到同一个集群中。

基于距离的群集 该技术查看每个单独的标记并检查它是否在其他标记附近。如果它足够接近另一个标记,则它们中的两个将被分组为一个簇。 基于距离的聚类也有其缺点。由于群集将随机出现 根据集群形成的位置,它们可能对用户没有意义。

区域群集 第三种技术是区域聚类。这意味着您定义了不同的地理区域,例如县或州。每个区域中的所有标记将被分组为一个簇。您还可以定义群集将在哪个缩放级别分解为单独的标记(或较小的群集)。此技术的优点是您可以创建对用户更有意义的集群。缺点是它需要更多的努力,并且不能像其他集群技术那样容易自动化。

示例 显示完整的代码。当您运行此页面时,它将随机添加100个标记 地图可见部分的位置。如果您想尝试添加不同数量的标记,只需更改for循环中的数字。

(function() {
window.onload = function(){
// Creating a map
var options = {
zoom: 3,
center: new google.maps.LatLng(37.09, -95.71),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map'), options);
google.maps.event.addListenerOnce(map, 'bounds_changed', function() {
// Getting the boundaries of the map
var bounds = map.getBounds();
// Getting the corners of the map
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
// Calculating the distance from the top to the bottom of the map
var latSpan = northEast.lat() - southWest.lat();
// Calculating the distance from side to side
var lngSpan = northEast.lng() - southWest.lng();
// Creating a loop
for (var i = 0; i < 100; i++) {
// Creating a random position
var lat = southWest.lat() + latSpan * Math.random();
var lng = southWest.lng() + lngSpan * Math.random();
var latlng = new google.maps.LatLng(lat, lng);
// Adding a marker to the map
new google.maps.Marker({
position: latlng,
map: map
});
}
});
};
})();

答案 1 :(得分:0)

试试这个

<script type="text/javascript">
function initialize() {
  var myLatlng = new google.maps.LatLng(13.696516,-89.208765);
  var myOptions = {
    zoom: 17,
    center: myLatlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  var contentString = '<h1>Aditivos de El salvador</h1><p>33 Av. Sur #661, Colonia Flor Blanca, San Salvador El Salvador.</p>';

  var infowindow = new google.maps.InfoWindow({
    content: contentString
    });
  var image = '<?php echo bloginfo('template_url'); ?>/images/iconmapa.png';
  var beachMarker = new google.maps.Marker({
      position: myLatlng,
      map: map,
      icon: image
  });
  google.maps.event.addListener(beachMarker, 'click', function() {
  infowindow.open(map,beachMarker);
  });
}
</script>