Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何有效地隐藏ClusterManager中不在圆内的每个标记/簇';s半径?_Android_Kotlin_Maps - Fatal编程技术网

Android 如何有效地隐藏ClusterManager中不在圆内的每个标记/簇';s半径?

Android 如何有效地隐藏ClusterManager中不在圆内的每个标记/簇';s半径?,android,kotlin,maps,Android,Kotlin,Maps,我正在尝试根据用户的位置筛选出簇/标记,并使用预定义的半径圆。我希望簇/标记在该半径外不可见 我已尝试创建一个数组,并将我的lat和LONG放在如下位置: 这是: 但是,我不知道如何使用ClusterManager解决这个问题 在这里,我从Firebase获取数据并将其存储在ClusterManager中: private fun loadMarkersFromDB() { mCompanies.child("data/results").addListenerFo

我正在尝试根据用户的位置筛选出簇/标记,并使用预定义的半径圆。我希望簇/标记在该半径外不可见

我已尝试创建一个数组,并将我的lat和LONG放在如下位置:

这是:

但是,我不知道如何使用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()
    }
我在四月一日称之为内部:

 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多个位置,我正试图使其尽可能优化,以便用户只能看到给定半径内的标记,但我也希望通过点击按钮来取消隐藏半径外的标记。

我认为您确实只需要简单的条件来检查即将到来的位置是否在半径内,即:

if(company!!.longitude < useLocation.longitude + radius && company!!.longitude > useLocation.longitude - radius)
   mClusterManager.addItem(infoWindow)
if(company!!.longitudeuseLocation.longitude-radius)
mClusterManager.addItem(信息窗口)
注意:您可能需要对纬度进行同样的操作

我猜
radius
值将等于
0.00578
这当然取决于您的需要


而最好的方法是编写一个查询,仅获取指定范围内的位置。

您可以使用geofire for firebase,它可以为您提供具有半径的位置。在“取消隐藏”中,您可以更改半径并提出新请求@VadimEksler添加完整库来进行简单计算是不正确的。@IbrahimAli完全不同意。如果我们考虑一下未来,现在他有3000个位置,他需要带上所有的位置(不确定用户是否需要),什么时候db会有30000个位置?这将是一个糟糕的解决方案,带来所有的人和排序。你解决了你的问题吗?谢谢!我尝试了以下代码:if(company!!.longitudecircle.center.longitude-circle.radius)mClusterManager.addItem(信息窗口)只是想知道,我的circle.center.longitude应该是“useLocation.longitude”吗?我也应用了等效纬度,但没有得到任何更改,但是当我删除“半径”部分时,我开始得到一些更改。让我们试试巴黎市中心:纬度-48.856180,长-2.346505,半径5公里。你正在尝试将公里数增加到度数。卢森堡勒贾丁距离我的位置2公里,纬度-48.8457545,长-2.3526363。如果(2.346505<2.3526363+5&&2.346505>2.3526363-5)错误,请查看此公式如何定义从lat long@LVXIV Yes
circle.center.longitude
userLocation.longitude
的距离,但
circle.radius
不正确。因为circle.radius可能等于
5.0
,这将产生不正确的结果,因为经度的1等于40075公里,纬度的1等于111.32公里,所以您需要添加几米,正如我上面演示的,它应该是smth,就像
0.000123
@VadimEksler一样,我认为您也不理解我的答案!