0

Я пытаюсь кластеризовать маркеры, которые пользователи вводят наMapLongClick, но я не могу понять, как это понять. Все обучаемые/примеры, которые я нашел, показывают, как кластер для объектов, которые находятся в заданном LatLng. Это не будет работать для того, что я хочу сделать, потому что точка не известна, пока пользователь не помещает маркер. Например, если пользователи вводят двадцать маркеров при использовании приложения в определенном месте на уровне масштабирования 7, я хочу, чтобы они могли группировать их на основе расстояния или сетки, или же, когда они приближаются к уровню 6. Я пользуюсь Google Maps с Android Studio. Кто-нибудь может помочь? Я некоторое время работаю над этим ... Вот код, который у меня есть до сих пор. Спасибо!Кластеризация пользовательских маркеров ввода (Google Maps x 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)); 
      } 
     } 
    }); 

} 

}

ответ

0

Самый простой способ прикрепить 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 из библиотеки.

+0

Благодарим за отзыв. Я скачал это и посмотрел на него, но я считаю, что все демонстрации в кластере android-maps-utils основаны на маркерах, которые были введены до того, как пользователь помещает их в onMapLongClick. Входная сторона вещей - это то место, где я считаю, что меня повесили ... –

+0

Вы можете добавлять элементы динамически в ClusterManager. Я отредактирую свой ответ, чтобы добавить несколько строк кода из моего проекта. –

+0

добавил пример того, как вы можете просто использовать кластер. вам не нужен режим, чем тот, который вы хотите достичь. –