一次放下一个标记

Posted

技术标签:

【中文标题】一次放下一个标记【英文标题】:Drop One Marker at time 【发布时间】:2014-10-08 01:59:31 【问题描述】:

我正在使用 Google Maps Api v3,我正试图在我的地图上一次放置一个标记,就像 Google Demo 但我无法让它工作,这是我的代码,所有标记都被同时删除时间。

var map;
var markers = [];

function initialize()  
    var latlng = new google.maps.LatLng(52.520816, 13.410186);

    var options = 
        zoom: 5,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    ;

    map = new google.maps.Map(document.getElementById("map-canvas"), options);


initialize();

function loadMarkers()   

    $.ajax(
       url: 'js/poi.php',
       type: 'GET',
       dataType : "json",
       success: function (data) 

            var latlngbounds = new google.maps.LatLngBounds();      


            $.each(data, function(index, point) 

                var marker = new google.maps.Marker(
                    position: new google.maps.LatLng(point.Lat, point.Lng),
                    animation: google.maps.Animation.DROP,
                    icon: 'img/marker.png'

                );


                markers.push(marker);
                latlngbounds.extend(marker.position);

            );

            var markerCluster = new MarkerClusterer(map, markers);
            map.fitBounds(latlngbounds);

        

    );


loadMarkers();

我尝试在每个标记上使用超时,但我猜 loadMarkers();总是会立即丢弃它们...

    setTimeout(function() 

        var marker = new google.maps.Marker(
            position: new google.maps.LatLng(point.Lat, point.Lng),
            animation: google.maps.Animation.DROP,
            icon: 'img/marker.png'

        );

    , point.Id * 200);

关于如何解决此问题的任何想法?

编辑: poi.php 文件列出了我的表中的所有点并像这样输出它们:

[
"Id":"1","Lat":"52.511467","Lgn":"13.447179",
"Id":"2","Lat":"52.549061","Lgn":"13.422975",
"Id":"3","Lat":"52.497622","Lgn":"13.396110",
"Id":"4","Lat":"52.517683","Lgn":"13.394393"
]

【问题讨论】:

【参考方案1】:
    在将标记添加到地图时将它们添加到聚类器中 调整边界以在添加标记时显示标记 修复了 JSON 中的拼写错误(不知道这是否有问题)
function initialize() 
    var latlng = new google.maps.LatLng(52.520816, 13.410186);

    var options = 
        zoom: 5,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    ;

    map = new google.maps.Map(document.getElementById("map-canvas"), options);
    loadMarkers();


function loadMarkers() 
    $.ajax(
        type: 'POST',
        dataType: 'json',
        url: '/echo/json/',
        data: 
            json: JSON.stringify(jsonData)
        ,
        delay: 3,
        success: function (data) 
            var markerCluster = new MarkerClusterer(map, markers);
            var latlngbounds = new google.maps.LatLngBounds();
            $.each(data, function (index, point) 
                    setTimeout(function() 
                      var marker = new google.maps.Marker(
                        position: new google.maps.LatLng(point.Lat, point.Lng),
                        animation: google.maps.Animation.DROP,
                        map: map /* don't have your custom marker
                        icon: 'img/marker.png'*/
                      );
                      markerCluster.addMarker(marker);
                      markers.push(marker);
                      // adjust the bounds to show all the markers
                      latlngbounds.extend(marker.getPosition());
                      map.fitBounds(latlngbounds);
                    , point.Id * 200);
            );
        
    );

working fiddle

【讨论】:

感谢您的代码,如果标记未聚集,则效果很好。我首先尝试仅对未聚集的标记进行动画处理,然后,如果用户单击标记组,则对其中的标记进行动画处理。我担心过多的标记动画 onStart 会减慢网站的速度。我正在使用您的 Fiddle 对此进行测试,如果我修复它,我会在这里发布 我试过了,但我不能先为非聚类标记设置动画,并且只有在用户点击它时才为聚类标记设置动画。任何帮助都会很棒。【参考方案2】:

最初使用这些值创建标记:

   var marker = new google.maps.Marker(
            position: new google.maps.LatLng(point.Lat, point.Lng),
            map: null,
            visible:false
    );

设置一个用于超时计数器的变量,并在地图缩放发生变化时始终重置此变量(强制重新聚类)

google.maps.event.addListener(map,'zoom_changed',function()
  this.set('counter',0);
)

观察标记的map_changed-事件以在先前的群集标记已从群集中删除时应用动画

google.maps.event.addListener(marker,'map_changed',function()
      var marker=this,map=this.getMap();
      //the marker has been clustered
      if(!this.getMap())     
        this.setValues(visible:false);
      
      //the marker is not a part of a cluster
      else
        //the marker has been clustered before, set visible and animation with a delay
        if(!this.getVisible())
            var counter=this.getMap().get('counter')+1;
            //set the new counter-value
            this.getMap().set('counter',counter);
            setTimeout(function()marker.setValues(animation:google.maps.Animation.DROP,
                                                    visible:true);,
                       200*counter)
        
      


);

结果:http://jsfiddle.net/doktormolle/9jaLqpfd/

【讨论】:

以上是关于一次放下一个标记的主要内容,如果未能解决你的问题,请参考以下文章

当我一个一个地放下每个标记时,如何在 Google Map V3 Marker 上添加自定义动画?

让孩子放下iPad放下手机的秘密武器!| 象妈分享会

P4299 首都

谷歌地图 API。添加标记

HDU-1754 I Hate It

装饰器标记一个方法执行不超过一次,即使被多次调用