我需要在我的圆半径内显示标记。我在用Kotlin。我用每个oncameraidllistener更新圆半径。我遇到的问题是,我不明白如何正确使用for方法。我的最终目标是当标记在圆半径之外时隐藏它们。这是我创建标记的代码。这是我存储位置键/值的地方:
private var test = mapOf(
"TESTLOCATION" to LatLng(34.695779, -110.344185),
)
这是我为地图添加标记的代码:
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 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 Circle(
val center: LatLng,
val radius: Double,
val strokeColor: Int,
val fillColor: Int,
val draggable: Boolean = false)
我是这样把圆圈添加到地图上的:
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
这是圆圈的地图:
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) {标记。isVisible = true}
这是我得到的错误" for循环范围必须有一个'iterator()'方法"这就是我被困住的地方。我试着研究迭代器,但我不理解它。我的代码看起来正确吗?我的代码有什么问题吗?我从另一个类似问题的评论中得到了大致的想法。我相信这段代码是用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()之后调用位置列表函数,我在错误的位置使用了。clear()。而不是创建mapOf然后使用类PlaceDetails来分配每个位置信息,我只是用mutableelistof()来做。在for循环中调用你为它分配的mutableelistof名称。半径的单位是米,你可以把它改成你想要的半径。这大概是150英里半径
我用圆。圆心为圆心的斜面,带有:
.center(mMap.cameraPosition.target)
一旦你把这个放在onCameraIdle,这将更新中心LatLng与每个相机空闲。