一。公司活动页使用到根据当前城市获取当前商场数据的功能,所以我开始做使用h5的新特性geolocation,以下有两种获取当前城市的方案(移动端):(注意:必须是https协议才能使用geolocation获取经纬度)

1.使用百度地图api获取当前城市

2.使用geolocation获取经纬度,把经纬度给服务器接口获取当前城市,服务器端也是调用百度地图api获取的当前城市,这样做是为了我们对这个功能可以有一定的控制,防止出现一些意外状况

二。服务端接口实现方式

/*获取当前地理位置*/
import CurrentCityModel from '../models/CurrentCityModel';

export default class Geolocation {
    constructor() {
        this.currentCityModel = new CurrentCityModel();
    }

    getCity(longitude, latitude) {
        return new Promise((resolve, reject)=> {
            this.currentCityModel.getCurrentCity(longitude, latitude)
                .then((data = {})=> {
                    resolve(data.city);
                })
                .catch((error)=> {
                    reject(error);
                });
        })
    }

    getLocation() {
        if (navigator.geolocation) {
            return new Promise((resolve, reject)=> {
                navigator.geolocation.getCurrentPosition(
                    (position) => {//定位成功
                        let coords = position.coords, longitude = coords.longitude, latitude = coords.latitude;
                        this.getCity(longitude, latitude)
                            .then(resolve)
                            .catch(reject);
                    },
                    (error)=> {
                        //定位失败
                        this.locationError(error);
                    },
                    {
                        // 指示浏览器获取高精度的位置,默认为false
                        enableHighAccuracy: true,
                        // 指定获取地理位置的超时时间,默认不限时,单位为毫秒
                        //timeout: Infinity,
                        timeout: 5000,
                        // 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。
                        maximumAge: 1000000
                    });
            });
        } else {
            alert("Your browser does not support Geolocation!");
        }
    }

    locationError(error) {
        console.log('获取地理位置失败');
        switch (error.code) {
            case error.TIMEOUT://超时
                alert("A timeout occured! Please try again!");
                break;
            case error.POSITION_UNAVAILABLE://表示无法确定设备的位置
                alert('We can\'t detect your location. Sorry!');
                break;
            case error.PERMISSION_DENIED://表示没有权限使用地理定位API
                alert('Please allow geolocation access for this to work.');
                break;
            case error.UNKNOWN_ERROR:
                alert('An unknown error occured!');
                break;
        }
    }
}
三。百度地图api实现方式

百度地图api:JavaScript API首家支持Https,已全面开放,无需申请可直接使用。

注意:仅JavaScript API V2.0及以上版本支持https,其他JavaScript API版本均不支持。使用https服务,请先检查您的版本以及配置注意事项。

这说明在项目中不需要考虑http或https请求,可以直接使用它的服务

1.使用方式

  1.1 注册百度地图api

  1.2 获取密钥<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>

  1.3 将密钥放入项目中

  1.4 调用其服务获得对象数据

2.功能实现

/*Description:利用百度地图jsapi获取用户当前城市*/
export function getCurrentCity(fn) {
    let currentCity = '';
    let geolocation = new BMap.Geolocation();

    /*获取地址时异步的*/
    geolocation.getCurrentPosition(
        function (r) {
            if (this.getStatus() == BMAP_STATUS_SUCCESS) {  //通过Geolocation类的getStatus()可以判断是否成功定位。
                var pt = r.point;
                let gc = new BMap.Geocoder();
                gc.getLocation(pt, function (rs) {
                    currentCity = rs.addressComponents;
                    if (currentCity) {
                        fn(currentCity);
                    }
                });
            } else {
                //关于状态码
                //BMAP_STATUS_SUCCESS   检索成功。对应数值“0”。
                //BMAP_STATUS_CITY_LIST 城市列表。对应数值“1”。
                //BMAP_STATUS_UNKNOWN_LOCATION  位置结果未知。对应数值“2”。
                //BMAP_STATUS_UNKNOWN_ROUTE 导航结果未知。对应数值“3”。
                //BMAP_STATUS_INVALID_KEY   非法密钥。对应数值“4”。
                //BMAP_STATUS_INVALID_REQUEST   非法请求。对应数值“5”。
                //BMAP_STATUS_PERMISSION_DENIED 没有权限。对应数值“6”。(自 1.1 新增)
                //BMAP_STATUS_SERVICE_UNAVAILABLE   服务不可用。对应数值“7”。(自 1.1 新增)
                //BMAP_STATUS_TIMEOUT   超时。对应数值“8”。(自 1.1 新增)
                switch (this.getStatus()) {
                    case 2:
                        alert('位置结果未知 获取位置失败.');
                        break;
                    case 3:
                        alert('导航结果未知 获取位置失败..');
                        break;
                    case 4:
                        alert('非法密钥 获取位置失败.');
                        break;
                    case 5:
                        alert('对不起,非法请求位置  获取位置失败.');
                        break;
                    case 6:
                        alert('对不起,当前 没有权限 获取位置失败.');
                        break;
                    case 7:
                        alert('对不起,服务不可用 获取位置失败.');
                        break;
                    case 8:
                        alert('对不起,请求超时 获取位置失败.');
                        break;

                }
            }
        },
        {
            enableHighAccuracy: true
        }
    );

}