簡體   English   中英

如何有效地隱藏ClusterManager中不在圓半徑范圍內的每個標記/簇?

[英]How do I effectively hide every marker/clusters in ClusterManager that is not within a Circle's radius?

我試圖根據用戶的位置使用半徑為預定義的Circle的方法來過濾出群集/標記。 我希望它在半徑之外不可見群集/標記。

我嘗試創建一個數組,然后將經緯度放置如下: 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代碼:

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內的標記,但是我還希望通過單擊按鈕來取消隱藏半徑外的標記的選項。

我認為您真的只需要簡單的條件即可檢查即將到來的位置是否在半徑內,即:

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

注意:您可能需要對緯度執行相同的操作。

我猜想radius值將等於0.00578 ,這當然取決於您的需要。

最好的方法是編寫查詢以僅獲取您指定范圍內的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM