2014-06-11 48 views
3

我正在使用android maps utils来聚合google map api v2上的标记。它工作得很好,但是当我加2000+的标记,在最大放大它仍然是群集(标记仍然有号码):地图集群 - 最大缩放标记仍然聚集

2000+ markers max zoom

这里是我用彩笔填图方法:

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); 
} 

任何人都可以帮我吗?为什么它不起作用?

+2

我认为这是由于(7)标记具有相同的位置。 –

+0

它可能是。是否有任何方法检查具有相同位置的标记是否存在? – dudeck

+1

只要做到这一点:给你的地图7标记完全相同的位置,以测试它的行为。并给它7个标记略有不同的位置(+/- 0.0001纬度/经度),看看它是否工作。 –

回答

1

要筛选具有相同位置的标记,可以简单地使用一个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); 

    // ... 
} 
13

你可以扩展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 
} 
} 
+0

这种方法很好。您可以使用更复杂的测试来确定是否要群集。 – rfay

0

通过试错我发现,如果标记是内〜10英尺(相当于0.0000350º在纬度或长差),标记甚至没有在最大缩放级别decluster。

解决此问题的一种方法是实现自定义渲染器并让应用程序决定何时进行群集。例如,下面的代码只会在多于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; 
     } 
    } 
});