聚类用户输入标记(Google Maps x Android Studio)



我正在尝试对用户在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的示例。

  1. 设置集群管理器

    mClusterManager = new ClusterManager<>(BrowseLocationsActivity.this, googleMap);
    mClusterManager.setClusterOnlyVisibleArea(true);
    mClusterManager.setAlgorithm(new VisibleNonHierarchicalDistanceBasedAlgorithm<MapMarkerItem>(metrics.widthPixels, metrics.heightPixels));
    
  2. 当您需要向集群添加新项目时,只需调用

    mClusterManager.addItem(new MapMarkerItem(latitude, longitude));
    mClusterManager.cluster();
    

请注意,MapMarkerItem 是一个自定义类,它实现库中的ClusterItem

相关内容

  • 没有找到相关文章

最新更新