如何在Android版Google Maps Autocomplete API中识别品牌或连锁场所?
如何在Android版Google Maps Autocomplete API中识别品牌或连锁场所?
嘿,我来给你唠唠怎么在Android的Google Maps Autocomplete API里识别品牌或者连锁场所哈~其实API本身就藏着对应的方法,咱结合代码一步步来:
首先,你得知道Autocomplete返回的预测结果里,每个AutocompletePrediction对象能给你一些初步线索,然后再通过Place ID去拉取详细信息,就能确认是不是品牌/连锁场所了。
第一步:先从Autocomplete预测结果里筛选潜在目标
当你发起Autocomplete请求拿到响应后,先给每个预测项做个初步筛选:看它的placeTypes里有没有Place.TYPE_ESTABLISHMENT(商业场所)、Place.TYPE_RESTAURANT这类类型——有这些类型的,大概率是我们要找的场所类地点,先把它们挑出来。
第二步:通过Place ID获取品牌详情
光靠预测结果的类型还不够精准,咱得用预测项里的placeId调用Fetch Place API,专门请求Place.Field.BRAND这个字段。如果返回的Place对象里brand属性不为空,那妥妥就是品牌/连锁场所了,还能直接拿到品牌的官方名称~
咱把你给的代码补全一下,看看具体怎么实现:
fun autocomplete( query: String, latLng: LatLng?, onSuccessListener: OnSuccessListener? = null, onFailureListener: OnFailureListener? = null, ) { val client = Places.createClient(applicationContext) val nearby = biasDistanceMeters?.let { distance -> latLng?.let { val kilometers = distance / 1_000.0 rectangularBounds(latLng, kilometers) } } val request = FindAutocompletePredictionsRequest.builder() .setQuery(query) .setOrigin(latLng) .setLocationBias(nearby) // 把附近区域作为搜索偏向 .build() // 发起Autocomplete请求 client.findAutocompletePredictions(request) .addOnSuccessListener { response -> // 遍历所有预测结果 for (prediction in response.autocompletePredictions) { val placeId = prediction.placeId // 先判断类型,筛选潜在场所 if (prediction.placeTypes.contains(Place.TYPE_ESTABLISHMENT)) { // 拉取详细场所信息,确认品牌 fetchBrandPlaceDetails(client, placeId) } } onSuccessListener?.onSuccess(response) } .addOnFailureListener { exception -> onFailureListener?.onFailure(exception) } } // 拉取场所详细信息,提取品牌 private fun fetchBrandPlaceDetails(client: PlacesClient, placeId: String) { // 指定需要拉取的字段,必须包含BRAND val requiredFields = listOf( Place.Field.ID, Place.Field.NAME, Place.Field.BRAND, Place.Field.TYPES ) val fetchRequest = FetchPlaceRequest.newInstance(placeId, requiredFields) client.fetchPlace(fetchRequest) .addOnSuccessListener { response -> val targetPlace = response.place // 检查是否有品牌信息 targetPlace.brand?.let { brandInfo -> // 这里就是识别到的品牌/连锁场所啦 println("找到品牌场所:${targetPlace.name},所属品牌:${brandInfo.name}") } ?: run { // 没有品牌信息,大概率是独立场所 println("这是独立场所:${targetPlace.name}") } } .addOnFailureListener { exception -> println("拉取场所详情失败:${exception.message}") } }
小提醒
有些小连锁可能没有完善的品牌信息,这时候你也可以结合场所名称来辅助判断(比如名称里重复出现的品牌关键词),但最靠谱的还是依赖Place.Field.BRAND返回的官方数据,毕竟这是Google Places数据库里的权威信息。
备注:内容来源于stack exchange,提问作者Shreyas S Y
相关产品推荐
相关产品推荐

