Я пытаюсь отфильтровать свои кластеры / маркеры на основе местоположения пользователя с предварительно определенным кругом для радиуса. Мне бы хотелось, чтобы кластеры / маркеры были невидимы за пределами этого радиуса.
Я попытался создать массив и выставить свои значения lat и long, например:
Android - отображать на карте только маркеры, включенные в определенную область
и это:
Как показывать маркеры только внутри радиуса (круга) на картах?
Однако я не уверен, как решить эту проблему с помощью ClusterManager
Здесь я получаю свои данные из Firebase и сохраняю их в ClusterManager:
private fun loadMarkersFromDB() {
mCompanies.child("data/results").addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
if (dataSnapshot.exists()) {
for (s in dataSnapshot.children) {
var company = s.getValue(Company::class.java)
val infoWindow =
MyItem(company!!.latitude, company!!.longitude, company.name)
mClusterManager.setAnimation(false)
mClusterManager.addItem(infoWindow)
Log.d("onDataChange", company.toString())
}
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.w("MapsActivity", databaseError.toException())
}
})
}
Настройка функции кластера:
private fun setUpCluster() {
// Initialize the manager with the context and the map.
// (Activity extends context, so we can pass 'this' in the constructor.)
mClusterManager = ClusterManager(this, mMap)
// Point the map's listeners at the listeners implemented by the cluster
// manager.
mMap.setOnCameraIdleListener(mClusterManager)
mMap.setOnMarkerClickListener(mClusterManager)
// Add cluster items (markers) to the cluster manager.
loadMarkersFromDB()
}
Что я называю внутри onMapReady:
setUpCluster()
mClusterManager = ClusterManager(this, mMap)
val customRenderer = CustomClusterRenderer(this, mMap, mClusterManager, mMap.getCameraPosition().zoom, 20f)
mClusterManager.renderer = customRenderer
mMap.setOnCameraMoveListener(customRenderer)
mMap.setOnCameraIdleListener(mClusterManager)
mMap.setOnMarkerClickListener(mClusterManager)
Вот код круга, который я получил от StackOverflow:
circle = mMap.addCircle(
CircleOptions()
.center(currentLatLng)
.radius(400.0) //The radius of the circle, specified in meters. It should be zero or greater.
.strokeColor(Color.rgb(0, 136, 255))
.fillColor(Color.argb(20, 0, 136, 255))
)
Класс Кластера:
class MyItem : ClusterItem {
private val position: LatLng
private var title: String = ""
private var snippet: String = ""
constructor(lat: Double, lng: Double, title: String) {
position = LatLng(lat, lng)
this.title = title
}
override fun getSnippet(): String {
return snippet
}
override fun getTitle(): String {
return title
}
override fun getPosition(): LatLng {
return position
}
}
Я получил кластеры, работающие, и данные были загружены, как и предполагалось, однако, поскольку у меня есть более 3000 местоположений, я пытаюсь сделать его максимально оптимизированным, чтобы пользователь мог видеть только маркеры в пределах данного Радиуса , но я также хотел бы, чтобы опция отображала маркеры вне радиуса одним нажатием кнопки.