将相机对准坐标

问题描述 投票:0回答:1

我会根据现有的API将相机指向坐标。但只有标记可以到达坐标而不能到达相机。

请帮忙

我包含我的代码片段

// Membuat objek LatLng dari nilai latitude dan longitude
    val coordinatesStr = gempaInfo?.infogempa?.gempa?.coordinates
    val (latitudeStr, longitudeStr) = coordinatesStr?.split(",") ?: listOf("0.0", "0.0")
    val latitude = latitudeStr.trim().toDoubleOrNull() ?: 0.0
    val longitude = longitudeStr.trim().toDoubleOrNull() ?: 0.0
    val koordinat = LatLng(latitude, longitude)

    val cameraPositionState = rememberCameraPositionState {
        position = CameraPosition.fromLatLngZoom(koordinat, 10f)
    }

    // Menampilkan peta Google dengan marker di koordinat
    GoogleMap(
        modifier = Modifier.fillMaxSize(),
        cameraPositionState = cameraPositionState
    ) {
        Marker(
            state = MarkerState(position = koordinat),
            title = "Lokasi Gempa",
            snippet = "Marker di lokasi gempa"
        )
    }

我希望当地图加载时,它会根据API创建的内容自动指向坐标

android google-maps android-jetpack-compose google-maps-api-2
1个回答
0
投票

val coordinatesStr = gempaInfo?.infogempa?.gempa?.coordinates
会改变吗? 如果
gempaInfo
是静态的,您的代码应该可以工作。 如果它发生变化,您将必须观察
gempInfo
并更新cameraPositionState。

例如

val scope = rememberCoroutineScope()
LaunchedEffect(gempaInfo) {

val koordinat = gempaInfo?.infogempa?.gempa?.coordinates
  ?.split(",")
  ?.map { it.trim().toDoubleOrNull() ?: 0.0 }
  ?.let { coords -> LatLng(coords[0], coords[1]) } ?: LatLng(0.0. 0.0)
   
  scope.launch {
        cameraPositionState.animate(
            update = CameraUpdateFactory.newLatLngBounds(boundingBox, 64),
            durationMs = 1000
        )
    }
}

这是一个更长的示例,利用 Kotlin 流程进行跳转。 请注意,数据在到达 GoogleMap 之前已被清理。 (一般来说,应用程序应该只将清理后的数据发送到 UI。)

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            val locationStrings = listOf(
                null,
                "39.9559152,-105.2938497",
                "39.429725,-105.080054",
                "39.9559152",
                "null,no op",
                " 38.839155 , -105.0345258 ",
            )

            val locFlow = MutableStateFlow(LatLng(0.0, 0.0))

            val context = LocalContext.current

            LaunchedEffect(Unit) {
                while (true) {
                    locationStrings.asFlow()
                        .onEach {
                            delay(5.seconds)
                            Log.w("LocationFollower", "Location: $it")
                        }
                        .mapNotNull { locationString ->
                            locationString?.split(",")
                                ?.mapNotNull { it.trim().toDoubleOrNull() }
                                ?.takeIf { it.size == 2 }
                                ?.let { (lat, lng) ->
                                    LatLng(lat, lng)
                                } ?: run {
                                    Log.w("LocationFollower", "Invalid location: $locationString")
                                    Toast.makeText(
                                        context,
                                        "Invalid location: $locationString",
                                        Toast.LENGTH_SHORT
                                    ).show()
                                    null
                                }
                        }.collect {
                            locFlow.value = it
                        }
                }
            }

            LocationFollowerTheme {
                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
                    val location by locFlow.collectAsState(initial = LatLng(0.0, 0.0))
                    MyMap(modifier = Modifier.padding(innerPadding), location = location)
                }
            }
        }
    }
}

@Composable
fun MyMap(modifier: Modifier, location: LatLng) {
    val cameraPositionState = rememberCameraPositionState {
        position = CameraPosition.fromLatLngZoom(location, 15f)
    }

    val scope = rememberCoroutineScope()

    val markerState = rememberMarkerState(position = location)

    LaunchedEffect(location) {
        scope.launch {
            cameraPositionState.animate(
                CameraUpdateFactory.newCameraPosition(
                    CameraPosition.fromLatLngZoom(location, 15f)
                ),
                2.seconds.inWholeMilliseconds.toInt()
            )
        }

        markerState.position = location
    }

    GoogleMap(
        modifier = modifier,
        cameraPositionState = cameraPositionState
    ) {
        Marker(
            state = markerState,
            title = "Marker",
        )
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.