使用Google Map Android API v2标记的标题错误

时间:2013-02-05 09:52:23

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

我正在尝试为地图上的聚类标记开发一些算法。显示的标记量应取决于当前的缩放级别。如果我从10组中显示一个标记,我想将其标题设置为“10”。问题是,现在有时可见标记根本没有标题,我不知道它是如何可能的。 这是我的代码:

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 个答案:

答案 0 :(得分:2)

我通过清除每个CameraChange事件的地图然后添加所需的标记来解决了这个问题。它对我来说很好。