All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hn.map.qq.PlaceSearch Maven / Gradle / Ivy

There is a newer version: 1.0.18
Show newest version
package com.hn.map.qq;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.hn.map.MapException;
import com.hn.map.qq.domain.QqMapResult;
import lombok.Data;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 描述:
 *
 * @author fei
 * 2019-12-31 09:10
 */
public class PlaceSearch {
    private static final Log log = LogFactory.get();

    /**
     * 地点搜索
     *
     * @param param {@link Param}
     * @return qqMapResult {@link QqMapResult}
     */
    public static QqMapResult search(Param param) {
        param.setOrderBy("_distance");
        param.setKey("54YBZ-DY66P-3MLDM-LRSTY-SV4VZ-IXBAH");
        String resultStr = HttpUtil.get("https://apis.map.qq.com/ws/place/v1/search", param.toMap());
        log.debug("【腾讯地图】地点搜索 返回结果:{}", resultStr);
        QqMapResult result = JSONUtil.toBean(resultStr, QqMapResult.class);
        if (0 == result.getStatus()) {
            return result;
        }
        throw new MapException("【腾讯地图】地点搜索失败:" + result.getMessage());
    }

    public static List search(String cityName, String keyWord,
                                          Integer pageIndex, Integer pageSIze) {
        Param param = new Param();
        param.setBoundary("region(" + cityName + ",0)");
        param.setKeyword(keyWord);
        param.setPageIndex(pageIndex);
        param.setPageSize(pageSIze);
        param.setOrderBy("_distance");
        QqMapResult search = search(param);
        return JSONUtil.toList(JSONUtil.parseArray(search.getData()), ResultData.class);
    }

    /**
     * @param provinceName 省名
     * @param keyWord      关键字
     * @param pageIndex 第x页,默认第1页
     * @param pageSIze 每页条目数,最大限制为20条
     * @return List {@link Cluster}
     */
    public static List count(String provinceName, String keyWord,
                                         Integer pageIndex, Integer pageSIze) {
        Param param = new Param();
        if (StrUtil.isBlank(provinceName)) {
            provinceName = "全国";
        }
        param.setBoundary("region(" + provinceName + ",0)");
        param.setKeyword(keyWord);
        param.setPageIndex(pageIndex);
        param.setPageSize(pageSIze);
        param.setOrderBy("_distance");
        QqMapResult search = search(param);
        return JSONUtil.toList(JSONUtil.parseArray(search.getCluster()), Cluster.class);
    }

    @Data
    public static class Param {
        /**
         * 必填
         * POI搜索关键字,用于全文检索字段
         * keyword=酒店,注意键值要进行URL编码(推荐encodeURI),如keyword=%e9%85%92%e5%ba%97
         */
        private String keyword;

        /**
         * 必填
         * 搜索地理范围
         * 示例1,指定地区名称,不自动扩大范围:
         * boundary=region(北京,0)
         * 示例2,周边搜索(圆形范围):boundary=nearby(39.908491,116.374328,1000)
         * 示例3,矩形区域范围:boundary=rectangle(39.9072,116.3689,39.9149,116.3793)
         */
        private String boundary;

        /**
         * 筛选条件:
         * 最多支持五个分类
         */
        private String filter;

        /**
         * 排序,目前仅周边搜索(boundary=nearby)
         * 支持按距离由近到远排序,取值:_distance
         * orderby=_distance
         */
        private String orderBy;

        /**
         * 每页条目数,最大限制为20条
         */
        private Integer pageSize;

        /**
         * 第x页,默认第1页
         */
        private Integer pageIndex;

        /**
         * 开发密钥(Key)
         */
        private String key;

        /**
         * 返回格式:
         * 支持JSON/JSONP,默认JSON
         */
        private String output;

        /**
         * JSONP方式回调函数
         * callback=function1
         */
        private String callback;

        public Map toMap() {
            Map map = new HashMap<>(9);
            map.put("keyword", keyword);
            map.put("boundary", boundary);
            map.put("filter", filter);
            map.put("orderby", orderBy);
            map.put("page_size", pageSize);
            map.put("page_index", pageIndex);
            map.put("key", key);
            map.put("output", output);
            map.put("callback", callback);
            return map;
        }
    }

    @Data
    public static class ResultData {

        /**
         * POI唯一标识
         */
        private String id;
        /**
         * POI名称
         */
        private String title;
        /**
         * 地址
         */
        private String address;
        /**
         * 电话
         */
        private String tel;
        /**
         * POI分类
         */
        private String category;
        /**
         * POI类型,值说明:0:普通POI / 1:公交车站 / 2:地铁站 / 3:公交线路 / 4:行政区划
         */
        private Integer type;
        /**
         * 坐标
         * location.get("lat");纬度
         * location.get("lng");经度
         */
        private Map location;
        /**
         * 行政区划信息,目前仅提供adcode
         * ad_info.get("adcode");行政区划代码
         */
        private Map ad_info;
        /**
         * 该POI的街景最佳查看场景及视角信息
         * id	    string	是	街景场景ID,若有pano信息,则ID一定存在
         * heading	number	否	最佳偏航角(与正北方向夹角,街景相关知识请 点击查看)
         * pitch	number	否	俯仰角
         * zoom	    number	否	缩放级别
         */
        private Map pano;

        /**
         * 地址解析 {@link Cluster}
         */
        private List cluster;
    }

    @Data
    public static class Cluster {
        /**
         * 城市名称
         */
        private String title;
        /**
         * 根据搜索条件,在该城市搜到的结果数
         */
        private Integer count;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy