Android地图聚合标记-不显示未聚合的标记?

8
我正在使用来自这里的Google Maps Android标记聚类工具,并且我从我的服务器接收到一个列表中添加了许多项(约700项)。我解决了最初的错误,可以看到群集,然后对它们进行缩放并将它们变成单个标记。然而,有几个项目距离其他所有项目很远,即使在最大缩放时也不会被聚集在一起。由于某种原因,这些项目不会显示在我的地图上-无论我缩放还是拉远都不会。

我已经检查了坐标,它们是真实的,在我开始使用聚类之前,我可以毫不费力地看到这些项目,所以我认为在我的聚类代码中做错了什么。

下面是一些代码:

private void setUpClusterer() {
    // Initialize the manager with the context and the map
    mClusterManager = new ClusterManager<>(getActivity(), map);
    vendorRenderer = new VendorRenderer();
    mClusterManager.setRenderer(vendorRenderer);
    mClusterManager.setOnClusterClickListener(this);
    mClusterManager.setOnClusterItemClickListener(this);
    //point the maps listeners at the listeners implemented by the cluster manager
    map.setOnCameraChangeListener(mClusterManager);
    map.setOnMarkerClickListener(mClusterManager);

    //add items to the cluster manager
    addClusterItems(-1);
    mClusterManager.cluster();
}

private void addClusterItems(int positionToMark) {
    if (null == list) {
        return;
    }
    LatLng position;
    int maxMarkers = Math.min(list.size(), getResources().getInteger(R.integer.number_of_results_on_map));

    mClusterManager.clearItems();

    for (int i = 0; i < maxMarkers; i++) {

        vendorItem = list.get(i);

        if (vendorItem.getAddress().contains("Remote 1")) {
            Log.e("Kibi", "Adding Remote 1, pos = " + i);
            Log.e("Kibi", "Coordinates  =" + vendorItem.getPointCoordinates().toString());
        }
        if (vendorItem.getAddress().contains("Clustered 1")) {
            Log.e("Kibi", "Adding Clustered 1, pos = " + i);
            Log.e("Kibi", "Coordinates  =" + vendorItem.getPointCoordinates().toString());
        }
        if (vendorItem.getAddress().contains("Remote 2")) {
            Log.e("Kibi", "Adding Remote 2, pos = " + i);
            Log.e("Kibi", "Coordinates  =" + vendorItem.getPointCoordinates().toString());
        }
        VendorMapItem item = new VendorMapItem(vendorItem.getPointCoordinates(),
                "Some other text");
        if (i == positionToMark) {
            selectedItem = item;
        }

        mClusterManager.addItem(item);
    }
    if (-1 == positionToMark) {
        selectedItem = null;
    }
}

这里展示了添加条目的过程 - 我添加的日志帮助我看到我的两个远程条目已经添加并且坐标良好,而且看起来与我选择的聚类条目相似(尽管距离很远)。
以下是渲染器代码:
/* This draws the markers for us */
private class VendorRenderer extends DefaultClusterRenderer<VendorMapItem> {
    Context context = getActivity().getApplicationContext();
    public final IconGenerator mIconGenerator = new IconGenerator(context);
    public final IconGenerator mSelectedIconGenerator = new IconGenerator(context);
    private final View mItemView;
    private final View mSelectedItemView;

    public VendorRenderer() {
        super(getActivity().getApplicationContext(), map, mClusterManager);

        // Create selected custom Marker
        RelativeLayout selectedContainer = (RelativeLayout) view.findViewById(R.id.marker_map_selected_container);
        mSelectedItemView = ((LayoutInflater) getActivity().getSystemService
                (Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_selected_layout, selectedContainer, false);
        mSelectedIconGenerator.setContentView(mSelectedItemView);
        mSelectedIconGenerator.setBackground(null);

        // Create custom Marker
        LinearLayout container = (LinearLayout) view.findViewById(R.id.text_marker_map_container);
        mItemView = ((LayoutInflater) getActivity().getSystemService
                (Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_layout, container, true);

        mIconGenerator.setContentView(mItemView);
        mIconGenerator.setBackground(null);
    }

    @Override
    protected void onBeforeClusterItemRendered(VendorMapItem vendor, MarkerOptions markerOptions) {
        // Draw a single vendor.
        Bitmap icon;
        if (null == selectedItem || !vendor.getPosition().equals(selectedItem.getPosition()))
        {
            icon = mIconGenerator.makeIcon();
        } else {
            icon = mSelectedIconGenerator.makeIcon();
        }
        markerOptions.title(vendor.getTitle());
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected void onBeforeClusterRendered(Cluster<VendorMapItem> cluster, MarkerOptions markerOptions) {
        // Draw multiple vendors clustered...
        Bitmap icon = mIconGenerator.makeIcon();
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon));
    }

    @Override
    protected boolean shouldRenderAsCluster(Cluster cluster) {
        // Always render clusters.
        return cluster.getSize() > 1;
    }
}

通常显示聚类项,以及已选或未选的非聚类项。我还有另一个视图,它以列表形式显示所有位置数据,我的远程位置在那里显示良好。
你对我做错了什么有什么想法吗?
2个回答

2

愚蠢。

基本上,我调用了太多次map.clear()。如果地图上绘制的只是由聚合器控制的标记,则没有必要调用clear。一旦删除了clear()调用,我的标记就重新显示出来了。


0

公共类 ClusterIconProvider 实现 IconDataProvider 接口 {

private static final int[] res = {R.drawable.m1,R.drawable.m2,R.drawable.m3,R.drawable.m4,R.drawable.m5};
private static final int[] forCounts = { 10, 100, 1000, 10000, Integer.MAX_VALUE };
private Bitmap[] baseBitmaps;
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Rect bounds = new Rect();
private MarkerOptions markerOptions = new MarkerOptions().anchor(0.5f, 0.5f);


public ClusterIconProvider(Resources resources){
    baseBitmaps = new Bitmap[res.length];
    for (int i = 0; i < res.length; i++) {
        baseBitmaps[i] = BitmapFactory.decodeResource(resources, res[i]);
    }
    paint.setColor(Color.WHITE);
    paint.setTextAlign(Align.CENTER);
    paint.setTextSize(resources.getDimension(R.dimen.Cluster));
}
@Override
public MarkerOptions getIconData(int markersCount) {
    // TODO Auto-generated method stub
    Bitmap base;
    int i = 0;
    do {
        base = baseBitmaps[i];
    } while (markersCount >= forCounts[i++]);
    Bitmap bitmap = base.copy(Config.ARGB_8888, true);      
    String text = String.valueOf(markersCount);
    paint.getTextBounds(text, 0, text.length(), bounds);
    float x = bitmap.getWidth() / 2.0f;
    float y = (bitmap.getHeight() - bounds.height()) / 2.0f - bounds.top;
    Canvas canvas = new Canvas(bitmap);
    canvas.drawText(text, x, y, paint);
    BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(bitmap);
    return markerOptions.icon(icon);
}

}


您可以使用此功能在地图上添加聚类。 - Pratik Lad
谢谢@Pratik,但是我正在使用的源代码已经有了集群机制。只是当它们没有被聚类时,它无法绘制非聚类的单个项目,我无法弄清楚原因。 - Kibi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接