Android 如何有效地隐藏ClusterManager中不在圆内的每个标记/簇';s半径?
我正在尝试根据用户的位置筛选出簇/标记,并使用预定义的半径圆。我希望簇/标记在该半径外不可见 我已尝试创建一个数组,并将我的lat和LONG放在如下位置: 这是: 但是,我不知道如何使用ClusterManager解决这个问题 在这里,我从Firebase获取数据并将其存储在ClusterManager中:Android 如何有效地隐藏ClusterManager中不在圆内的每个标记/簇';s半径?,android,kotlin,maps,Android,Kotlin,Maps,我正在尝试根据用户的位置筛选出簇/标记,并使用预定义的半径圆。我希望簇/标记在该半径外不可见 我已尝试创建一个数组,并将我的lat和LONG放在如下位置: 这是: 但是,我不知道如何使用ClusterManager解决这个问题 在这里,我从Firebase获取数据并将其存储在ClusterManager中: private fun loadMarkersFromDB() { mCompanies.child("data/results").addListenerFo
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!!.longitude
circle.center.longitude
到userLocation.longitude
的距离,但circle.radius
不正确。因为circle.radius可能等于5.0
,这将产生不正确的结果,因为经度的1等于40075公里,纬度的1等于111.32公里,所以您需要添加几米,正如我上面演示的,它应该是smth,就像0.000123
@VadimEksler一样,我认为您也不理解我的答案!