返回

Google Maps POI 点击事件:如何获取精准经纬度?

Android

Google Maps POI 点击事件:精准获取经纬度的正确姿势

你是否遇到过这样的情况:兴致勃勃地在地图上标出一个 POI,点击触发事件后,获取到的经纬度却和预期相差十万八千里?别担心,你不是一个人!本文将为你揭开 Google Maps POI 点击事件的“神秘面纱”,并手把手教你如何精准获取 POI 的经纬度信息。

误区:setOnPoiClickListener 返回的就是 POI 经纬度?

很多开发者,包括一些经验丰富的老司机,都可能踩过这个坑:误以为 setOnPoiClickListener 返回的 poi.latLng 就是 POI 的经纬度。实际上, setOnPoiClickListener 监听的是地图的点击事件,无论点击位置是否存在 POI 都会触发。当点击位置存在 POI 时,该方法会返回 POI 信息,但 poi.latLng 获取的其实是点击位置 的经纬度,而非 POI 本身的精确坐标。

精准狙击 POI 经纬度:Places API 助你一臂之力

想要获取 POI 的精确经纬度,我们需要借助 Google Maps Places API 的强大功能。

  1. 获取 POI 的身份证:Place ID

    setOnPoiClickListener 返回的 poi 对象中,包含一个关键信息:poi.placeId 。 Place ID 就好比 POI 的身份证,通过它可以查询到该 POI 的详细信息。

  2. 查询 POI 详细信息:FetchPlaceRequest

    利用获取到的 Place ID,我们可以构建 FetchPlaceRequest 对象,并调用 PlacesClientfetchPlace() 方法获取 POI 的详细信息,包括我们梦寐以求的精确经纬度。

代码示例:Kotlin 版精准获取 POI 经纬度

Talk is cheap, show me the code! 下面是使用 Kotlin 实现精准获取 POI 经纬度的代码示例:

// 声明 PlacesClient 对象
private val placesClient: PlacesClient by lazy { Places.createClient(context) }

// 设置 POI 点击监听器
map.setOnPoiClickListener { poi ->
    // 获取 POI 的 Place ID
    val placeId = poi.placeId

    // 使用 Place ID 获取 POI 详情
    fetchPlaceDetails(placeId)
}

// 使用 FetchPlaceRequest 获取 POI 详情
private fun fetchPlaceDetails(placeId: String) {
    viewModelScope.launch {
        try {
            // 指定需要获取的 POI 信息字段
            val placeFields = listOf(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG)
            // 创建 FetchPlaceRequest 对象
            val request = FetchPlaceRequest.builder(placeId, placeFields).build()

            // 调用 Places API 获取 POI 详情
            val placeResponse = placesClient.fetchPlace(request).await()
            // 获取 POI 的经纬度
            val poiLatLng = placeResponse.place.latLng

            // 使用 poiLatLng,这是 POI 的精确经纬度
            Log.d("POI Details", "Name: ${placeResponse.place.name}, LatLng: $poiLatLng")

        } catch (e: Exception) {
            Log.e("MapViewModel", "Error fetching place details", e)
        }
    }
}

常见问题解答

1. 为什么我获取到的经纬度还是不准确?

请确保你的 Google Play 服务和 Google Maps SDK 版本是最新的,旧版本可能存在 bug 导致经纬度不准确。

2. 我需要为 Places API 付费吗?

Places API 调用是收费的,但 Google 提供了一定额度的免费配额,一般情况下足够开发者使用。

3. 我可以获取哪些 POI 信息?

Places API 可以获取 POI 的名称、地址、电话号码、网站、营业时间、评分等详细信息,具体可参考官方文档。

4. 如何提高 Places API 的调用效率?

可以通过缓存 POI 详细信息、使用 Place Autocomplete 服务等方式提高 Places API 的调用效率。

5. 除了 Kotlin,我还可以使用哪些语言开发 Google Maps 应用?

Google Maps SDK 支持 Java、Kotlin、C#、Swift 等多种编程语言。

总结

精准获取 POI 经纬度是 Google Maps 应用开发中的一个常见需求, setOnPoiClickListener 只能获取点击位置的经纬度,我们需要借助 Places APIFetchPlaceRequest 方法才能获取 POI 的精确经纬度信息。