2013-11-26 2 views
-2

Я не могу понять, как добавить кластеры маркера на эту карту. Он используется с Wordpress, так что пользователь может добавлять в него местоположения с панели инструментов Wordpress. Я довольно новичок в Google API, и у меня нет успеха с любыми примерами, которые я нахожу. Любая помощь приветствуется!Как добавить кластеры маркеров в свою карту Google?

<?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(); ?> 

Некоторые

ответ

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 
}); 
} 
}); 
}; 
})(); 
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> 
Смежные вопросы