{"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}


","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-07-05 01:55:42","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":153,"collectCount":0,"estimateDate":52,"docStatus":0,"permissions":true,"overView":false}}