本来其实打算在项目中把百度地图用到底的,但是无奈百度地图的搜索简直太坑爹,搜索结果偏差,搜索结果定位错误,搜索结果。。。压根搜索不到。
最好另寻出路,找到了高德的搜索API,相比之下,简直好用无数倍,秒杀百度地图的搜索,外加定制功能,非常好用。
API地址
https://market.aliyun.com/products/56928004/cmapi020536.html
在注册后获得AppCode,AppSecret,AppKey.在认证时API给出了2套身份认证方案,一是采用APPCode认证,二是采用AppSecret+AppKey认证。
以下采用第二种方案。
OkHttpClient client = new OkHttpClient();
String url = "http://search.market.alicloudapi.com/v3/place/text?city=" + mcity + "&keywords=" + keyword + "&page=1&types=190000";
Request request = new Request.Builder()
.url(url)
.addHeader("Authorization", "APPCODE")
.addHeader("Content-Type", "application/json; charset=utf-8")
.addHeader("X-Ca-Key", "")
.build();
//模型
try {
Response response = client.newCall(request).execute();
Gson gson = new Gson();
//模型 = gson.fromJson(response.body().string(),//模型);
} catch (IOException e) {
e.printStackTrace();
}
调用过程并不复杂,只要在Header中加入认证相关内容即可,其中X-Ca-Key填入AppCode。
URL中type即为高德搜索结果定制功能。根据官网说明:
多个类型用“|”分割;
可选值:分类代码 或 汉字 (若用汉字,请严格按照附件之中的汉字填写)
分类代码由六位数字组成,一共分为三个部分,前两个数字代表大类;中间两个数字代表中类;最后两个数字代表小类。
若指定了某个大类,则所属的中类、小类都会被显示。
例如:010000为汽车服务(大类)
010100为加油站(中类)
010101为中国石化(小类)
010900为汽车租赁(中类)
010901为汽车租赁还车(小类)
当指定010000,则010100等中类、010101等小类都会被包含。
当指定010900,则010901等小类都会被包含
当keywords和types均为空的时候,默认指定types为050000(餐饮服务)、070000(生活服务)、120000(商务住宅)
搜索结果部分,模型也是固定的参数
private String status;
private String count;
private String info;
private String infocode;
private List<PoisBean> pois;
PoisBean
private String id;
private String name;
private String type;
private String typecode;
private String address;
private String location;
private String pname;
private String cityname;
private String adname;
private String shopinfo;
最后附上高德坐标转百度坐标的方法
private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
/**
* 将火星坐标转变成百度坐标
*
* @param lngLat_gd 火星坐标(高德、腾讯地图坐标等)
* @return 百度坐标
*/
public static LatLng bd_encrypt(String lngLat_gd) {
String[] locationarray = lngLat_gd.split(",");
double x = Double.parseDouble(locationarray[1]),
y = Double.parseDouble(locationarray[0]);
double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
return new LatLng(dataDigit(6, z * cos(theta) + 0.0065), dataDigit(6, z * sin(theta) + 0.006));
}
/**
* 对double类型数据保留小数点后多少位
* 高德地图转码返回的就是 小数点后6位,为了统一封装一下
*
* @param digit 位数
* @param in 输入
* @return 保留小数位后的数
*/
static double dataDigit(int digit, double in) {
return new BigDecimal(in).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
}