【问题标题】:Show or hide markers depends on zoom level显示或隐藏标记取决于缩放级别
【发布时间】:2013-01-31 08:58:35
【问题描述】:

我在地图上画了很多标记,当它们靠近时,它们会相互重叠。所以我想在小缩放时隐藏一些标记,并在用户缩放地图时显示更多标记。喜欢更多的放大,更多的标记。这是活动和创建标记的示例代码,如您所见,我正在使用 google maps android api v2:

public class MainActivity extends FragmentActivity
{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    map.getUiSettings().setMyLocationButtonEnabled(true);
    createMarkers(map);
}

private void createMarkers(GoogleMap map) {
    double initLat = 48.462740;
    double initLng = 35.039572;
    for(float i = 0; i < 2; i+=0.2) {
        LatLng pos = new LatLng(initLat + i,initLng);
        map.addMarker(new MarkerOptions()
                .position(pos)
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
    }
    for(float i = 0; i < 2; i+=0.2) {
        LatLng pos = new LatLng(initLat, initLng + i);
        map.addMarker(new MarkerOptions()
                .position(pos)
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
    }
}

这对我来说听起来像是典型的任务,但我仍然没有找到可行的解决方案。我已经阅读了这篇文章https://developers.google.com/maps/articles/toomanymarkers,但我不知道如何在 android 上实现它。有没有人有一些工作代码可以做到这一点?

【问题讨论】:

    标签: android google-maps-android-api-2


    【解决方案1】:

    这是我对这个问题的解决方案:https://github.com/Bersh/MarkersCluster

    也许这不是最好的解决方案,但它对我有用。希望对你有用。

    【讨论】:

    • 我现在正在尝试您的项目,但只是一个想法 - 您可能希望从清单文件中删除 API 密钥,因为它可能链接回您的 Google 帐户...
    • 干得好!该演示对我来说效果很好。我将尝试将它集成到我现有的具有数千个标记的应用程序中,看看它在集群中的表现如何:) 对你来说只有一个问题 - 当你集群时你传递的“间隔”......那些单位是什么在?公里?
    • "interval" 需要屏幕上标记之间的距离(以像素为单位)
    • 我在我的应用程序中试用了它,该应用程序有大约 3,000 个要绘制的标记,并且效果相当好。这有点慢(使用四核 Nexus 4),但我发现将“间隔”从 25 增加到 100 有助于加快速度。不知道它在旧手机上的表现如何。现在,如果集群的图标指定了集群的项目数量,那就太好了。我知道当你点击它时它会在覆盖层上显示它,但是这里的集群图标之类的东西:revolver.be/blog/mapkit-clustering-with-ios 会很棒。
    • 是的,带有项目计数的集群图像将是非常好的功能。我想像 instagram 那样做。但是现在我不知道如何实现它,也没有足够的时间去研究它。当我有空闲时间时,也许我会回到它。一些性能改进也是可能的:-)
    【解决方案2】:

    您基本上是在问如何在 Android 上实现集群。据我所知,谷歌没有提供解决方案来做到这一点。您在 cmets (developers.google.com/maps/articles/toomanymarkers) 中引用的文档指的是 google maps javascript API。遗憾的是,Android 上还没有任何与集群相关的代码。

    您必须提出自己的算法来对标记进行聚类。您指出的developers.google.com/maps/articles/toomanymarkers 文档可能是一个很好的起点,可以确定哪种算法最适合您(基于网格的聚类、基于距离的聚类等)。

    另一个更容易实现(但并不完美)的选项可能是在缩放级别发生变化时将标记图像更改为较小的图标,这样它们就不会重叠太多。看看我对这个问题的回答:https://stackoverflow.com/a/13976080/1103584

    您可以使用该答案来确定您何时超过“缩放阈值”,并在您缩小超过某个阈值时将标记更改为较小的值,并在您重新放大时更改为更大的图像。我在我自己的几个应用程序中使用了这个技巧,在缩小时将常规图标更改为小点图像,并在您重新放大时恢复为常规图标。

    【讨论】:

    • 非常感谢您的回答!看起来我真的必须开发自己的算法。也许我稍后会分享我的解决方案
    • 很高兴看到您的想法。为 Android 实现聚类算法一直是我想做很久的事情,只是一直没有找到时间。我有一种感觉,使用新的 v2 api 会比旧的容易得多。祝你好运!
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多