基于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
相关产品推荐
相关产品推荐

