[英]Show map markers within Circle radius hide markers outside of radius iterator issue
我需要在我的圓半徑內顯示標記。 我正在使用 Kotlin。 我有每個 onCameraIdleListener 更新的圓半徑。 我遇到的問題是我不明白如何正確使用 for 方法。 我的最終目標是在標記位於圓的半徑之外時隱藏它們。 所以這是我創建標記的代碼。 這是我存儲位置鍵/值的地方:
private var test = mapOf(
"TESTLOCATION" to LatLng(34.695779, -110.344185),
)
這是我將標記添加到 map 的代碼:
private fun addTestLocationToMap(){
val placeDetailsMap = mutableMapOf(
"TESTLOCATION" to PlaceDetails(
position = test.getValue("TESTLOCATION"), title = "Test Location", icon = (BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)), snippet = "Test Location"
),
)
placeDetailsMap.keys.map{
with(placeDetailsMap.getValue(it)){
mMap.addMarker(MarkerOptions()
.position(position)
.title(title)
.snippet(snippet)
.icon(icon)
.infoWindowAnchor(infoWindowAnchorX, infoWindowAnchorY)
.draggable(draggable)
.zIndex(zIndex)
.visible(isVisible)
)
}
}
}
這是我用於 addTestLocationToMap 的 Class:
class PlaceDetails(
val position: LatLng,
val title: String = "Marker",
val snippet: String? = null,
val icon: BitmapDescriptor = BitmapDescriptorFactory.defaultMarker(),
val infoWindowAnchorX: Float = 0.5F,
val infoWindowAnchorY: Float = 0F,
val draggable: Boolean = false,
val zIndex: Float = 0F,
val isVisible: Boolean = true,
val setVisible: Boolean = true)
這是我為 Circle 准備的 Class:
class Circle(
val center: LatLng,
val radius: Double,
val strokeColor: Int,
val fillColor: Int,
val draggable: Boolean = false)
這是我將圓圈添加到 map 的方法:
private fun addCircle() {
val newCircle = mutableMapOf(
"CIRCLE" to Circle(
center = mMap.cameraPosition.target,
radius = 241402.0,
strokeColor = Color.RED,
fillColor = 0x00000000
)
)
newCircle.keys.map {
with(newCircle.getValue(it)) {
mMap.addCircle(CircleOptions()
.center(center)
.radius(radius)
.strokeColor(strokeColor)
.fillColor(fillColor)
.draggable(draggable)
)
}
}
}
以下是代碼頂部的私有變量,用於更新相機的 lat/lng:
private var cameraLat: Double = 0.0
private var cameraLng: Double = 0.0
這是 Circle 的 map:
private var circle = mapOf(
"CIRCLE" to LatLng(cameraLat, cameraLng),)
這就是我更新相機的方式
mMap.setOnCameraIdleListener {
var cameraLatUpdate = mMap.cameraPosition.target.latitude
var cameraLngUpdate = mMap.cameraPosition.target.longitude
cameraLatLng = mMap.cameraPosition.target
cameraLat = cameraLatUpdate
cameraLng = cameraLngUpdate}
這就是我試圖在半徑中顯示/隱藏標記的方式。 這是:
private lateinit var marker: Marker
這是半徑的代碼:
fun addCircleToMap() {
for (marker: LatLng in circle.getValue("CIRCLE") ){ if (SphericalUtil.computeDistanceBetween(circle.getValue("CIRCLE"), test.getValue("TESTLOCATION") ) < 241402.0){ marker.isVisible = true}
這是我得到的錯誤“For-loop range must have an 'iterator()' method”這是我遇到的問題。 我試圖研究迭代器,但我不理解它。 我的代碼看起來對嗎? 我對代碼做錯了嗎? 我從對另一個類似問題的評論中得到了大致的想法。 我相信這個代碼在 java 中。 我已盡我所能保持相似。 但我不確定如何迭代這個 for 循環? 謝謝你的幫助!
當您調用 for 語句時,它應該是一個可迭代的集合,但是您調用的是一個唯一值,即 circle.getValue("CIRCLE"),我認為您應該直接將值分配給標記
val marker = circle.getValue("CIRCLE")
因此,通過一些代碼更改,我能夠使用此代碼成功地將標記隱藏在圓半徑之外。
private lateinit var testMarkers:MutableList<Marker>
fun testMarkersForLoops(): MutableList<Marker> {
val testMarkers = mutableListOf(
mMap.addMarker(MarkerOptions().position(LatLng(34.695779, -87.634612)).title("testMarker").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)).visible(false))).toMutableList() return testMarkers
// 只需確保將可見設置為 false 以便隱藏它們直到它們的圓半徑
}
有趣的 loopForMarkers(){
val circle = mMap.addCircle(CircleOptions().center(mMap.cameraPosition.target).radius(241402.0).strokeColor(Color.RED).fillColor(0x00000000))
for (marker: Marker in testMarkers ){
if (SphericalUtil.computeDistanceBetween(circle.center, marker.position) < 241402.0){
marker.isVisible = true
Log.i(TAG,"Supposed to set Loves markers within the radius to true testing to see if this runs.")
}
}
}
然后在 onMapReady 中添加:
mMap.setOnCameraIdleListener {
var cameraLatUpdate = mMap.cameraPosition.target.latitude
var cameraLngUpdate = mMap.cameraPosition.target.longitude
cameraLatLng = mMap.cameraPosition.target
cameraLat = cameraLatUpdate
cameraLng = cameraLngUpdate
mMap.clear()
testMarkers = testMarkersForLoops()
addCircleToMap()
loopForMarkers()
}
您必須在.clear() 之后調用位置列表 function 我在錯誤的位置放置了.clear()。 而不是創建 mapOf 然后使用 class PlaceDetails 來分配每個位置信息,我只是使用 mutableListOf() 完成的。 在 for 循環中只需調用您為其分配的 mutableListOf 名稱。 半徑以米為單位,您可以將其更改為您想要的半徑。 這大約是150英里的raidus。
我使用 circle.center 作為圓心的緯度,具有:
.center(mMap.cameraPosition.target)
一旦你把它放在 onCameraIdle 中,這將在每個相機空閑時更新中心 LatLng。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.