【问题标题】:Map clustering - max zoom markers still clustered地图聚类 - 最大缩放标记仍然聚类
【发布时间】:2014-06-11 09:27:00
【问题描述】:

我正在使用 android maps utils 对 google maps api v2 上的标记进行聚类。它工作得很好,但是当我添加 2000 多个标记时,在最大缩放时它仍然是聚集的(标记仍然有数字):

这是我用标记填充地图的方法:

public void getRiverData(String state, String type) {
    URL = getResources().getString(R.string.base_url) + state + "/" + type
            + getResources().getString(R.string.end_url);
    SimpleXmlRequest<XMLData> simpleRequest = new SimpleXmlRequest<XMLData>(
            URL, XMLData.class, new Response.Listener<XMLData>() {

                @Override
                public void onResponse(XMLData response) {

                    // Initialize the manager with the context and the map.
                    // (Activity extends context, so we can pass 'this' in
                    // the constructor.)
                    mClusterManager = new ClusterManager<MarkerItem>(
                            getActivity(), map);

                    mClusterManager.setRenderer(new ClusterRenderer(
                            getActivity(), map, mClusterManager));

                    // response Object
                    waterItemsList = response.getNews();

                    for (News item : waterItemsList) {
                        if (item.getRiver_name() != null
                                && item.getRiver_name() != "") {

                            water_level_value = item.getWater_level_value();

                            if (water_level_value != null
                                    && !water_level_value.equals(0)
                                    && !water_level_value.equals("")) {

                                MarkerItem offsetItem = new MarkerItem(item);
                                mClusterManager.addItem(offsetItem);

                            }

                            map.setOnMarkerClickListener(mClusterManager);

                            map.setInfoWindowAdapter(new InfoWindowAdapter() {

                                @Override
                                public View getInfoWindow(Marker marker) {

                                    return null;
                                }

                                @Override
                                public View getInfoContents(Marker marker) {

                                    try {
                                        View v = getActivity()
                                                .getLayoutInflater()
                                                .inflate(
                                                        R.layout.marker_info,
                                                        null);
                                        TextView title = (TextView) v
                                                .findViewById(R.id.tvMarkerTitle);
                                        TextView info = (TextView) v
                                                .findViewById(R.id.tvMarkerInfo);

                                        title.setText(marker.getTitle()
                                                .toString());
                                        info.setText(marker.getSnippet()
                                                .toString());
                                        return v;
                                    } catch (Exception e) {
                                        // kliknięcie w cluster
                                        return null;

                                    }

                                }
                            });

                        }

                    }

                    map.setOnCameraChangeListener(mClusterManager);

                    map.setOnInfoWindowClickListener(mClusterManager);

                    mClusterManager.cluster();

                }

            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error Object
                    error.printStackTrace();
                }
            });

    AppController.getInstance().addToRequestQueue(simpleRequest);
}

谁能帮助我?为什么它不起作用?

【问题讨论】:

  • 我认为这是由于 (7) 标记位置相同。
  • 有可能。有什么方法可以检查是否存在相同位置的标记?
  • 故意这样做:为您的地图提供 7 个位置完全相同的标记,以测试其行为方式。并给它 7 个位置稍有不同(+/- 0.0001 纬度/经度)的标记,看看它是否有效。
  • @dudeck "相同位置" 表示相同的坐标,因此您可以轻松检查自己。
  • 这不是 ri8 解决方案,但我们必须为此找到其他解决方案!!!

标签: android google-maps markerclusterer


【解决方案1】:

您可以扩展 DefaultClusterRenderer 类并将最小标记设置为集群。

public class InfoMarkerRenderer extends DefaultClusterRenderer<MyCustomMarker> {

public InfoMarkerRenderer(Context context, GoogleMap map, ClusterManager<MyCustomMarker> clusterManager) {
    super(context, map, clusterManager);
    //constructor
}

@Override
protected void onBeforeClusterItemRendered(final MyCustomMarker infomarker, MarkerOptions markerOptions) {
      // you can change marker options
}

@Override
protected boolean shouldRenderAsCluster(Cluster cluster) {
    return cluster.getSize() > 5; // if markers <=5 then not clustering
}
}

【讨论】:

  • 这种方法效果很好。您也可以使用更复杂的测试来确定是否进行集群。
【解决方案2】:

通过跟踪和错误,我发现如果标记在约 10 英尺内(相当于 0.0000350º 经纬度差异),即使在最大缩放级别下,标记也不会去簇。

解决此问题的一种方法是实现自定义渲染器并让应用决定何时进行集群。例如,下面的代码仅在有超过 1 个标记而不是最大缩放时才会聚集。换句话说,它将在最大缩放时消除所有标记。

mClusterManager.setRenderer(new DefaultClusterRenderer<MyItem>(mContext, googleMap, mClusterManager) {
    @Override
    protected boolean shouldRenderAsCluster(Cluster cluster) {
        if(cluster.getSize() > 1 && mCurrentZoom < mMaxZoom) {
            return true;
        } else {
            return false;
        }
    }
});

【讨论】:

    【解决方案3】:

    要过滤具有相同位置的标记,您可以简单地使用 hashmasp,其键是根据标记坐标计算的。

    类似:

    Map<String, Marker> uniqueMarkers = new HashMap<String, Marker>();
    for (Markers m : allMarkers) {
      // Compute a key to filter duplicates
      // You may need to account for small floating point precision errors by 
      // rounding those coordinates
      String key = m.getLatitude() + "|" + m.getLongitude();
    
      if (uniqueMarkers.get(key)!=null ) {
        // Skip if we have a marker with the same coordinates
        continue;
      }
    
      // Add marker and do something with it  
      uniqueMarkers.add(key, m);
    
      // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-10
      • 2012-12-17
      • 2013-01-08
      • 2014-04-05
      • 1970-01-01
      • 2019-12-05
      • 2018-09-27
      相关资源
      最近更新 更多