NSj*_*nas 11 algorithm android markers android-mapview
所以我有一个带有很多标记的MapView,其中大多数都集中在英里宽的簇中.缩放时,标记重叠并且看起来只有一个.我想要实现的是在某个缩放级别用一个组标记替换重叠标记,组标记将显示标记的密度,onClick将缩放以显示内部的所有标记.我知道我可以用蛮力距离测量做到这一点,但必须有一种更有效的方法.任何人都有任何解决方案或智能算法如何实现这一目标?
Cyg*_*sX1 11
嗯...假设标记没有分组,分层或任何东西:为什么 - 在显示它们之前 - 你不创建一定密度的网格并简单地将标记分成网格的单元格?
如果您计算出几个标记落入同一个bin(网格单元格) - 您可以对它们进行分组.如果您需要稍微更聪明的分组,您也可以检查相邻的单元格.
也许听起来有点原始但是:
网格的代码:
注意 - 我来自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"部分中的邻居,并且 - 如果分组 - 将相邻单元标记为已访问.