缩放时聚类地图标记,放大时不聚集

时间:2014-01-21 19:55:59

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

我正在使用Google Map Android clustering Utitlity使用Google Maps v2播放服务。

我没有得到我期望的行为。正如你在下面的两张图片中看到的那样,当放大时,我可以看到一个20的簇和一个向左的单个标记,但当我缩小直到它们在彼此的顶部时,我看不到它们的簇。 20集群仍然说20而不是21?

enter image description here

enter image description here

这是预期的行为吗?有没有办法可以让群集显示21而不是20 +

4 个答案:

答案 0 :(得分:11)

这是DefaultClasterRenderer#onBeforeClusterRendered()中指定的默认行为:

/**
 * Called before the marker for a Cluster is added to the map.
 * The default implementation draws a circle with a rough count of the number of items.
 */
protected void onBeforeClusterRendered(Cluster<T> cluster, MarkerOptions markerOptions) {
    int bucket = getBucket(cluster);
    BitmapDescriptor descriptor = mIcons.get(bucket);
    if (descriptor == null) {
        mColoredCircleBackground.getPaint().setColor(getColor(bucket));
        descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.makeIcon(getClusterText(bucket)));
        mIcons.put(bucket, descriptor);
    }
    // TODO: consider adding anchor(.5, .5) (Individual markers will overlap more often)
    markerOptions.icon(descriptor);
}

请注意,标记的文字是根据bucket选择的,而不是cluster

中的确切项目数

快速解决方法是将描述符创建修改为:

descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.
                                                 makeIcon(cluster.getSize());

当然,您可以实施自定义ClasterRenderer并将其提供给ClusterManager。通过这种方式,您将负责渲染标记,但如果您只想将"20+"更改为"21" - 我会采用第一种方法

修改

在评论中提出的问题: 如果要增加/减少分组项目的距离阈值 - 您可以修改用于群集的default algorithm。只需使用此常量(在您的情况下应该更小):

public static final int MAX_DISTANCE_AT_ZOOM = 100; // essentially 100 dp.

但正确的解决方法是考虑Marker位图大小而不是常量值。我假设Mr. Broadfood将其作为爱好者的家庭作业:)

private Bounds createBoundsFromSpan(Point p, double span) {
    // TODO: Use a span that takes into account the visual size of the marker, not just its
    // LatLng.
    double halfSpan = span / 2;
    return new Bounds(
            p.x - halfSpan, p.x + halfSpan,
            p.y - halfSpan, p.y + halfSpan);
}

答案 1 :(得分:2)

您可以更改最小群集大小。默认情况下,map-utils库中定义的最小簇大小为4,如下所示。

$ sh compile.sh -a x84
You must define ANDROID_NDK, ANDROID_SDK before starting.
They must point to your NDK and SDK directories.

或者您可以在扩展的DefaultClusterRenderer类中覆盖shouldRenderAsCluster方法,如下所示:

    /**
     * If cluster size is less than this size, display individual markers.
     */
    private int mMinClusterSize = 4;

    /**
     * Determine whether the cluster should be rendered as individual markers or a cluster.
     */
    protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
        return cluster.getSize() > mMinClusterSize;
    }

答案 2 :(得分:1)

我意识到这是一个老问题,但对于那些仍在使用Pavel的优秀答案的人来说,还要确保更改这两行代码

BitmapDescriptor descriptor = mIcons.get(cluster.getSize());
...
mIcons.put(bucket, descriptor);

像这样更换桶:

BitmapDescriptor descriptor = mIcons.get(cluster.getSize());
...
mIcons.put(cluster.getSize(), descriptor);

否则,当合并/分离时,群集将四舍五入到最接近的桶大小,从而导致桶大小不准确。

有一种明显的解决方法,但如果您没有注意数据的确切值,则很容易错过。

对于任何挣扎的人:

在保留Google的渲染算法的同时实现Pavel答案的最简单方法是下载默认渲染器(在正确答案中链接),修改代码并将其设置为自定义渲染器ClusterManager。该库对外部修改/覆盖并不友好,并且只是覆盖这个段是一个巨大的痛苦,因为它使用了许多其他私有方法和变量。

答案 3 :(得分:0)

对于那些正在努力做同样事情的人 在您的自定义渲染器中覆盖这两个函数,如下所示     @覆盖     protected int getBucket(Cluster cluster){         return cluster.getSize();     }

@Override
protected String getClusterText(int bucket) {
    return String.valueOf(bucket);
}