Javascript 过滤器和标记聚类器之间的冲突
Javascript 过滤器和标记聚类器之间的冲突,javascript,google-maps-api-3,filter,markerclusterer,Javascript,Google Maps Api 3,Filter,Markerclusterer,你好 我正在谷歌地图API v3(使用Javascript)上制作一个带有过滤器和标记聚类器的交互式地图 过滤器正在工作 Marker clusterer也在工作 但是当我把标记聚类器和过滤器放在一起时,我遇到了一些麻烦 为了让大家更了解我的问题,我在这里放置了一些屏幕: 不带任何过滤器的映射: • 过滤后: • 标记聚类器: var markerCluster = new MarkerClusterer(map, markers, {imagePath: 'https:
你好 我正在谷歌地图API v3(使用Javascript)上制作一个带有过滤器和标记聚类器的交互式地图
- 过滤器正在工作
- Marker clusterer也在工作
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 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;
}
函数filterByString(数据属性,值){
var people=[];
对于(var i=0;i
当我使用过滤器时,标记聚类器不会更新,标记会显示在地图上而不会被聚类
我尝试了所有关于堆栈溢出的解决方案,但没有一个有效
任何帮助都将不胜感激。如果有帮助的话,我可以发布部分源代码。谢谢。MarkerClusterer提供了
removeMarker
和addMarker
方法。使用数组初始化markerClusterer后,还可以根据应用程序的其余部分使用此方法(而不是仅在标记列表中添加和删除它们)
更有效的方法是清除标记并将过滤后的数组再次添加到markerClusterer,尤其是在过滤大量标记的情况下:
markerClusterer.clearMarkers();
markerClusterer.addMarkers(markers);
此外,您还可以查看
markerCluster.repaint()
方法。您的错误可能是由此引起的。我忘记了一部分有用的代码,其中包含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函数吗?
这里我放了一些屏幕
-一张图片抵得上千言万语。。。但对程序员来说不是。。。如果你需要实际的帮助,你需要提供实际的代码好的,谢谢你的帮助。我对在代码中集成这些方法有点迷茫。我用自己的过滤器编辑了一段开源代码,以便在创建自己的地图之前,用这个概念训练自己。我知道如何过滤标记,但markerCluster部分似乎更复杂。为了集成这些方法,我应该编辑所有的代码吗?或者clearMarkers和addMarkers可以很容易地集成到代码中吗?在调用filterByString
方法后,如果我看对了,您必须添加clearMarkers
和addMarkers
部分。缺少调用筛选的部分。在我看来,您的变量名有点混乱,因为markerList
不是标记对象列表,而是个人ID列表。我会尝试您的解决方案,谢谢。如果你想用我的代码查看整个项目,这里有一个链接:它可以帮助你理解是的……由于这种行为,它应该是markerClusterer缺少的更新。因为这会处理地图上标记的显示。你应该通过编辑而不是将其作为答案发布在问题中。我没有审查你的整个过滤器逻辑,但原则是这样的。1) 将所有标记放在一个数组中,并将其添加到markerClusterer中-现在它们被markerClusterer聚集并处理2)执行筛选逻辑(无论什么)并修改标记数组3)完成筛选后调用clearMarkers()
方法并将所有筛选标记添加到markerClusterer中。处理第二步的方式可能有点不同,但这是一种可能性。
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 );
}