com.hn.map.qq.PlaceSearch Maven / Gradle / Ivy
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