百度地图,高德地图定位

<template>
  <div class="container">
    <div class="top">
      <div class="addr">
        <svg-icon icon-class="location" style="width: 16px; height: 16px" />{{
          dingAddress
        }}
      </div>
      <van-loading color="#587bf7" size="24" v-if="GeoLoading"
        >定位中...</van-loading
      >
      <div class="refs" @click="loadAmap" v-if="!GeoLoading">重新定位</div>
    </div>
  </div>
</template>

<script>
import {
  NavBar,
  Toast,
  Button,
  Tabbar,
  TabbarItem,
  Grid,
  GridItem,
  Loading,
} from "vant";
import { mapActions, mapMutations, mapState } from "vuex"; // createNamespacedHelpers
import FooterTabbar from "components/FooterTabbar";
import { eventList } from "@/api/event";

import { getInfo, eventMessageList } from "@/api/user";
import { setToken } from "@/utils/auth";
import BMap from "BMap";
import { GaoDeMap, GPS } from "@/utils/map.js";


export default {
  name: "home",
  data() {
    return {
      GeoLoading: true,
      value: 1,
      NumMesaage: 0,
      dingAddress: "",
      lng: "",
      lat: "",
      page: 1,
    };
  },
  components: {
    [Button.name]: Button,
    [Tabbar.name]: Tabbar,
    [TabbarItem.name]: TabbarItem,
    [Grid.name]: Grid,
    [GridItem.name]: GridItem,
    [NavBar.name]: NavBar,
    FooterTabbar,
    [Loading.name]: Loading,
  },
  computed: {},
  async created() {
    const token = this.$route.query.token;
    if (token) {
      this.getUserInfo(token);
    } else {
      this.getNum();
      // this.getLocaltion();
      this.loadAmap();
    }
  },
  methods: {
    goPage(name) {
      this.$router.push({
        path: name,
        query: {
          // status: val,
        },
      });
    },
    onClickLeft() {
      // Toast("返回");
    },

    //根据token获取用户信息
    async getUserInfo(token) {
      setToken(token);
      await getInfo(token);
      this.goToEventList(0);
    },

    //-------------------------------------------------定位start
    // refreshAddr() {
    //   this.getLocaltion();
    //   this.getNum();
    // },
    // getLocaltion() {
    //   navigator.geolocation.getCurrentPosition(this.show, this.localtionError, {
    //     enableHighAccuracy: true,
    //     timeout: 2000,
    //     maximumAge: 60 * 1000,
    //   });
    // },
    // show(position) {
    //   console.log(position);
    //   this.lng = position.coords.longitude;
    //   this.lat = position.coords.latitude;
    //   let newPoint = new BMap.Point(this.lng, this.lat);
    //   let gc = new BMap.Geocoder();
    //   gc.getLocation(newPoint, (rs) => {
    //     this.dingAddress = rs.address;
    //   });
    // },
    // localtionError(error) {
    //   console.log(error.code);
    //   this.dingAddress = "无法获取位置信息";
    // },
    //-------------------------------------------------定位end
    //---------------------------------定位新
    loadAmap() {
      let _this = this;
      _this.GeoLoading = true;
      GaoDeMap.init().then((AMap) => {
        AMap.plugin("AMap.Geolocation", function () {
          var geolocation = new AMap.Geolocation({
            // 是否使用高精度定位,默认:true
            enableHighAccuracy: true,
            // 设置定位超时时间,默认:无穷大
            timeout: 10000,
          });
          geolocation.getCurrentPosition(function (status, result) {
            if (status === "complete") {
              onComplete(result);
            } else {
              onError(result);
            }
          });

          function onComplete(data) {
            // data是具体的定位信息
            let aTOb = GPS.bd_encrypt(data.position.lat, data.position.lng);
            _this.lng = aTOb.lon;
            _this.lat = aTOb.lat;
            _this.getAddressByGD(data.position.lng, data.position.lat);
            _this.GeoLoading = false;
          }

          function onError(data) {
            // 定位出错
            _this.GeoLoading = false;
            _this.lng = "";
            _this.lat = "";
            _this.dingAddress = "无法获取位置信息";
            // 调用ip定位
          }
        });
      });
    },
    getAddressByGD(lng, lat) {
      let _this = this;
      var lnglat = new AMap.LngLat(lng, lat);
      AMap.plugin("AMap.Geocoder", function () {
        var geocoder = new AMap.Geocoder({
          radius: 500,
          extensions: "all",
        });
        geocoder.getAddress(lnglat, function (status, result) {
          if (status === "complete" && result.info === "OK") {
            _this.dingAddress = result.regeocode.formattedAddress;
          }
        });
      });
    },
  },
};
</script>
<style lang="scss" scoped>
.container {
  height: auto;
  width: 100%;
  padding-bottom: 50px;
  background-color: #f2f2f2;
}
.top {
  display: flex;
  background-color: #ffffff;
  padding: 15px 20px;
  height: 20%;
  background: rgb(88, 123, 247);
  flex-flow: column;
  color: #fff;
  font-size: 24px;

  .addr {
    margin: 20px 0;
  }
  .refs {
    margin-left: 32px;
  }
  .alrm {
    margin-left: 32px;
    margin-top: 40px;
    span {
      color: yellow;
      font-size: 30px;
      font-weight: bold;
    }
  }
}
.nav-box {
  margin: 0 20px;
  // height: 186px;
  height: 13%;
  background: #fff;
  margin-top: -40px;
  padding: 0 20px;
}
.alrm-box {
  margin: 0 20px;
  background: #fff;
  margin-top: 16px;
  padding: 0 20px;
  height: 100%;
  .alrm-box-head {
    display: flex;
    align-items: center;
    font-size: 14px;
    justify-content: space-between;
  }
  .alrm-box-list {
    height: 100%;
    overflow-y: auto;
    display: flex;
    flex-flow: column;
    border-top: 1px solid #c4b9b9;
    .list-sub {
      .list-sub-top {
        display: flex;
        justify-content: space-between;
        border-bottom: 1px solid #c4b9b9;
        padding-top: 6px;
        padding-bottom: 14px;
        .alrm-status {
          background: #5dbcfc;
          color: #fff;
          padding: 6px 12px;
          border-radius: 6px;
        }
      }
      .list-sub-bottom {
        display: flex;
        flex-flow: column;
        border-bottom: 1px solid #c4b9b9;

        .list-sub-bottom-adr {
          display: flex;
          justify-content: space-between;
          padding: 20px 0;
          .time-status {
            color: red;
          }
        }
        .list-sub-bottom-tis {
          display: flex;
          justify-content: space-between;
          padding-bottom: 30px;
          .tis-date {
            color: #918d8d;
          }
        }
      }
    }
  }
}
.banner {
  width: 100%;
  height: calc(100vh - 150px);
  text-align: center;
  background: #ffffff;
  img {
    width: 730px;
    height: 450px;
  }
}
.grid-list-btn {
  .title {
    margin-top: 8px;
    color: #fff;
    font-size: 28px;
  }
}
.now-value {
  padding: 0 15px;
  box-sizing: border-box;
  font-size: 16px;
  // line-height: 30px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.icon-list {
  margin: 15px;
  font-size: 24px;
  .icon {
    margin: 0 10px;
  }
}
.buttons {
  padding: 0 15px;
  font-size: 18px;
  width: 100%;
  box-sizing: border-box;
  display: flex;
  justify-content: space-around;
  align-items: center;
  a {
    color: #333;
  }
}
</style>
export const BaiduMap = {
    init: function() {
        const BMapURL = 'http://api.map.baidu.com/api?v=3.0&ak=yr0FTvMYAK8tpkRjILGk7TihbmCfoeC1&callback=bMapInit'
     return new Promise((resolve, reject) => {
            // 如果已加载直接返回
            if (typeof BMap !== 'undefined') {
                resolve(BMap)
                return true
            }
            // 百度地图异步加载回调处理
            window.bMapInit = function() {
                console.log('百度地图脚本初始化成功...')
                resolve(BMap)
            };
            // 插入script脚本
            let scriptNode = document.createElement('script')
            scriptNode.setAttribute('type', 'text/javascript')
            scriptNode.setAttribute('src', BMapURL)
            document.body.appendChild(scriptNode)
        })
    }
}

export const GaoDeMap = {
    init: function() {
        const AMapURL = 'https://webapi.amap.com/maps?v=2.0&key=0b7594eeeaced4d3866313551e443ed3&plugin=AMap.Geocoder&callback=AMapInit'
     return new Promise((resolve, reject) => {
            // 如果已加载直接返回
            if (typeof AMap !== 'undefined') {
                resolve(AMap)
                return true
            }
            // 百度地图异步加载回调处理
            window.AMapInit = function() {
                console.log('高德地图脚本初始化成功...')
                resolve(AMap)
            };
            // 插入script脚本
            let scriptNode = document.createElement('script')
            scriptNode.setAttribute('type', 'text/javascript')
            scriptNode.setAttribute('src', AMapURL)
            document.body.appendChild(scriptNode)
        })
    }
}

export const GPS = {
    PI : 3.14159265358979324,
    x_pi : 3.14159265358979324 * 3000.0 / 180.0,
    delta : function (lat, lon) {
        // Krasovsky 1940
        //
        // a = 6378245.0, 1/f = 298.3
        // b = a * (1 - f)
        // ee = (a^2 - b^2) / a^2;
        var a = 6378245.0; //  a: 卫星椭球坐标投影到平面地图坐标系的投影因子。
        var ee = 0.00669342162296594323; //  ee: 椭球的偏心率。
        var dLat = this.transformLat(lon - 105.0, lat - 35.0);
        var dLon = this.transformLon(lon - 105.0, lat - 35.0);
        var radLat = lat / 180.0 * this.PI;
        var magic = Math.sin(radLat);
        magic = 1 - ee * magic * magic;
        var sqrtMagic = Math.sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * this.PI);
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * this.PI);
        return {'lat': dLat, 'lon': dLon};
    },

    //WGS-84 to GCJ-02
    gcj_encrypt : function (wgsLat, wgsLon) {
        if (this.outOfChina(wgsLat, wgsLon))
            return {'lat': wgsLat, 'lon': wgsLon};

        var d = this.delta(wgsLat, wgsLon);
        return {'lat' : wgsLat + d.lat,'lon' : wgsLon + d.lon};
    },
    //GCJ-02 to WGS-84
    gcj_decrypt : function (gcjLat, gcjLon) {
        if (this.outOfChina(gcjLat, gcjLon))
            return {'lat': gcjLat, 'lon': gcjLon};

        var d = this.delta(gcjLat, gcjLon);
        return {'lat': gcjLat - d.lat, 'lon': gcjLon - d.lon};
    },
    //GCJ-02 to WGS-84 exactly
    gcj_decrypt_exact : function (gcjLat, gcjLon) {
        var initDelta = 0.01;
        var threshold = 0.000000001;
        var dLat = initDelta, dLon = initDelta;
        var mLat = gcjLat - dLat, mLon = gcjLon - dLon;
        var pLat = gcjLat + dLat, pLon = gcjLon + dLon;
        var wgsLat, wgsLon, i = 0;
        while (1) {
            wgsLat = (mLat + pLat) / 2;
            wgsLon = (mLon + pLon) / 2;
            var tmp = this.gcj_encrypt(wgsLat, wgsLon)
            dLat = tmp.lat - gcjLat;
            dLon = tmp.lon - gcjLon;
            if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold))
                break;

            if (dLat > 0) pLat = wgsLat; else mLat = wgsLat;
            if (dLon > 0) pLon = wgsLon; else mLon = wgsLon;

            if (++i > 10000) break;
        }
        //console.log(i);
        return {'lat': wgsLat, 'lon': wgsLon};
    },
    //GCJ-02 to BD-09
    bd_encrypt : function (gcjLat, gcjLon) {
        var x = gcjLon, y = gcjLat;
        var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi);
        var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi);
        var bdLon = z * Math.cos(theta) + 0.0065;
        var bdLat = z * Math.sin(theta) + 0.006;
        return {'lat' : bdLat,'lon' : bdLon};
    },
    //BD-09 to GCJ-02
    bd_decrypt : function (bdLat, bdLon) {
        var x = bdLon - 0.0065, y = bdLat - 0.006;
        var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi);
        var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi);
        var gcjLon = z * Math.cos(theta);
        var gcjLat = z * Math.sin(theta);
        return {'lat' : gcjLat, 'lon' : gcjLon};
    },
    //WGS-84 to Web mercator
    //mercatorLat -> y mercatorLon -> x
    mercator_encrypt : function(wgsLat, wgsLon) {
        var x = wgsLon * 20037508.34 / 180.;
        var y = Math.log(Math.tan((90. + wgsLat) * this.PI / 360.)) / (this.PI / 180.);
        y = y * 20037508.34 / 180.;
        return {'lat' : y, 'lon' : x};
        /*
        if ((Math.abs(wgsLon) > 180 || Math.abs(wgsLat) > 90))
            return null;
        var x = 6378137.0 * wgsLon * 0.017453292519943295;
        var a = wgsLat * 0.017453292519943295;
        var y = 3189068.5 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));
        return {'lat' : y, 'lon' : x};
        //*/
    },
    // Web mercator to WGS-84
    // mercatorLat -> y mercatorLon -> x
    mercator_decrypt : function(mercatorLat, mercatorLon) {
        var x = mercatorLon / 20037508.34 * 180.;
        var y = mercatorLat / 20037508.34 * 180.;
        y = 180 / this.PI * (2 * Math.atan(Math.exp(y * this.PI / 180.)) - this.PI / 2);
        return {'lat' : y, 'lon' : x};
        /*
        if (Math.abs(mercatorLon) < 180 && Math.abs(mercatorLat) < 90)
            return null;
        if ((Math.abs(mercatorLon) > 20037508.3427892) || (Math.abs(mercatorLat) > 20037508.3427892))
            return null;
        var a = mercatorLon / 6378137.0 * 57.295779513082323;
        var x = a - (Math.floor(((a + 180.0) / 360.0)) * 360.0);
        var y = (1.5707963267948966 - (2.0 * Math.atan(Math.exp((-1.0 * mercatorLat) / 6378137.0)))) * 57.295779513082323;
        return {'lat' : y, 'lon' : x};
        //*/
    },
    // two point's distance
    distance : function (latA, lonA, latB, lonB) {
        var earthR = 6371000.;
        var x = Math.cos(latA * this.PI / 180.) * Math.cos(latB * this.PI / 180.) * Math.cos((lonA - lonB) * this.PI / 180);
        var y = Math.sin(latA * this.PI / 180.) * Math.sin(latB * this.PI / 180.);
        var s = x + y;
        if (s > 1) s = 1;
        if (s < -1) s = -1;
        var alpha = Math.acos(s);
        var distance = alpha * earthR;
        return distance;
    },
    outOfChina : function (lat, lon) {
        if (lon < 72.004 || lon > 137.8347)
            return true;
        if (lat < 0.8293 || lat > 55.8271)
            return true;
        return false;
    },
    transformLat : function (x, y) {
        var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(y / 12.0 * this.PI) + 320 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0;
        return ret;
    },
    transformLon : function (x, y) {
        var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
        ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(x / 12.0 * this.PI) + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0;
        return ret;
    }
}
 

 

posted @ 2021-04-12 16:59  abcByme  阅读(152)  评论(0编辑  收藏  举报