问题描述
我想在地图上显示标记,其中每个标记都是一个 UserLocation
。一个 User
可以有多个 UserLocation
。
当我对标记进行聚类时,我想显示这些聚类标记的用户列表,没有重复。
例如,让我们以这 3 个附近的标记为例:
{ // Marker1
type: 'Feature',properties: {user_id : "Daniele"},geometry: { type : 'Point',coordinates : [lng0,lat0]
}
},{// Marker2
type: 'Feature',coordinates : [lng1,lat1]
}
},{// Marker3
type: 'Feature',properties: {user_id : "Roberto"},coordinates : [lng2,lat2]
}
}
当我聚集它们时,单击聚集的圆圈,我想看到“Daniele,Roberto”。 我该怎么做?
另外,我想根据聚集的不同用户的不同数量来设置圆圈的大小(在上面的例子中,应该是2)。
**更新 2
一个想法可以是构建一个不同名称的数组,然后使用 length
表达式来确定圆的大小。
反正应该是有语法错误...
clusterProperties: {
distinctNames :
['case',/*cond */ ["!",['in',['get','user_id'],['accumulated']]],/*result*/ ['concat',['concat',',']],/*default*/ ['accumulated']
]
}
解决方法
根据 documentation 你想要做这样的事情:
map.addSource(userData,{
id: 'user-locations',type: 'geojson',data: 'myuserdata.geojson',cluster: true,clusterProperties: {
names: ['concat',['concat',['get','user_id'],',']]
}
}
源中的聚类点现在将具有一个属性 names
,它将包含以逗号分隔(和以逗号结尾)的名称字符串。
另外,我想根据聚集的不同用户的不同数量来设置圆圈的大小(在上面的例子中,应该是2)
这听起来……很有挑战性。我能想到的一种方法是按照以下方式编写自定义累加器函数:
- 使函数返回一个包含两个值的数组,
[distinctNames,allNames]
其中第一个是整数,第二个是字符串。 - 如果
allNames
包含我们当前的名称,只需返回数组。 - 否则,返回一个
[distinctNames + 1,allNames + thisName]
数组。
在 Mapbox GL 表达式中像这样操作数组是可能的,但非常繁琐。您需要使用 ['literal',...]
和 ['at',...]
代码看起来像这样:
clusterProperties: {
names: ['concat',']],distinctNames: [
['case',['in','distinctNames'],['at',['accumulated'],1]
['accumulated'],['literal',['+',0],1],'distinctNames']]]
],'%','%'] // wrap user ID in some unique character so we don't accidentally find user "rob" within another user "robin" for instance.
]
}
文档中并不清楚累加器函数究竟是如何工作的,或者您如何访问当前值。他们的示例暗示它会是 ['get',<name of cluster property>]
,尽管这看起来有点奇怪。