You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Google Maps API实现Kotlin项目指定半径内区域搜索求助

Kotlin集成Google Maps API搜索周边城镇/县区指南

一、前期准备

  • 在Google Cloud控制台启用Places API,获取有效的API密钥
  • 在Module级别的build.gradle中添加依赖:
dependencies {
    implementation 'com.google.android.gms:play-services-maps:18.2.0'
    implementation 'com.google.android.gms:play-services-places:17.0.0'
    implementation 'com.android.volley:volley:1.2.1' // 用于处理网络请求
}

二、构建周边搜索请求

使用Google Places的Nearby Search API,按地理范围筛选城镇、县区这类行政区域。核心参数包括定位坐标、50公里半径(50000米)、目标地点类型。

示例请求代码(基于Volley)

import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import org.json.JSONObject

// 假设已通过设备定位获取到经纬度
val deviceLat = 31.2304
val deviceLng = 121.4737
val apiKey = "YOUR_API_KEY"
val radius = 50000 // 单位:米,对应50公里

// 拼接请求URL:筛选locality(城镇)、administrative_area_level_3(县区)类型
val searchUrl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?" +
        "location=$deviceLat,$deviceLng" +
        "&radius=$radius" +
        "&type=locality,administrative_area_level_3" +
        "&key=$apiKey"

val requestQueue = Volley.newRequestQueue(context)
val searchRequest = JsonObjectRequest(
    Request.Method.GET, searchUrl, null,
    { response ->
        // 解析响应数据
        val locationList = parseSearchResponse(response)
        // 后续处理位置列表,比如展示UI
    },
    { error ->
        error.printStackTrace()
    }
)
requestQueue.add(searchRequest)

三、解析响应为位置列表

先定义数据类存储位置信息,再解析JSON响应中的results数组:

1. 位置数据类

data class AdministrativeLocation(
    val name: String,
    val address: String,
    val latitude: Double,
    val longitude: Double
)

2. 响应解析函数

import org.json.JSONArray
import org.json.JSONObject

fun parseSearchResponse(response: JSONObject): List<AdministrativeLocation> {
    val locationList = mutableListOf<AdministrativeLocation>()
    val resultsArray = response.getJSONArray("results")

    for (i in 0 until resultsArray.length()) {
        val placeObj = resultsArray.getJSONObject(i)
        val name = placeObj.getString("name")
        val address = placeObj.getString("vicinity")
        val geometry = placeObj.getJSONObject("geometry")
        val location = geometry.getJSONObject("location")
        val lat = location.getDouble("lat")
        val lng = location.getDouble("lng")

        locationList.add(AdministrativeLocation(name, address, lat, lng))
    }

    // 处理分页:单次请求最多返回20条,若有更多结果需用next_page_token续请求
    val nextToken = response.optString("next_page_token", null)
    if (nextToken != null) {
        // 需延迟1-2秒再发起下一页请求(API限制),可通过Handler实现
    }

    return locationList
}

关键注意事项

  • API配额:Google Places API有请求配额限制,开发阶段需关注控制台的使用量
  • 类型调整:若需扩大范围,可添加administrative_area_level_2(地级市)类型;如需更精准,可只保留单一类型
  • 分页逻辑:单次请求最多返回20条结果,若存在next_page_token,必须延迟后再发起续请求,否则会返回无效响应
  • 权限要求:确保已申请ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限,用于获取设备定位

内容的提问来源于stack exchange,提问作者Martim Fernandes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:25:16