{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671508888662,"data":{"id":71713521,"title":"7.12.4 关键字搜索结果筛选","slug":"ooggd2","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"
关键字搜索功能在按类型(比如:美食、酒店、购物等)搜索场景下,支持对搜索下发的结果进行筛选。
筛选是以二次搜索的方式进行,上层首次按类型搜索时,AutoSDK将透出所支持的筛选参数,然后,通过获取筛选参数后发起二次搜索进行筛选过滤,从而下发满足用户需求的POI。
boolean com.autonavi.gbl.search.model.SearchKeywordParam.is_classify
备注:首次搜索时,将 is_classify 参数设置为 true,此时下发的数据中将返回筛选参数信息。
ArrayList<SearchPoiClassify> com.autonavi.gbl.search.model.SearchKeywordResult.classify
String com.autonavi.gbl.search.model.SearchKeywordParam.classify_data
备注:
int com.autonavi.gbl.search.SearchService.keyWordSearch(SearchKeywordParam param, IGSearchKeyWordObserver observer, @SearchMode.SearchMode1 int mode, int taskid)
备注:接口使用请参照文档:关键字搜索
public class SearchRequest\n{\n // 请求函数\n\tpublic void doKeywordSearch()\n {\n // 1. 获取自车位所在经纬度\n Coord2DDouble carPos = getCarLocation();\n \n // 2. 通过经纬度获取自车位所在城市编码\n MapDataService mapDataService = getMapDataService(); // 获取地图数据服务,com.autonavi.gbl.data.MapDataService\n int adCodeCarLoc = mapDataService.getAdcodeByLonLat(carPos.lon, arPos.lat);\n \n // 3. 根据搜索场景计算搜索中心poiLoc以及搜索城市编码adCode\n Coord2DDouble poiLoc;\n int adCode;\n switch (getSearchSceneType(1))\n {\n case SEARCH_SCENE_TYPE_ALONG_WAY:\n {\n /**< 沿途搜时以自车位为搜索中心点 */\n poiLoc = carPos;\n adCode = adCodeCarLoc;\n \tbreak;\n }\n default:\n {\n // 获取当前地图中心点坐标\n \tCoord2DDouble mapCenter = getMapCenter();\n int adCodeMapCenter;\n if (false == IsNetConnected) // 是否联网\n {\n \t/**< 离线时从当前搜索城市信息中获取adcode,例如选择在北京市离线搜索 */\n adCodeMapCenter = getOfflineSearchAdcode();\n }\n else\n {\n \tadCodeMapCenter = mapDataService.getAdcodeByLonLat(mapCenter.lon, mapCenter.lat);\n }\n \n if ((adCodeCarLoc == adCodeMapCenter) || (adCodeMapCenter<0))\n {\n \t/**< 自车位与图面中心点所在城市为同一城市或无法获取地图中心点adcode时, 框搜以自车位为搜索中心点 */\n poiLoc = carLoc;\n adCode = adCodeCarLoc\n }\n else\n {\n \t/**< 自车位与图面中心点所在城市不为同一城市, 框搜以图面中心点为搜索中心点 */\n poiLoc = mapCenter;\n adCode = adCodeMapCenter;\n }\n } \n }\n \n // 4. 构建参数\n SearchKeywordParam param;\n param.query_type = "TQUERY";\n param.keywords = "美食"; // 替换为输入框输入的搜索关键字\n param.adcode = adcode;\n param.city = adcode;\n /* 搜索中心点坐标 */\n param.poi_loc = poiLoc;\n /* 自车位坐标 */\n param.user_loc = carPos;\n param.search_operate = 1; // 框搜\n /* 获取框搜范围,对角线两个点的坐标 */\n param.geoobj = getGeoObj();\n param.pagesize = 10;\n\t\tparam.offlineResultMaxCount = 200;\n param.is_classify = true;\n \n // 5. 回调观察者\n SearchKeyWordObserver searchKeywordObserver = new SearchKeyWordObserver();\n \n // 6. 生成唯一的任务id\n taskId = 1;\n \n // 发起关键字搜索\n\t\tint iret = SearchService.keyWordSearch(param, searchKeywordObserver, SEARCH_MODE_ONLINE_ADVANCED, taskId);\n }\n \n // 获取自车位当前经纬度\n private Coord2DDouble getCarLocation()\n {\n Coord2DDouble carPos; // 自车位所在2D经度、纬度\n \tBizCarControl bizCarControl = getBizCarControl();\t// 获取车标类图层控制 com.autonavi.gbl.layer.BizCarControl\n CarLoc carLoc = bizCarControl.getCarPosition();\n if (carLoc.vecPathMatchInfo.size() > 0)\n {\n \tcarPos.lon = vecPathMatchInfo.get(0).longitude;\n carPos.lat = vecPathMatchInfo.get(0).latitude;\n }\n \n return carPos;\n }\n \n /* 获取地图中心点坐标 */\n private Coord2DDouble getMapCenter()\n {\n \tCoord3DDouble mapCenter3D;\n Coord2DDouble mapCenter;\n \n OperatorPosture operatorPosture = getOperatorPosture(); // 获取地图姿态操作接口, com.autonavi.gbl.map.OperatorPosture\n mapCenter3D = operatorPosture.getMapCenterByLonLat();\n \n mapCenter.lon = mapCenter3D.lon;\n mapCenter.lat = mapCenter3D.lat;\n \n return mapCenter;\n }\n \n /* 获取关键搜索场景 */\n \tpublic SearchSceneType getSearchSceneType(int i)\n {\n \tif (0 == i)\n {\n \treturn SEARCH_SCENE_TYPE_ALONG_WAY;\n }\n else if (1 == i)\n {\n \treturn SEARCH_SCENE_TYPE_NORMAL;\n }\n else\n {\n \treturn SEARCH_SCENE_TYPE_MAX;\n }\n }\n \n /* 将显示区域转换为对角线坐标字符串 */\n private String getGeoObj(Coord2DDouble carPos)\n {\n /* 自车位经纬度转地图P20坐标 */\n OperatorPosture operatorPosture = getOperatorPosture(); // 获取地图姿态操作接口,com.autonavi.gbl.map.OperatorPosture\n double mapX = operatorPosture.lonLatToMap(carPos.lon, carPos.lat).lon;\n double mapY = operatorPosture.lonLatToMap(carPos.lon, carPos.lat).lat;\n \n /* 获取当前显示的地图范围 */\n MapBound mapBound = operatorPosture.getMapBound();\n int width = mapBound.width / 2;\n int height = mapBound.height / 2;\n \n RectInt mapRect;\n mapRect.left = mapX - width;\n mapRect.right = mapX + width;\n mapRect.top = mapY - height;\n mapRect.bottom = mapY + height;\n \n Coord2DDouble leftTop;\n operatorPosture.mapToLonLat(mapRect.left, mapRect.top, leftTop.lon, leftTop.lat);\n Coord2DDouble bottomRight;\n operatorPosture.mapToLonLat(mapRect.right, mapRect.buttom, bottomRight.lon, bottomRight.lat);\n \n String geoobj;\n geoobj += leftTop.lon + "|" + leftTop.lat + "|" + bottomRight.lon + "|" + bottomRight.lat;\n \n return geoobj;\n }\n}
class SearchKeyWordObserver implements IGSearchKeyWordObserver {\n static public ArrayList<SearchPoiClassify> _classify;\t/**< 筛选数据 */\n @Override\n public void onGetKeyWordResult(int taskid, int euRet, SearchKeywordResult pstResult) {\n\n Log.i(TAG, "onGetKeyWordResult: ");\n Log.i(TAG, " taskid = " + taskid);\n Log.i(TAG, " euRet = " + euRet);\n if (stResult != null) {\n Log.i(TAG, " result = " + stResult.result);\n Log.i(TAG, " message = " + stResult.message);\n Log.i(TAG, " version = " + stResult.version);\n Log.i(TAG, " timestamp = " + stResult.timestamp);\n Log.i(TAG, " keyword = " + stResult.keyword);\n\n if (stResult.poiList != null && stResult.poiList.length > 0) {\n if (stResult.poiList[0].poi != null) {\n Log.i(TAG, " address = " + stResult.poiList[0].poi.address);\n Log.i(TAG, " poiid = " + stResult.poiList[0].poi.poiid);\n Log.i(TAG, " name = " + stResult.poiList[0].poi.name);\n \n // 该代码片段仅解释说明如何获取筛选数据\n if (stResult.classify.size() > 0){\n \tfor (SearchPoiClassify classify: stResult.classify){\n _classify.add(classify);\n }\n }\n }\n }\n }\n}
{\n "classify": [\n {\n "checkedvalue": "query_type=rqbxy;range=5000;is_uma=true;cur_adcode=350200",\n "category": [\n {\n "default": "0",\n "name": "500米",\n "value": "query_type=rqbxy;range=500;is_uma=true;cur_adcode=350200"\n },\n {\n "default": "0",\n "name": "1000米",\n "value": "query_type=rqbxy;range=1000;is_uma=true;cur_adcode=350200"\n },\n {\n "default": "0",\n "name": "2000米",\n "value": "query_type=rqbxy;range=2000;is_uma=true;cur_adcode=350200"\n },\n {\n "default": "0",\n "name": "5000米",\n "value": "query_type=rqbxy;range=5000;is_uma=true;cur_adcode=350200"\n },\n {\n "default": "1",\n "name": "全城",\n "value": "query_type=tquery;tquery_filterbox_flag=1;is_uma=true;cur_adcode=350200"\n }\n ],\n "name": "默认距离",\n "ctype": "range"\n },\n {\n "checkedvalue": "filter_keywords=美食",\n "category": [\n {\n "alias": "",\n "multiselect": "",\n "name": "全部分类",\n "value": "filter_keywords=美食",\n "display": ""\n },\n {\n "category": [\n {\n "alias": "",\n "name": "全部",\n "value": "filter_keywords=中餐馆"\n },\n {\n "alias": "",\n "name": "火锅",\n "value": "filter_keywords=火锅"\n },\n {\n "alias": "",\n "name": "自助餐",\n "value": "category=0501;custom=t_tag:自助餐"\n },\n {\n "alias": "",\n "name": "川菜",\n "value": "filter_keywords=川菜"\n },\n {\n "alias": "",\n "name": "湘菜",\n "value": "filter_keywords=湘菜"\n },\n {\n "alias": "",\n "name": "粤菜",\n "value": "filter_keywords=粤菜"\n },\n {\n "alias": "",\n "name": "上海菜",\n "value": "filter_keywords=上海菜"\n },\n {\n "alias": "",\n "name": "鲁菜",\n "value": "filter_keywords=鲁菜"\n },\n {\n "alias": "",\n "name": "东北菜",\n "value": "filter_keywords=东北菜"\n },\n {\n "alias": "",\n "name": "江浙菜",\n "value": "category=050105|050106"\n },\n {\n "alias": "",\n "name": "北京菜",\n "value": "filter_keywords=北京菜"\n },\n {\n "alias": "",\n "name": "云贵菜",\n "value": "filter_keywords=云贵菜"\n },\n {\n "alias": "",\n "name": "台湾菜",\n "value": "filter_keywords=台湾菜"\n },\n {\n "alias": "",\n "name": "湖北菜",\n "value": "filter_keywords=湖北菜"\n },\n {\n "alias": "",\n "name": "西北菜",\n "value": "filter_keywords=西北菜"\n },\n {\n "alias": "",\n "name": "安徽菜",\n "value": "filter_keywords=安徽菜"\n },\n {\n "alias": "",\n "name": "福建菜",\n "value": "filter_keywords=福建菜"\n },\n {\n "alias": "",\n "name": "潮州菜",\n "value": "filter_keywords=潮州菜"\n },\n {\n "alias": "",\n "name": "海鲜",\n "value": "filter_keywords=海鲜"\n },\n {\n "alias": "",\n "name": "素菜馆",\n "value": "filter_keywords=素菜馆"\n },\n {\n "alias": "",\n "name": "清真菜馆",\n "value": "filter_keywords=清真菜馆"\n },\n {\n "alias": "",\n "name": "老字号",\n "value": "filter_keywords=老字号"\n }\n ],\n "alias": "",\n "multiselect": "",\n "name": "中餐厅",\n "display": ""\n },\n {\n "category": [\n {\n "alias": "",\n "name": "全部",\n "value": "filter_keywords=西餐"\n },\n {\n "alias": "",\n "name": "牛排",\n "value": "filter_keywords=牛排"\n },\n {\n "alias": "",\n "name": "意大利菜",\n "value": "filter_keywords=意大利菜"\n },\n {\n "alias": "",\n "name": "法国菜",\n "value": "filter_keywords=法国菜"\n },\n {\n "alias": "",\n "name": "地中海菜",\n "value": "filter_keywords=地中海菜"\n },\n {\n "alias": "",\n "name": "美式风味",\n "value": "filter_keywords=美式风味"\n },\n {\n "alias": "",\n "name": "英国风味",\n "value": "filter_keywords=英国式菜品餐厅"\n },\n {\n "alias": "",\n "name": "俄国菜",\n "value": "filter_keywords=俄国菜"\n },\n {\n "alias": "",\n "name": "葡萄牙菜",\n "value": "filter_keywords=葡国餐馆"\n },\n {\n "alias": "",\n "name": "德国菜",\n "value": "filter_keywords=德国菜"\n },\n {\n "alias": "",\n "name": "巴西烤肉",\n "value": "filter_keywords=巴西烤肉"\n },\n {\n "alias": "",\n "name": "墨西哥菜",\n "value": "filter_keywords=墨西哥菜"\n }\n ],\n "alias": "",\n "multiselect": "",\n "name": "西餐厅",\n "display": ""\n },\n {\n "alias": "",\n "multiselect": "",\n "name": "日本料理",\n "value": "filter_keywords=日本料理",\n "display": ""\n },\n {\n "alias": "",\n "multiselect": "",\n "name": "韩国料理",\n "value": "filter_keywords=韩国料理",\n "display": ""\n },\n {\n "category": [\n {\n "alias": "",\n "name": "全部",\n "value": "filter_keywords=东南亚餐"\n },\n {\n "alias": "",\n "name": "泰国/越南菜",\n "value": "filter_keywords=泰国菜"\n },\n {\n "alias": "",\n "name": "印度菜",\n "value": "filter_keywords=印度菜"\n }\n ],\n "alias": "",\n "multiselect": "",\n "name": "东南亚餐厅",\n "display": ""\n },\n {\n "category": [\n {\n "alias": "",\n "name": "全部",\n "value": "filter_keywords=快餐厅"\n },\n {\n "alias": "",\n "name": "肯德基",\n "value": "filter_keywords=肯德基"\n },\n {\n "alias": "",\n "name": "麦当劳",\n "value": "filter_keywords=麦当劳"\n },\n {\n "alias": "",\n "name": "必胜客",\n "value": "filter_keywords=必胜客"\n },\n {\n "alias": "",\n "name": "茶餐厅",\n "value": "filter_keywords=茶餐厅"\n },\n {\n "alias": "",\n "name": "吉野家",\n "value": "filter_keywords=吉野家"\n },\n {\n "alias": "",\n "name": "大快活",\n "value": "filter_keywords=大快活"\n }\n ],\n "alias": "",\n "multiselect": "",\n "name": "快餐",\n "display": ""\n },\n {\n "alias": "",\n "multiselect": "",\n "name": "咖啡厅",\n "value": "filter_keywords=咖啡厅",\n "display": ""\n },\n {\n "alias": "",\n "multiselect": "",\n "name": "茶艺馆",\n "value": "filter_keywords=茶艺馆",\n "display": ""\n },\n {\n "alias": "",\n "multiselect": "",\n "name": "冷饮店",\n "value": "filter_keywords=冷饮店",\n "display": ""\n },\n {\n "alias": "",\n "multiselect": "",\n "name": "糕饼店",\n "value": "filter_keywords=糕饼店",\n "display": ""\n },\n {\n "alias": "",\n "multiselect": "",\n "name": "甜品店",\n "value": "filter_keywords=甜品店",\n "display": ""\n }\n ],\n "name": "全部分类",\n "ctype": "category"\n },\n {\n "checkedvalue": "sort_rule=0;reserved_keywords=true",\n "category": [\n {\n "name": "推荐排序",\n "value": "sort_rule=0;reserved_keywords=true"\n },\n {\n "name": "距离优先",\n "value": "sort_rule=1;reserved_keywords=true"\n },\n {\n "name": "好评优先",\n "value": "sort_rule=5;sort_fields=rating:d;reserved_keywords=true"\n },\n {\n "name": "低价优先",\n "value": "sort_rule=5;sort_fields=averagecost:a0;reserved_keywords=true"\n },\n {\n "name": "高价优先",\n "value": "sort_rule=5;sort_fields=averagecost:d;reserved_keywords=true"\n }\n ],\n "name": "排序",\n "ctype": "filter"\n }\n ]\n}
\npublic String getClassifyData(ArrayList<SearchPoiClassify> classify){\n\tString strRange = "";\t// 距离范围筛选数据\n String strType = "";\t// 全部分类筛选数据\n String strFilter = "";\t// 排序筛选数据\n \n for (SearchPoiClassify data: classify){\n \tif (data.ctype == "range"){\t\t\t\t// 获取距离范围筛选数据\n for (SearchClassifyCategory category: data.category){\n \tif (category.name == "5000米"){\n \tstrRange = category.value;\n }\n }\n }else if (data.ctype == "category"){\t// 获取全部分类筛选数据\n for (SearchClassifyCategory category: data.category){\n \tif (category.name == "西餐厅"){\n \tfor (SearchClassifyDetailCategory detailCategory: category.category){\n \tif (detailCategory.name == "牛排"){\n \tstrType = detailCategory.value;\n }\n }\n }\n }\n }else if (data.ctype == "filter"){\t\t// 获取排序筛选数据\n \tfor (SearchClassifyCategory category: data.category){\n \tif (category.name == "好评优先"){\n \tstrRange = category.value;\n }\n }\n }\n }\n \n return strRange + "+" + strType + "+" + strFilter;\n}
备注:当筛选数据有子分类时(如:西餐厅类型下有牛排、法国菜等子分类),筛选参数结果出现一系列category节点;当无子分类时(如:距离范围筛选数据),筛选参数结果出现value节点。
public class SearchRequest\n{\n // 请求函数\n public void doKeywordSearch()\n {\n // 1. 获取自车位所在经纬度\n Coord2DDouble carPos = getCarLocation();\n \n // 2. 通过经纬度获取自车位所在城市编码\n MapDataService mapDataService = getMapDataService(); // 获取地图数据服务,com.autonavi.gbl.data.MapDataService\n int adCodeCarLoc = mapDataService.getAdcodeByLonLat(carPos.lon, arPos.lat);\n \n // 3. 根据搜索场景计算搜索中心poiLoc以及搜索城市编码adCode\n Coord2DDouble poiLoc;\n int adCode;\n switch (getSearchSceneType(1))\n {\n case SEARCH_SCENE_TYPE_ALONG_WAY:\n {\n /**< 沿途搜时以自车位为搜索中心点 */\n poiLoc = carPos;\n adCode = adCodeCarLoc;\n break;\n }\n default:\n {\n // 获取当前地图中心点坐标\n Coord2DDouble mapCenter = getMapCenter();\n int adCodeMapCenter;\n if (false == IsNetConnected) // 是否联网\n {\n /**< 离线时从当前搜索城市信息中获取adcode,例如选择在北京市离线搜索 */\n adCodeMapCenter = getOfflineSearchAdcode();\n }\n else\n {\n adCodeMapCenter = mapDataService.getAdcodeByLonLat(mapCenter.lon, mapCenter.lat);\n }\n \n if ((adCodeCarLoc == adCodeMapCenter) || (adCodeMapCenter<0))\n {\n /**< 自车位与图面中心点所在城市为同一城市或无法获取地图中心点adcode时, 框搜以自车位为搜索中心点 */\n poiLoc = carLoc;\n adCode = adCodeCarLoc\n }\n else\n {\n /**< 自车位与图面中心点所在城市不为同一城市, 框搜以图面中心点为搜索中心点 */\n poiLoc = mapCenter;\n adCode = adCodeMapCenter;\n }\n } \n }\n \n // 4. 构建参数\n SearchKeywordParam param;\n param.query_type = "TQUERY";\n param.keywords = "美食"; // 替换为输入框输入的搜索关键字\n param.adcode = adcode;\n param.city = adcode;\n /* 搜索中心点坐标 */\n param.poi_loc = poiLoc;\n /* 自车位坐标 */\n param.user_loc = carPos;\n param.search_operate = 1; // 框搜\n /* 获取框搜范围,对角线两个点的坐标 */\n param.geoobj = getGeoObj();\n param.pagesize = 10;\n param.offlineResultMaxCount = 200;\n param.is_classify = true;\n \n // 获取筛选参数\n param.classify_data = getClassifyData(SearchKeyWordObserver._classify);\n \n // 5. 回调观察者\n SearchKeyWordObserver searchKeywordObserver = new SearchKeyWordObserver();\n \n // 6. 生成唯一的任务id\n taskId = 1;\n \n // 发起关键字搜索\n int iret = SearchService.keyWordSearch(param, searchKeywordObserver, SEARCH_MODE_ONLINE_ADVANCED, taskId);\n }\n}