【HarmonyOS】鸿蒙应用地理位置获取,地理名称获取

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

【HarmonyOS】鸿蒙应用地理位置获取,地理名称获取

一、媒介

首先要理解地理专有名词,当我们从体系获取地理位置,一般会拿到地理坐标,是一串数字,并不是地理位置名称。比方 116.2305,33.568。
这些数字坐标会有不同的坐标系,国际上一般使用 wgs84 (WGS 84是环球定位体系(GPS)的基准坐标体系,广泛应用于环球定位和导航。它采用十进制度表现经度和纬度。)
但是国内一般会使用加密坐标系,GCJ-02 (中国采用的加密坐标系,也称为火星坐标系,对WGS 84坐标进行加密偏移。)
拿到坐标参数x,y后,我们需要通过逆地理编码,将坐标转化为地理形貌。地里形貌,包括国家、行政区划、街道、门牌号、地址形貌等。
二、地址位置获取和逆地址编码转化:

首先我们需要获取当前设备的地理位置,该行为需要权限配置,用户同意后,才能拿到当前定位的地址位置。

1. 配置定位权限
  1.       {
  2.         "name": "ohos.permission.APPROXIMATELY_LOCATION",
  3.         "reason": "$string:reason",
  4.         "usedScene": {
  5.           "abilities": [
  6.             "EntryAbility"
  7.           ],
  8.           "when": "always"
  9.         }
  10.       },
  11.       {
  12.         "name": "ohos.permission.LOCATION",
  13.         "reason": "$string:reason",
  14.         "usedScene": {
  15.           "abilities": [
  16.             "EntryAbility"
  17.           ],
  18.           "when": "always"
  19.         }
  20.       },
复制代码
2.申请用户动态权限
  1.     abilityAccessCtrl.createAtManager().requestPermissionsFromUser(getContext(), [
  2.       'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION']).then(() => {
  3.         // 权限申请通过后, 获取当前位置
  4.     });
复制代码
3.导入位置服务。获取地理位置信息,进行逆地理编码获取当前位置。
  1. import { geoLocationManager } from '@kit.LocationKit';
  2.         private locationChange: (err: BusinessError, location: geoLocationManager.Location) => void = (err, location) => {
  3.     if (location) {
  4.       let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
  5.         'latitude': location.latitude,
  6.         'longitude': location.longitude,
  7.         'maxItems': 1
  8.       };
  9.       // 逆地址编码转化,获取地址位置描述
  10.       geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
  11.         if (data) {
  12.           hilog.info(0x00000, 'getAddressesFromLocation: data=', JSON.stringify(data));
  13.           if (data[0].locality !== undefined) {
  14.             let local = data[0].locality.replace(/"/g, '').slice(0, -1);
  15.             let currentLocal = data[0].locality.replace(/"/g, '').slice(0, -1);
  16.             console.log(this.TAG, " local: " + local + " currentLocal: " + currentLocal)
  17.           }
  18.         }
  19.       });
  20.     }
  21.   };
  22.             geoLocationManager.getCurrentLocation(this.locationChange);
复制代码
三、DEMO完整示例:


  1. import { abilityAccessCtrl } from '@kit.AbilityKit';
  2. import { geoLocationManager } from '@kit.LocationKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. @Entry
  6. @Component
  7. struct LocationPage {
  8.   private TAG: string = "LocationPage";
  9.   /**
  10.    * 定位回调
  11.    */
  12.   private locationChange: (err: BusinessError, location: geoLocationManager.Location) => void = (err, location) => {
  13.     if (err) {
  14.       //
  15.       console.log(this.TAG, " locationChanger: err=: " + JSON.stringify(err))
  16.     }
  17.     if (location) {
  18.       let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
  19.         'latitude': location.latitude, // 表示纬度信息,正值表示北纬,负值表示南纬。取值范围为-90到90。仅支持WGS84坐标系。
  20.         'longitude': location.longitude, // 表示经度信息,正值表示东经,负值表是西经。取值范围为-180到180。仅支持WGS84坐标系。
  21.         // 指定返回位置信息的最大个数。取值范围为大于等于0,推荐该值小于10。默认值是1。
  22.         'maxItems': 1
  23.       };
  24.       // 逆地址编码转化,获取地址位置描述
  25.       geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
  26.         if (data) {
  27.           hilog.info(0x00000, 'getAddressesFromLocation: data=', JSON.stringify(data));
  28.           if (data[0].locality !== undefined) {
  29.             let local = data[0].locality.replace(/"/g, '').slice(0, -1);
  30.             let currentLocal = data[0].locality.replace(/"/g, '').slice(0, -1);
  31.             console.log(this.TAG, " local: " + local + " currentLocal: " + currentLocal)
  32.           }
  33.         }
  34.       });
  35.     }
  36.   };
  37.   onClickGetLocation = ()=>{
  38.     // 请求用户同意权限
  39.     abilityAccessCtrl.createAtManager().requestPermissionsFromUser(getContext(), [
  40.       'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION']).then(() => {
  41.         // 获取当前位置
  42.       geoLocationManager.getCurrentLocation(this.locationChange);
  43.     });
  44.   }
  45.   build() {
  46.     RelativeContainer() {
  47.       Text("获取当前定位信息")
  48.         .id('LocationPageHelloWorld')
  49.         .fontSize(50)
  50.         .fontWeight(FontWeight.Bold)
  51.         .alignRules({
  52.           center: { anchor: '__container__', align: VerticalAlign.Center },
  53.           middle: { anchor: '__container__', align: HorizontalAlign.Center }
  54.         })
  55.         .onClick(this.onClickGetLocation)
  56.     }
  57.     .height('100%')
  58.     .width('100%')
  59.   }
  60. }
复制代码

一般获取定位,还需要配置网络权限,用于方便体系定位。
  1.       {
  2.         "name": "ohos.permission.INTERNET",
  3.         "reason": "$string:reason",
  4.         "usedScene": {
  5.           "abilities": [
  6.             "EntryAbility"
  7.           ],
  8.           "when": "always"
  9.         }
  10.       }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表