一个比较好用的地图搜索


本来其实打算在项目中把百度地图用到底的,但是无奈百度地图的搜索简直太坑爹,搜索结果偏差,搜索结果定位错误,搜索结果。。。压根搜索不到。

最好另寻出路,找到了高德的搜索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等小类都会被包含

下载POI分类编码和城市编码表

当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();

}