我正在尝试对用户在MapLongClick上输入的标记进行聚类,但我似乎无法弄清楚。我找到的所有教程/示例都展示了如何对位于预定 LatLng 的对象进行聚类。这不适用于我想做的事情,因为在用户放置标记之前不知道该点。例如,如果用户在缩放级别 7 的某个位置使用应用程序时输入了 20 个标记,那么我希望能够根据距离或网格或当他们缩放到级别 6 时对它们进行聚类。我正在使用谷歌地图和Android Studio。谁能帮忙?我已经为此工作了一段时间...这是我到目前为止的代码。谢谢!
public class BasicMapDemoActivity extends AppCompatActivity implements
OnMapReadyCallback {
GoogleMap mMap;
private UiSettings mUiSettings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.basic_demo);
SupportMapFragment mapFragment =
(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
if (item.getItemId() == R.id.menu_legal) {
startActivity(new Intent(this, LegalInfoActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onMapReady(GoogleMap map) {
mMap = map;
mUiSettings = mMap.getUiSettings();
mUiSettings.setZoomControlsEnabled(true);
mUiSettings.setScrollGesturesEnabled(true);
mUiSettings.setZoomGesturesEnabled(true);
mMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng point) {
mMap.addMarker(new MarkerOptions()
.position(point)
.snippet("this is a snippet"));
}
});
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
}
});
mMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
float maxZoom = 7.0f;
if (position.zoom > maxZoom) {
mMap.animateCamera(CameraUpdateFactory.zoomTo(maxZoom));
}
}
});
}
}
最简单的方法是将ClusterManager
附加到地图。它将自动将簇中的标记放在其位置进行动画处理(或在缩小时对标记进行聚类)。
集群是另一个项目的一部分,称为android-map-utils
可以在这里找到:https://github.com/googlemaps/android-maps-utils
他们在存储库中有一个很棒的演示应用程序,我相信您会在那里找到所需的功能。
在初始化映射后,将项添加到ClusterManager
的示例。
设置集群管理器
mClusterManager = new ClusterManager<>(BrowseLocationsActivity.this, googleMap); mClusterManager.setClusterOnlyVisibleArea(true); mClusterManager.setAlgorithm(new VisibleNonHierarchicalDistanceBasedAlgorithm<MapMarkerItem>(metrics.widthPixels, metrics.heightPixels));
当您需要向集群添加新项目时,只需调用
mClusterManager.addItem(new MapMarkerItem(latitude, longitude)); mClusterManager.cluster();
请注意,MapMarkerItem
是一个自定义类,它实现库中的ClusterItem
。