调用第三方地图导航

作者: 安卓小生 | 来源:发表于2016-09-12 18:29 被阅读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是从服务端传来的数据,分别是维度、经度、地址名称

    1. 高德地图
      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是从服务端传来的数据,分别是维度、经度、地址名称

    相关文章

      网友评论

        本文标题:调用第三方地图导航

        本文链接:https://www.haomeiwen.com/subject/pegpettx.html