【React Native】定位获取经纬度,当前城市等地址信息

来源:互联网 发布:php 下载文件 编辑:程序博客网 时间:2024/05/18 15:23


最近做React Native时,需要用到城市定位的功能,React Native中文网的定位部分中也提供了相应的方法。主要用到的方法有:

这里写图片描述

这里只需要获取到经纬度,城市等信息,持续监听的函数就不需要了。这里使用 getCurrentPosition 方法获取当前位置信息,再用逆地址解析服务完成地址获取。

代码次要点:Promise对象菜鸟教程Promise阮一峰ES6-PromiseMDN-Promise

获取经纬度城市地址信息完整步骤如下:


1. 导入Geolocation

import Geolocation from 'Geolocation';


2.调用 getCurrentPosition 方法得到经纬度

这里将这个操作封装成一个方法,并返回Promise。

//获取经纬度的方法  Longitude  Latitudelet getLongitudeAndLatitude = () => {    //获取位置再得到城市先后顺序,通过Promise完成    return new Promise((resolve, reject) => {        Geolocation.getCurrentPosition(            location => {                //可以获取到的数据                var result = "速度:" + location.coords.speed +                    "\n经度:" + location.coords.longitude +                    "\n纬度:" + location.coords.latitude +                    "\n准确度:" + location.coords.accuracy +                    "\n行进方向:" + location.coords.heading +                    "\n海拔:" + location.coords.altitude +                    "\n海拔准确度:" + location.coords.altitudeAccuracy +                    "\n时间戳:" + location.timestamp;                // ToastAndroid.show("UTIl" + location.coords.longitude, ToastAndroid.SHORT);                resolve([location.coords.longitude, location.coords.latitude]);            },            error => {                // Alert.alert("获取位置失败:" + error, "")                reject(error);            }        );    })}


经纬度,海拔等信息的获取方式就是以 location.coords.longitude,location.coords.latitude ,location.coords.altitudeAccuracy的方式得到。

如果只是需要获取经纬度,这里已经完成。可以通过setState或者赋值给全局变量等方式记录。

为了进一步获取城市,这里Promise将经纬度组合成一个数组resolve传递出去。


3.使用逆地址解析服务将经纬度解析成地址信息


这里可以通过百度地图或者腾讯位置服务的逆地址解析服务来完成,流程如下:

  1. 注册成为开发者
  2. 创建自己的应用
  3. 然后获取key或认证
  4. 加上经纬度等参数来发起请求

例如百度地图的请求方式:

https://api.map.baidu.com/geocoder/v2/?output=json&ak=9a9a9a9a9a9a9a9a9a9a9a9a9a&location=39.206526,116.909158

(9a9a…就是你申请的ak认证,对应在你创建的应用中)

通过Postman 测试请求的效果如下:

这里写图片描述

这里需要将 location 经纬度参数替换为自己通过 getCurrentPosition 方法获取到的经纬度。也就是先获取到经纬度,再通过逆地址解析获取到城市等地址信息。将这个操作再封装成一个方法:

 getCityLocation() {        return new Promise((resolve, reject) => {            getLongitudeAndLatitude()            //获取经纬度的方法返回的是经纬度组成的数组                .then((locationArr) => {                      // Alert.alert("", "" + locationArr[1]);                    let longitude = locationArr[0];                    let latitude = locationArr[1];                    this.getNetData(BaiduMap_URL + latitude + "," + longitude)                        .then((data) => {                            if (data.status == 0) {                                resolve(data);                            } else {                                reject(ErrorDeal.getError(data.code));                            }                        }).catch((data) => {                        reject(ErrorDeal.getError(data.code));                    })                }).catch((data) => {                reject(ErrorDeal.getError(data.code));            })        })    }

getLongitudeAndLatitude 就是上面的获取经纬度的方法,this.getNetData是一个fetch 请求的封装。拼接请求 Url,fetch请求,此时 resolve 的数据就是 Postman 解析的 json 数据了。

  //获取网络数据    getNetData(url) {        return new Promise((resolve, reject) => {            fetch(url).then((response) => response.json())                .then((responseData) => {                    resolve(responseData);                })                .catch((error) => {                    reject(ErrorDeal.getError(NetWork_Error))                })                .done()        })    }


4.获取信息并处理

上面 getCityLocation 返回的 Promise 中 resolve 传递的 data 就是 json 数据了,就已经可以因自身需求进行数据处理显示的操作了。

 this.getCityLocation()            .then((data) => {                // Alert.alert("位置?", "" + JSON.stringify(data));                this._confirmCity(data);            })            .catch((error) => {                //ToastAndroid.show("失败" + JSON.stringify(error), ToastAndroid.SHORT);            });

调用 getCityLocation,再 then 方法处理处理 data ,此时的 data 是一个 json 对象。

例如我的处理是调用 _confirmCity 方法弹出一个城市切换的确认框:

     //弹出定位框    _confirmCity(data) {        let address = data.result.addressComponent;        if (address!="") {            Alert.alert("城市定位", "\n当前城市为" + address.province + address.city + "\n \n 是否设为当前城市?\n",                [                    {                        text: "设为当前城市", onPress: () => {                            this.setCurrentCity(address.city)                        }                    },                    {text: "取消"}                ]            )        }    }

效果图:

这里写图片描述

这里就已经完成了经纬度的获取,城市地址信息的获取功能。

阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乡村之活色生香 乡村小农民 鱼不乐 乡村邪医王二蛋 乡村一家三代乱来 乡村少年 逍遥夫子 乡村活寡风流女 乡村医生 玉玺 乡村留守女人 乡村大凶器全文 乡野艳医李云 艳绝 山村 香村 乡野艳医有烟就好 山村偷妇全文阅读 农村 村满乡野 乡野 乡野艳医 艳绝乡林 乡野满艳 荒村活寡 艳野山村流 艳绝山村 乡约 乡约栏目 乡约2019 南赣乡约心得 吕氏乡约 乡约2018 明清乡约 乡试 乡试会试殿试 乡试第一名叫什么 科举乡试答题器 乡谣情缘 乡贤 原无乡 国道省道县道乡道标志