【问题标题】:Conflict between filters and marker clusterer过滤器和标记聚类器之间的冲突
【发布时间】:2017-06-09 00:29:04
【问题描述】:


嗨,

我正在使用过滤器和标记聚类器在 google maps API v3(使用 Javascript)上制作交互式地图。

  • 过滤器正在工作

  • 标记聚类器也在工作

但是当我将标记聚类器和过滤器放在一起时,我遇到了一些麻烦。

在这里我放了一些关于我的问题的屏幕以便更容易理解: 没有任何过滤器的地图: • http://prnt.sc/dzlzhk 过滤后: • http://prnt.sc/dzlzog

标记聚类器:

var markerCluster = new MarkerClusterer(map, markers, 
        {imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'});

在地图上加载标记的功能:

function loadMarkers(personList) {




    var people = ( typeof personList !== 'undefined' ) ? personList : personData;

    var j = 1; 

    for( i=0; i < people.length; i++ ) {
        var person = people[i];


        if( markerList.indexOf(person.id) !== -1 ) continue;

        var lat = person.lat,
            lng = person.lng,
            markerId = person.id;

        var infoWindow = new google.maps.InfoWindow({
            maxWidth: 400
        });

        var marker = new google.maps.Marker({
            position: new google.maps.LatLng( lat, lng ),
            title: person.nom,
            markerId: markerId,
            icon: markerLocation,
            map: map
        });

        markers[markerId] = marker;
        markerList.push(person.id);

从地图中删除标记的功能:

function removePersonMarker(id) {
    if( markers[id] ) {
        markers[id].setMap(null);
        loc = markerList.indexOf(id);
        if (loc > -1) markerList.splice(loc, 1);
        delete markers[id];
    }
}

过滤标记的功能:

function filterByString( dataProperty, value ) {
    var people = [];

    for( var i=0; i < personData.length; i++ ) {
        var person = personData[i];
        if( person[dataProperty] == value ) {
            people.push( person );
        } else {
            removePersonMarker( person.id );    
        }
    }
    return people;
}

当我使用过滤器时,标记聚类器未更新,并且标记在地图上显示而不被聚类。

我尝试了 Stack Overflow 上的所有解决方案,但都没有奏效。

感谢任何帮助。如果它可以帮助我可以发布部分源代码。谢谢。

【问题讨论】:

  • Here I put some screens - 一张图片胜过一千个字……但程序员不是……如果您需要实际帮助,您需要提供实际代码
  • 好了,完成了

标签: javascript google-maps-api-3 filter markerclusterer


【解决方案1】:

MarkerClusterer 提供removeMarker(s)addMarker(s) 方法。使用数组初始化 markerClusterer 后,您还可以使用此方法(而不是仅在标记列表中添加和删除它们),具体取决于应用程序的其余部分。

更高效的方法,尤其是在过滤大量标记时,清除标记并将过滤后的数组再次添加到 markerClusterer:

markerClusterer.clearMarkers();
markerClusterer.addMarkers(markers);

此外,您可以查看markerCluster.repaint() 方法。可能您的错误是由此引起的。

【讨论】:

  • 感谢您的帮助。我有点迷失在代码中集成这些方法。我使用自己的过滤器编辑了一个开源代码,以便在创建自己的地图之前用这个概念训练自己。我了解如何过滤标记,但 markerCluster 部分似乎更复杂。我是否应该编辑所有代码以集成这些方法?还是可以轻松地将 clearMarkers 和 addMarkers 集成到代码中?
  • 在调用 filterByString 方法后,如果我没看错的话,你必须添加 clearMarkersaddMarkers 部分。缺少调用过滤的部分。在我看来,您的变量名称有点令人困惑,因为 markerList 不是标记对象列表,而是人员 ID 列表。
  • 我会试试你的解决方案,谢谢。如果你想用我的代码查看整个项目,这里是链接:jordanj.coolpage.biz/Version%20NON-stable 它可以帮助你理解
  • 是的......由于这种行为,它应该是 markerClusterer 的缺失更新。因为这会处理地图上标记的显示。
【解决方案2】:

我忘记了一部分有用的代码,其中包含 filterByString 函数的变量:

function filterCtrl(filterType, value) {
    var results = [];

    if( isInt(value) ) {
        filter[filterType] = parseInt(value);
    } else {
        filter[filterType] = value;
    }

    for( k in filter ) {
        if( !filter.hasOwnProperty(k) && !( filter[k] !== 0 ) ) {
            loadMarkers();
            return false;
        } else if ( filter[k] !== 0 ) {
            results.push( filterMap[k]( filter[k] ) );
        } else {
            // Nothing
        }
    }

    if( filter[filterType] === 0 ) {
        results.push( personData );
    }

    if( results.length === 1 ) {
        results = results[0];
    } else {
        results = reduceArray( results );
    }

    loadMarkers( results );
}

我是否必须在此函数中添加方法( clearMarkers 和 addMarkers )而不是 filterByString 函数?

【讨论】:

  • 您应该通过编辑将其放入您的问题中,而不是将其作为答案发布。我没有审查你的整个过滤器逻辑,但原理是这样的。 1) 将所有标记放在一个数组中并将其添加到 markerClusterer - 现在它们由 markerClusterer 聚集和处理 2) 执行过滤逻辑(无论如何)并修改标记数组 3) 在完成过滤后调用 clearMarkers()方法并将所有过滤的标记添加到markerCluster。您处理第二步的方式可能会有所不同,但这是一种可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
相关资源
最近更新 更多