gpt4 book ai didi

安卓 map View : Merging overlapping markers into a new marker

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:55:15 24 4
gpt4 key购买 nike

所以我有一个带有很多标记的 MapView,其中大部分都集中在一英里宽的集群中。缩放时,标记重叠并且看起来只有一个。我想要实现的是在某个缩放级别将重叠标记替换为将显示标记密度的组标记,并且 onClick 将缩放以显示内部的所有标记。我知道我可以用蛮力距离测量来做到这一点,但必须有一种更有效的方法。任何人对我如何实现这一目标有任何解决方案或智能算法?

最佳答案

嗯...假设标记没有分组、分层或其他任何东西:为什么 - 在显示它们之前 - 你不创建一个特定密度的网格并将标记简单地放入网格的单元格中?

如果您随后计算出几个标记落入同一个容器(网格单元格)中 - 您可以将它们分组。如果您需要更巧妙的分组,您还可以检查相邻的单元格。

也许这听起来有点原始但是:

  • 没有 n^2 算法
  • 没有关于输入顺序的假设
  • 无需额外处理不会显示的标记

网格代码:

注意 - 我来自 C++ 世界(通过 [algorithm] 标签来到这里)所以我会坚持使用伪 C++。我不知道 map View 的 API。但如果这不能有效地翻译成您正在使用的任何语言/库,我会感到惊讶。

输入:- 标记列表- 世界坐标中的矩形查看窗口(我们当前正在查看的世界部分)

在最简单的形式中,它看起来像这样:

void draw(MarkerList mlist, View v) {

//binning:

list<Marker> grid[densityX][densityY]; //2D array with some configurable, fixed density
foreach(Marker m in mlist) {
if (m.within(v)) {
int2 binIdx;
binIdx.x=floor(densityX*(m.coord.x-v.x1)/(v.x2-v.x1));
binIdx.y=floor(densityY*(m.coord.y-v.y1)/(v.y2-v.y1));
grid[binIdx.x][binIdx.y].push(m); //just push the reference
}

//drawing:

for (int i=0; i<densityX; ++i)
for (int j=0; j<densityY; ++j) {
if (grid[i][j].size()>N) {
GroupMarker g;
g.add(grid[i][j]); //process the list of markers belonging to this cell
g.draw();
} else {
foreach (Marker m in grid[i][j])
m.draw()
}
}

}

可能出现的问题是在某些集群组中可能会出现不需要的网格拆分,从而形成两个 GroupMarkers。为了解决这个问题,您可能不仅要考虑一个网格单元格,还要考虑它在“\drawing”部分中的相邻单元格,并且 - 如果已分组 - 将相邻单元格标记为已访问。

关于安卓 map View : Merging overlapping markers into a new marker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6989524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com