Android Mapview:将重叠标记合并为新标记

NSj*_*nas 11 algorithm android markers android-mapview

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

Cyg*_*sX1 11

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

如果您计算出几个标记落入同一个bin(网格单元格) - 您可以对它们进行分组.如果您需要稍微更聪明的分组,您也可以检查相邻的单元格.

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

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

网格的代码:

注意 - 我来自C++世界(通过[algorithm]标签获取)所以我将坚持使用伪C++.我不知道mapview的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()
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

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