谷歌地图标记管理器

时间:2011-12-13 13:39:09

标签: javascript google-maps google-maps-api-3 google-maps-markers

根据缩放级别显示2个不同的标记时出现问题。例如,如果缩放级别小于10则显示图标a,如果缩放级别大于10则显示图标2.我一直在看标记管理器但是我已经迷失了一点。这是我的代码:

var url = "json.api";

function initialize() {

    var myLatlng = new google.maps.LatLng(0, 0);
    var myOptions = {
        maxZoom: 16,
        zoomControl: true,
        disableDefaultUI: true,
        center: myLatlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    downloadUrl(url, function(data) {

        var j = eval('(' + response + ')');
        var jlength = j.data.hotels.length;

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

        for(i=0; i < jlength; i++) {

            var x = parseFloat(j.data.hotels[i].lat);
            var y = parseFloat(j.data.hotels[i].lon);
            var z = new google.maps.LatLng(x,y);
            var title = j.data.hotels[i].title;
            var hotel_id = j.data.hotels[i].id;
            var address = j.data.hotels[i].address;
            var star = j.data.hotels[i].star;
            var thumbnail = j.data.hotels[i].thumbnail;

            var contentstring = 'some html';

            var marker = createMarker();

            var infowindow = new google.maps.InfoWindow({
                content: contentstring
            }); 

            bounds.extend(z);

            map.fitBounds(bounds);

            //NOT SURE IF THESE ARE NEEDED  
            //  zoomChangeBoundsListener = google.maps.event.addListener(map, 'bounds_changed', function(event) {
            //  google.maps.event.removeListener(zoomChangeBoundsListener);
            //  });
            //  google.maps.event.addListener(map, 'zoom_changed', function() {  
            //  });
        };

        if (map.getZoom() == 21) {map.setZoom(16);}

        if (map.getZoom() < 12) {map.setZoom(map.getZoom()+1);}

        //alert(map.getZoom())

        function createMarker(){

            var marker = new google.maps.Marker({
                position: z,
                map: map,
                title: title,
                html: contentstring,
                icon: 'icona.png'
            });

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

如你所见,我有一个json文件,我循环获取lat和lng(和其他位),然后创建一个标记,显示我的json文件中的所有信息窗口等....我不能只是创建第二个标记函数,即createMarker2,如果缩放超过10,如何调用?...任何帮助将不胜感激。我在网上看了一些例子,但感到困惑。提前谢谢。

2 个答案:

答案 0 :(得分:1)

你有一个注释掉的部分是至关重要的。您需要侦听zoom_changed事件。检查map.getZoom()除非在此事件处理程序中,否则不会完成任何操作。

google.maps.event.addListener(map, 'zoom_changed', function() {
    // your zoom logic goes here
    var zoom = map.getZoom();
    if (zoom < 10) {
      // do something  
    } else {
      // do something else
    }
});

我将剩下的练习留给你 - 但是你可能需要将每个标记添加到一系列标记中,并迭代这些标记以有条件地打开然后打开/关闭。一个提示 - 您实际上可以向标记对象添加其他属性,以便在循环时进行检查。例如,您可以添加marker.LessThan10 = true;到标记对象。然后,在循环时,您可以在上面查找此属性并调用marker.setVisible();如适用。

答案 1 :(得分:0)

建议您通过http://www.jslint.com/运行代码 - 有几个语法错误(大多数都是;,不需要在那里)。

response来自哪里?这是代码中唯一引用它的地方:

var j = eval('(' + response + ')');

不要将createMarker函数嵌套在initialize函数中。使其独立,并将创建标记及其信息所需的数据作为参数传递给该函数。