当前位置:   article > 正文

鸿蒙应用开发学习:手机位置信息进阶,从经纬度数据获取地理位置描述信息_geolocationmanager.on('locationchange

geolocationmanager.on('locationchange

一、前言

前几天,我通过学习华为官网的位置服务开发指南,实现了获取手机位置信息的功能,但当时的代码存在两个不足,一是我按照官网的指南使用的是getLastLocation()方法,得到的是最近一次的位置,第一次执行该应用获取到位置信息后,之后再次执行,获取的还是之前的位置信息,与实际位置不符;第二是获取到的位置信息是经度、纬度和海拔等数字信息,不能直管的显示做在的地理位置

遇到不足,我就希望尽量去解决,这几天通过进一步的学习,我在网上找到了别的网友发布的关于鸿蒙系统获取地理位置的文章,参考他们的文章,我对之前写的代码进行了改进解决了上述两个问题。

二、实现方法

这次改进代码主要参考了以下两篇文章:

鸿蒙harmonyos4获取定位信息

【木棉花】获取设备的地理位置

我的代码的修改主要有四处:

1.添加了权限检查功能代码,在发现没有权限时会出现弹窗,提供开启权限的选项,这样就不用手工到手机设置里给应用添加权限了。

2. 将getLastLocation()方法替换为getCurrentLocation()方法,这样每次执行该应用都是获取到的当前的位置信息。

3. 在获取到经纬度后,添加了一段代码,通过getAddressesFromLocation()方法获取经纬度对应的地理描述信息。

另外,之前的方法使用了try语句进行错误处理,这次将相关的函数和方法都改为了异步操作,剔除了try语句,使代码更简洁。

4. 对布局进行了修改,增加了显示地址、县区、省份、国家四个文本组件。

这四处改动也是在不断的测试中逐渐完善的。刚开始是添加第一部分,修改第二部分,并添加了第三部分的基础代码。将代码修改后,在真机上测试,首先通过日志信息打印getAddressesFromLocation()方法获取到的地理描述返回结果,发现是一个形如[{, , , , , }]的数据结构,其中有地址、县区、省份、国家等信息。之后通过尝试,成功从返回结果中获取到了我需要的信息,完成了第二部分的代码,最后在添加第三部分的代码将获取到的信息显示在页面中。

上真机测试,显示了获取到的信息,但美中不足的是,信息都是英文的。

我又在网上一阵搜索,终于在华为开发者联盟官网的论坛里找打了一篇“逆地理编码getAddressesFromLocation获取结果都是英文”的帖子,在这个帖子中找到了解决答案。

方法很简单,在使用getAddressesFromLocation()方法之前,创建reverseGeocodeRequest时,添加"locale": "zh"参数即可。

最终结果如下:

三、代码展示

最后上完整的ets文件代码

  1. import geoLocationManager from '@ohos.geoLocationManager'
  2. import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
  3. import common from '@ohos.app.ability.common';
  4. // 权限列表
  5. const permissions: Array<Permissions> = ['ohos.permission.APPROXIMATELY_LOCATION', 'ohos.permission.LOCATION']
  6. let requestInfo = {
  7. 'priority': geoLocationManager.LocationRequestPriority.ACCURACY,
  8. 'timeInterval': 0,
  9. 'distanceInterval': 0,
  10. 'maxAccuracy': 0
  11. };
  12. @Entry
  13. @Component
  14. struct LocationPage {
  15. // 检测权限是否已经授权,如果未授权就弹出授权弹窗
  16. reqPermissionsFromUser(permissions: Array<Permissions>): void {
  17. let context = getContext(this) as common.UIAbilityContext;
  18. let atManager = abilityAccessCtrl.createAtManager();
  19. // requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
  20. atManager.requestPermissionsFromUser(context, permissions).then((data) => {
  21. let grantStatus: Array<number> = data.authResults;
  22. let length: number = grantStatus.length;
  23. for (let i = 0; i < length; i++) {
  24. if (grantStatus[i] === 0) {
  25. // 用户授权,可以继续操作
  26. } else {
  27. // 用户拒绝授权,提示用户必须授权才能访问当前页面的功能,并引导用户到系统设置中打开相应的权限
  28. return;
  29. }
  30. }
  31. // 授权成功
  32. }).catch((err) => {
  33. console.error(`requestPermissionsFromUser failed, code is ${err.code}, message is ${err.message}`);
  34. })
  35. }
  36. // 组件即将出现时回调该接口,具体实际未在创建自定义组件的新实例后,在执行其build()函数之前执行
  37. aboutToAppear() {
  38. this.reqPermissionsFromUser(permissions)
  39. }
  40. @State mLatitude: string = '' // 经度
  41. @State mLongitude: string = '' // 纬度
  42. @State mAltitude: string = '' // 海拔(米)
  43. @State mAccuracy: string = '' // 精度(米)
  44. @State mSpeed: string = '' //速度(米/秒)
  45. @State mTimeStamp: string = '' // 时间戳
  46. @State mDirection: string = '' // 方向
  47. @State mAddresses: string = '' // 地址
  48. @State mCountryName: string = '' // 国家名称
  49. @State mAdministrativeArea: string = '' // 省份
  50. @State mLocality: string = '' // 地市
  51. @State mSubLocality: string = '' // 县区
  52. build() {
  53. Column() {
  54. Button("获取位置")
  55. .width(100)
  56. .backgroundColor($r('app.color.button_bgColor_lightBlue'))
  57. .margin({ top: 10, bottom: 10 })
  58. .onClick(() => {
  59. this.getLocation()
  60. })
  61. Text('【当前位置信息】')
  62. .fontSize(20)
  63. Grid() {
  64. GridItem() {
  65. Text('经度:')
  66. }
  67. GridItem() {
  68. Text(this.mLatitude)
  69. }
  70. GridItem() {
  71. Text('纬度:')
  72. }
  73. GridItem() {
  74. Text(this.mLongitude)
  75. }
  76. GridItem() {
  77. Text('海拔:')
  78. }
  79. GridItem() {
  80. Text(this.mAltitude)
  81. }
  82. GridItem() {
  83. Text('精度:')
  84. }
  85. GridItem() {
  86. Text(this.mAccuracy)
  87. }
  88. GridItem() {
  89. Text('速度:')
  90. }
  91. GridItem() {
  92. Text(this.mSpeed)
  93. }
  94. GridItem() {
  95. Text('时间:')
  96. }
  97. GridItem() {
  98. Text(this.mSpeed)
  99. }
  100. GridItem() {
  101. Text('方向:')
  102. }
  103. GridItem() {
  104. Text(this.mDirection)
  105. }
  106. GridItem() {
  107. Text('-----------------')
  108. }
  109. .columnStart(0)
  110. .columnEnd(1)
  111. GridItem() {
  112. Text('地址:')
  113. }
  114. GridItem() {
  115. Text(this.mAddresses)
  116. }
  117. GridItem() {
  118. Text('区县:')
  119. }
  120. GridItem() {
  121. Text(this.mSubLocality)
  122. }
  123. GridItem() {
  124. Text('地市:')
  125. }
  126. GridItem() {
  127. Text(this.mLocality)
  128. }
  129. GridItem() {
  130. Text('省份:')
  131. }
  132. GridItem() {
  133. Text(this.mAdministrativeArea)
  134. }
  135. GridItem() {
  136. Text('国家:')
  137. }
  138. GridItem() {
  139. Text(this.mCountryName)
  140. }
  141. }
  142. .columnsTemplate('1fr 4fr')
  143. .rowsGap(15)
  144. .padding(10)
  145. .width('90%')
  146. }
  147. .width('100%')
  148. .backgroundColor('#EAEAEA')
  149. .padding(10)
  150. }
  151. // 获取手机当前位置
  152. async getLocation() {
  153. let locationChange = (location) => {
  154. console.log('locationChanger: data: ' + JSON.stringify(location));
  155. };
  156. geoLocationManager.on('locationChange', requestInfo, locationChange);
  157. // 等待获取当前位置-异步操作
  158. await geoLocationManager.getCurrentLocation(requestInfo).then((result) => {
  159. this.mLatitude = result.latitude.toString();
  160. this.mLongitude = result.longitude.toString();
  161. this.mAltitude = result.altitude.toString() + '米';
  162. this.mAccuracy = result.accuracy.toString() + '米';
  163. this.mSpeed = result.speed.toString() + '米/秒';
  164. this.mTimeStamp = result.timeStamp.toString();
  165. this.mDirection = result.direction.toString();
  166. //console.log('当前位置:' + JSON.stringify(result));
  167. console.log("testTag", "获取到的位置信息:")
  168. console.log("testTag", "纬度latitude " + this.mLatitude)
  169. console.log("testTag", "经度longitude " + this.mLongitude)
  170. console.log("testTag", "海拔(米)altitude " + this.mAltitude)
  171. console.log("testTag", "精度(米)accuracy " + this.mAccuracy)
  172. console.log("testTag", "速度(米/秒)speed " + this.mSpeed)
  173. console.log("testTag", "时间戳timeStamp " + this.mTimeStamp)
  174. console.log("testTag", "方向direction " + this.mDirection)
  175. // 获取地址信息
  176. this.getAddresses(result.latitude, result.longitude)
  177. })
  178. .catch((error) => {
  179. console.log('promise, getCurrentLocation: error=' + JSON.stringify(error));
  180. })
  181. geoLocationManager.off('locationChange', locationChange);
  182. } // getLocation-end
  183. // 将坐标转化为地理描述
  184. async getAddresses(latitude: number, longitude: number) {
  185. // 查询geoCoder服务是否可用
  186. let isAvailable = geoLocationManager.isGeocoderAvailable();
  187. if (isAvailable) {
  188. let reverseGeocodeRequest = { "locale": "zh", "latitude": latitude, "longitude": longitude, "maxItems": 1 };
  189. await geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest).then((result) => {
  190. console.log('getAddressesFromLocation data: ' + JSON.stringify(result));
  191. this.mAddresses = result[0].placeName;
  192. this.mCountryName = result[0].countryName;
  193. this.mAdministrativeArea = result[0].administrativeArea;
  194. this.mLocality = result[0].locality;
  195. this.mSubLocality = result[0].subLocality;
  196. })
  197. .catch((error) => {
  198. console.log('promise, getAddressesFromLocation: error=' + JSON.stringify(error));
  199. })
  200. }
  201. }
  202. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45793
推荐阅读
相关标签
  

闽ICP备14008679号