2013-02-05 31 views
3

我正試圖在地圖上爲集羣標記開發一些algorythm。顯示的標記數量應取決於當前縮放級別。如果我從10個組中顯示一個標記,我想將其標題設置爲「10」。問題是,現在有時可見的標記根本沒有標題,我不知道它是如何可能的。 這裏是我的代碼:Google Map Android API的標記錯誤標題

public class MainActivity extends FragmentActivity { 
private ArrayList<Marker> markers = new ArrayList<Marker>(); 
private Bitmap markerImage; 
private float oldZoom = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    markerImage = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher); 

    setContentView(R.layout.activity_main); 

    final GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 
    map.getUiSettings().setMyLocationButtonEnabled(true); 
    map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
     @Override 
     public void onCameraChange(CameraPosition cameraPosition) { 
      if (cameraPosition.zoom != oldZoom) { 
       checkMarkers(map); 
      } 
      oldZoom = cameraPosition.zoom; 
     } 
    }); 
    createMarkers(map); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

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); 
     Marker marker = map.addMarker(new MarkerOptions() 
       .position(pos) 
       .icon(BitmapDescriptorFactory.fromBitmap(markerImage))); 
     markers.add(marker); 
    } 
    for (float i = 0; i < 2; i += 0.2) { 
     LatLng pos = new LatLng(initLat, initLng + i); 
     Marker marker = map.addMarker(new MarkerOptions() 
       .position(pos) 
       .icon(BitmapDescriptorFactory.fromBitmap(markerImage))); 
     markers.add(marker); 
    } 

    initLat = 40.462740; 
    initLng = 30.039572; 
    for (float i = 0; i < 2; i += 0.2) { 
     LatLng pos = new LatLng(initLat + i, initLng + i); 
     Marker marker = map.addMarker(new MarkerOptions() 
       .position(pos) 
       .icon(BitmapDescriptorFactory.fromBitmap(markerImage))); 
     markers.add(marker); 
    } 

} 


private void checkMarkers(GoogleMap map) { 
    Projection projection = map.getProjection(); 
    LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; 
    HashMap<Marker, Point> points = new HashMap<Marker, Point>(); 
    for (Marker marker : markers) { 
     if (bounds.contains(marker.getPosition())) { 
      points.put(marker, projection.toScreenLocation(marker.getPosition())); 
      marker.setVisible(false); 
     } 
    } 
    CheckMarkersTask checkMarkersTask = new CheckMarkersTask(); 
    checkMarkersTask.execute(points); 
} 

private class CheckMarkersTask extends AsyncTask<HashMap<Marker, Point>, Void, HashMap<Point, ArrayList<Marker>>> { 


    private double findDistance(float x1, float y1, float x2, float y2) { 
     return Math.sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2))); 
    } 

    @Override 
    protected HashMap<Point, ArrayList<Marker>> doInBackground(HashMap<Marker, Point>... params) { 
     HashMap<Point, ArrayList<Marker>> clusters = new HashMap<Point, ArrayList<Marker>>(); 
     HashMap<Marker, Point> points = params[0]; 
     boolean wasClustered; 
     for (Marker marker : points.keySet()) { 
      Point point = points.get(marker); 
      wasClustered = false; 
      for (Point existingPoint : clusters.keySet()) { 
       if (findDistance(point.x, point.y, existingPoint.x, existingPoint.y) < 25) { 
        wasClustered = true; 
        clusters.get(existingPoint).add(marker); 
        break; 
       } 
      } 
      if (!wasClustered) { 
       ArrayList<Marker> markersForPoint = new ArrayList<Marker>(); 
       markersForPoint.add(marker); 
       clusters.put(point, markersForPoint); 
      } 
     } 
     return clusters; 
    } 

    @Override 
    protected void onPostExecute(HashMap<Point, ArrayList<Marker>> clusters) { 
     for (Point point : clusters.keySet()) { 
      ArrayList<Marker> markersForPoint = clusters.get(point); 
      Marker mainMarker = markersForPoint.get(0); 
      mainMarker.setTitle(Integer.toString(markersForPoint.size())); 
      mainMarker.setVisible(true); 
     } 
    } 

} 
} 

正如你可以看到所有可見的標誌應該有標題,但實際上他們往往沒有。任何問題有什麼不對?

UPD:我剛剛發現,如果在每個CameraChange上調用map.clear()和readd標記(保證替換標題和可見性),一切正常。它看起來很奇怪

+1

您可能還想看看[Android Maps Extensions](http://code.google.com/p/android-maps-extensions/)。 –

回答

2

我已經解決了這個問題,通過清除每個CameraChange事件的地圖,然後添加需要的標記。這對我來說可以。