我正在尝试为地图上的聚类标记开发一些算法。显示的标记量应取决于当前的缩放级别。如果我从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标记(替换标题和可见性),一切正常。这对我来说很奇怪
答案 0 :(得分:2)
我通过清除每个CameraChange事件的地图然后添加所需的标记来解决了这个问题。它对我来说很好。