Как эффективно скрыть каждый маркер / кластер в ClusterManager, который находится за пределами радиуса круга? - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь отфильтровать свои кластеры / маркеры на основе местоположения пользователя с предварительно определенным кругом для радиуса. Мне бы хотелось, чтобы кластеры / маркеры были невидимы за пределами этого радиуса.

Я попытался создать массив и выставить свои значения 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 местоположений, я пытаюсь сделать его максимально оптимизированным, чтобы пользователь мог видеть только маркеры в пределах данного Радиуса , но я также хотел бы, чтобы опция отображала маркеры вне радиуса одним нажатием кнопки.

1 Ответ

0 голосов
/ 25 марта 2019

Я думаю, что вам действительно нужно только простое условие, чтобы проверить, находится ли исходное местоположение внутри радиуса, то есть:

if(company!!.longitude < useLocation.longitude + radius && company!!.longitude > useLocation.longitude - radius)
   mClusterManager.addItem(infoWindow)

Примечание: Возможно, вам потребуется сделать то же самое с широтой.

Полагаю, значение radius будет примерно равно 0.00578. Конечно, это зависит от ваших потребностей.

Хотя лучший способ - написать запрос, чтобы получить только местоположение в пределах диапазонаВы указали.

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