调用第三方地图导航
2016-09-12 本文已影响96人
安卓小生
一、调用第三方地图之前
首先我们需要了解有哪些坐标系
- 第一种分类:
- GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度。
- GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。
- 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。
- 第二种分类:
- 经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。
- 墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大。
二、坐标转换
因为我要用的的百度地图和高德地图,所以我在这就获取他们对应的经纬度
- 百度API上取到的,是BD-09坐标,只适用于百度地图相关产品
- 高德地图采用的是GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”
因为高德地图不能设置坐标的类别,所以这里我统一使用GCJ-02坐标体系。因为我们的后台提供的是百度默认的坐标,也就是墨卡托坐标,所以在使用到坐标转换,将将BD-09转化为GCJ-02。
//将BD-09转化为GCJ-02
private final double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
private void fromBDtoGcJ(double bd_lat, double bd_lon) {
double x = bd_lon - 0.0065, y = bd_lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
longitude = z * Math.cos(theta);
latitude = z * Math.sin(theta);
}
获取的latitude和longitude就是GCJ-02的纬度和经度
三、判断是否安转地图客户端
if (isInstallByread("com.baidu.BaiduMap")) {
//百度
if (mapPop != null && mapPop.isShowing()) {
mapPop.dismiss();
mapPop = null;
} else {
selectMapPop(1, "百度地图");
}
} else if (isInstallByread("com.autonavi.minimap")) {
//高德
if (mapPop != null && mapPop.isShowing()) {
mapPop.dismiss();
mapPop = null;
} else {
selectMapPop(1, "高德地图");
} ```
#### 四、调用相关API
1. 百度地图
```java
private void openBaiduMap() {
try {
String intentStr = "intent://map/marker?" + "location=" + latitude + "," + longitude + "&title=目的位置" + "&content=" + detailAddress + "&coord_type=gcj02&src=thirdapp.marker.yourCompanyName.yourAppName#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end";
Intent intent = Intent.getIntent(intentStr);
//"intent://map/marker?location=39.972691,116.336313&title=目的位置& content=双天大厦&coord_type=gcj02& src=thirdapp.marker.yourCompanyName.yourAppName#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end"
startActivity(intent); //启动调用
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
其中latitude、longgitude、detailAddress是从服务端传来的数据,分别是维度、经度、地址名称
- 高德地图
private void openGaodeMap() {
try {
String intentStr = "androidamap://viewMap?sourceApplication=ACCA Helper&poiname=" + detailAddress + "&lat=" + latitude + "&lon=" + longitude + "&dev=0";
Intent intent = Intent.getIntent(intentStr);
//"androidamap://viewMap?sourceApplication=ACCA Helper&poiname=双天大厦&lat=39.972691&lon=116.336313&dev=0"
startActivity(intent); //启动调用
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
其中latitude、longgitude、detailAddress是从服务端传来的数据,分别是维度、经度、地址名称