百度地图开放平台
更新时间: 2026/09/10 16:28
POI检索热词联想
简介

suggestion 提供 POI 关键词联想补全能力:根据用户输入的片段返回匹配的地点建议,常用于搜索框的输入提示。
SDK 已固定 ret_coordtype=gcj02ll,返回的 location 可直接用于小程序地图,无需再做坐标转换。

请求参数
参数类型必填默认值说明

query

String

用户输入的关键字

region

String

全国

检索城市,如"北京"或城市编码

city_limit

Boolean

false

是否限制在 region 内检索

output

String

json

返回格式

success

Function

检索成功回调

fail

Function

检索失败回调

其余参数与地点详情检索请求参数一致,会原样透传。

返回值

success 回调入参:

字段类型说明

result

Array

联想结果数组(取自 originalData.result),元素字段见下表

originalData

Object

Place Suggestion API 返回的完整原始数据

result 数组元素常见字段:

字段类型说明

name

String

地点名称

address

String

地址描述

city

String

所属城市

district

String

所属区县

location

Object

经纬度 { lat, lng }(gcj02,可直接用于小程序地图)

其余字段

与 Place Suggestion API 返回一致(如 uid、province),建议以 originalData 为准

失败时走 fail 回调,入参统一为 { errMsg, message, statusCode, rawMessage },字段含义见"服务介绍 → 统一的回调约定"。

示例代码

监听输入框内容,实时展示联想结果:

// pages/index/index.js
// 引用百度地图微信小程序 JSAPI 模块
const { BMapWX } = require('../../libs/bmap-wx.min.js');
const bmap = new BMapWX({ ak: '您的ak' });
Page({
data: {
keyword: '',
suggestions: [],
error: '',
},
onKeywordInput(e) {
const keyword = e.detail.value.trim();
this.setData({ keyword: e.detail.value, error: '' });
if (!keyword) {
this.setData({ suggestions: [] });
return;
}
bmap.suggestion({
query: keyword,
region: '北京',
city_limit: true,
success: res => this.setData({ suggestions: res.result || [] }),
fail: err => this.setData({ error: '联想失败:' + (err.message || err.errMsg) }),
});
},
});
<!-- pages/index/index.wxml -->
<input
placeholder="输入关键字,如:天安门"
auto-focus
value="{{keyword}}"
bindinput="onKeywordInput"
/>
<view wx:for="{{suggestions}}" wx:key="index">
<text>{{item.name}}</text>
<text>{{item.city}}{{item.district}} {{item.address}}</text>
</view>
<view wx:if="{{error}}">{{error}}</view>
Demo 效果与体验

下图为官方 Demo"关键词联想"的运行界面,扫描下方小程序码即可直接体验。Demo 是产品化示例,界面比上面的示例代码精致,但调用方式与返回数据完全一致。

进阶:防抖与请求竞态
上面的最小示例每次按键都会发一次请求。真实项目中必须补上防抖和请求序号:否则一是配额消耗成倍增加,二是先发后到的响应会把结果回退到旧关键词。
// pages/index/index.js
let timer = null; // 输入防抖
let token = 0; // 请求序号,用于丢弃过期响应
Page({
onKeywordInput(e) {
const keyword = e.detail.value.trim();
this.setData({ keyword: e.detail.value });
clearTimeout(timer);
if (!keyword) {
this.setData({ suggestions: [] });
return;
}
// 停止输入 300ms 后才真正发起请求
timer = setTimeout(() => {
const current = ++token;
bmap.suggestion({
query: keyword,
region: '北京',
city_limit: true,
success: (res) => {
// 先发后到的响应会让结果回退到旧关键词,直接丢弃
if (current !== token) { return; }
this.setData({ suggestions: res.result || [] });
},
});
}, 300);
},
onUnload() {
clearTimeout(timer); // 页面卸载时清理,避免在已销毁实例上 setData
},
});
注意事项
  • query 为空时不要发起请求,接口会返回参数错误。

  • 需要限定城市时同时传 region 与 city_limit: true;只传 region 仍可能返回其他城市结果。

  • 联想结果不含电话等详情,如需完整 POI 信息,可用选中项的 name 再调用 search

上一篇

POI检索

下一篇

地址解析
本篇文章对您是否有帮助?