【问题标题】:Show map markers within Circle radius hide markers outside of radius iterator issue在圆半径内显示地图标记隐藏在半径迭代器问题之外的标记
【发布时间】:2021-05-14 21:15:19
【问题描述】:

我需要在我的圆半径内显示标记。我正在使用科特林。我有每个 onCameraIdleListener 更新的圆半径。我遇到的问题是我不明白如何正确使用 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

这是Circle的地图:

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") )

这是我得到的错误“For-loop range must have an 'iterator()' method”这是我遇到的问题。我试图研究迭代器,但我不理解它。我的代码看起来对吗?我对代码做错了吗?我从这个comment 得到了另一个类似问题的总体思路。我相信这段代码是用java编写的。我已尽我所能保持相似。但我不确定如何迭代这个 for 循环?感谢您的所有帮助!

【问题讨论】:

    标签: google-maps for-loop kotlin iterator android-maps-utils


    【解决方案1】:

    当你调用 for 语句时,它应该是一个可迭代的集合,但你调用的是一个唯一值,即 circle.getValue("CIRCLE"),我认为你应该直接将值分配给标记

    val marker = circle.getValue("CIRCLE") 
    

    【讨论】:

    • 我已经研究了迭代器()。我试图创建一个私有的 val listOf('location1', 'location2') 但它声明Required: Marker Found: String。我知道 'locaton1' & 2 是字符串。所以我尝试创建一个标记,如 mMap.addMarker(MarkerOptions().position(LatLng(34.695779, -110.310185)).title("location1" 但它又出现了另一个错误。我找不到任何关于如何创建的信息listOf 在线。我只是看到人们在代码 sn-ps 中使用它的地方。
    • 我做了一些代码修改。我将更新主要问题。我现在可以遍历我的 mutableListOf 但它不显示标记。由于 Log.i,我已经确定它确实运行了该块,但它没有显示/隐藏标记。
    【解决方案2】:

    因此,通过一些代码更改,我能够使用此代码成功地将标记隐藏在圆半径之外。

        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 来分配每个位置信息,而是使用 mutableListOf() 来完成。在 for 循环中只需调用您为其分配的 mutableListOf 名称。半径以米为单位,您可以将其更改为您想要的半径。这大约是 150 英里的半径。

    我使用 circle.center 作为圆心的纬度,具有:

    .center(mMap.cameraPosition.target)
    

    一旦你把它放在 onCameraIdle 中,这将在每个相机空闲时更新中心 LatLng。

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多