地图上有大量标记的问题
Posted
技术标签:
【中文标题】地图上有大量标记的问题【英文标题】:Problem with large number of markers on the map 【发布时间】:2011-06-10 06:05:08 【问题描述】:我正在开发一个已经存在于 iPhone 上的 android 应用。
在应用程序中,有一个地图活动(我数过),四组中约有 800 个标记,由四种不同颜色的可绘制标记。每个组都可以打开或关闭。关于我在列表中的标记的信息。我为每个组创建一个 mapOverlay,然后将该叠加层附加到地图上。我坚信编码部分我做得很好。但无论如何我都会附上我的代码......
问题是,我的 Nexus One 无法处理带有所有这些标记的地图。仅绘制 500 个标记大约需要 15 秒。然后当全部绘制时,地图不是很平滑。缩放和导航有点困难。可以做,但是经验不好,想看看那里能不能做点什么。我知道如果我避免 String > Double 转换,我可以节省一些时间,但我怀疑这会很重要。
iPhone 显示所有这些标记似乎没有问题。显示所有这些大约需要 1-2 秒,并且缩放和平移还不错。减速很明显,但仍然可以接受。我个人认为画所有这些标记不好,但是应用程序是由其他人设计的,我不应该做任何大的改变。
我不知道在这里做什么。看来我将不得不提出不同的功能,如果已知,可能使用 GPS 位置,并仅在某个半径内绘制标记,或者,如果位置未知,则使用屏幕中心(地图)并在其周围绘制标记。如果我做出这些改变,我必须向我的老板做出合理的解释。
如果有人有任何 idas,我将不胜感激。
还有代码:
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.pin_blue);
drawable = this.getResources().getDrawable(R.drawable.pin_blue);
ArrList = appState.GetSleepArrList();
ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable, this);
...
...
for (int m = 0; m < ArrList.size(); m++)
tName = ArrList.get(m).get("name").toString();
tId = ArrList.get(m).get("id").toString();
tLat = ArrList.get(m).get("lat").toString();;
tLng = ArrList.get(m).get("lng").toString();;
try
lat = Double.parseDouble(tLat);
lng = Double.parseDouble(tLng);
p1 = new GeoPoint(
(int) (lat * 1E6),
(int) (lng * 1E6));
OverlayItem overlayitem = new OverlayItem(p1, tName, tId);
itemizedoverlay.addOverlay(overlayitem);
catch (NumberFormatException e)
Log.d(TAG, "NumberFormatException" + e);
mapOverlays.add(itemizedoverlay);
mapView.postInvalidate();
................................
public class ItemizedOverlay extends ItemizedOverlay<OverlayItem>
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
private Context mContext;
public HelloItemizedOverlay(Drawable defaultMarker, Context context)
super(boundCenterBottom(defaultMarker));
mContext = context;
public void addOverlay(OverlayItem overlay)
mOverlays.add(overlay);
populate();
@Override
protected OverlayItem createItem(int i)
return mOverlays.get(i);
@Override
public int size()
return mOverlays.size();
@Override
protected boolean onTap(int index)
final OverlayItem item = mOverlays.get(index);
... EACH MARKER WILL HAVE ONCLICK EVENT THAT WILL PRODUCE CLICABLE
... BALOON WITH MARKER'S NAME.
return true;
【问题讨论】:
公平地说,我还没有阅读您的代码,但是是的,我使用了自己的路线简化算法。我必须绘制大约 1379 个地标,然后将其减少到 65 个。如果您有兴趣,我很乐意解释算法,但由于我们不在这个网站上做作业,我不能给您“teh-codez”:) 在这个论坛的某个地方,我读到 ItemizedOverlay 是为几十个项目设计的。如果有更多的切换到覆盖可能是必要的。我可以确认。两个拥有超过 1000 个 ItemizedOverlays 的应用确实需要一分钟左右的时间来绘制。更改为叠加后,它总是在 2-4 秒内。 Reno,你能解释一下你的优化算法吗?所有这些标记都没有使用地图。它太慢而且太杂乱了。 【参考方案1】:有两种方法可以简化此路线。
1) 如果你得到了所有点的标题。您可以保持航向公差,例如point A and B
之间的航向差异是否为0.5
只需从 A 到 B 画一条线并忽略它们之间的点。
2) 如果您没有标题。做一个三角形,如图所示。如果 h 在您的限制之间,请跳过其间的点并从A to B
画一条线
您也可以使用其他一些route simplification algorithms。
另见:
路线简化 - Douglas Puecker Algorithm
【讨论】:
【参考方案2】:嗯。事实证明,每次添加标记后我都会调用 populate() 。我从 addOverlay() 方法中取出 populate() 并在循环完成后调用它。所有标记现在几乎立即显示。现在唯一的问题是地图在较低缩放时非常无响应(一次显示很多标记)。我看不到解决方案,除非我弄清楚如何在缩小地图时减少地图上的标记数量......考虑以某种方式对它们进行分组......目前正在处理这个......
【讨论】:
这里没有提到过:***.com/questions/2848189/… ????????? .....与其咆哮,你可以尝试那里提到的内容......无论如何......【参考方案3】:我在地图上加载多个标记时遇到了同样的问题,但我在加载标记和显示 map.first 显示地图时延迟了一些,延迟后将加载所有标记。在某种程度上加载速度会更快。
【讨论】:
以上是关于地图上有大量标记的问题的主要内容,如果未能解决你的问题,请参考以下文章
setIcon() 更改图标但不更改具有大量标记的地图上的可寻址 DOM