如何有效隐藏ClusterManager中不在Circle半径范围内的每个标记/簇?

问题描述 投票:1回答:1

我试图根据用户的位置过滤掉我的簇/标记,并为半径预定义圆。我希望它能使群集/标记在该半径之外不可见。

我已经尝试创建一个数组并放置我的lat和longs如:Android - display in the map only the markers included in a determinate area

这个:How to show markers only inside of radius (circle) on maps?

但是,我不知道如何使用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代码:

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个位置,我试图使其尽可能优化,以便用户只能看到给定半径内的标记,但我还可以选择通过单击按钮取消隐藏Radius外部的标记。

android kotlin maps
1个回答
-1
投票

我认为你真的只需要简单的条件来检查即将到来的位置是否在半径范围内,即:

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

注意:您可能需要对纬度进行相同的操作。

我想radius值将等于0.00578它当然取决于你的需要。

虽然最好的方法是编写查询以仅获取指定范围内的位置。

© www.soinside.com 2019 - 2024. All rights reserved.