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

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

一、前言

首先要理解地理专有名词,当我们从系统获取地理位置,一般会拿到地理坐标,是一串数字,并不是地理位置名称。例如 116.2305,33.568。

这些数字坐标会有不同的坐标系 ,国际上一般使用 wgs84 (WGS 84是全球定位系统(GPS)的基准坐标系统,广泛应用于全球定位和导航。它采用十进制度表示经度和纬度。)

但是国内一般会使用加密坐标系,GCJ-02 (中国采用的加密坐标系,也称为火星坐标系,对WGS 84坐标进行加密偏移。)

拿到坐标参数x,y后,我们需要通过逆地理编码,将坐标转化为地理描述。地里描述,包括国家、行政区划、街道、门牌号、地址描述等。

二、地址位置获取和逆地址编码转化:

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

1. 配置定位权限

dart 复制代码
      {
        "name": "ohos.permission.APPROXIMATELY_LOCATION",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "always"
        }
      },
      {
        "name": "ohos.permission.LOCATION",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "always"
        }
      },

2.申请用户动态权限

dart 复制代码
    abilityAccessCtrl.createAtManager().requestPermissionsFromUser(getContext(), [
      'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION']).then(() => {
        // 权限申请通过后, 获取当前位置

    });

3.导入位置服务。获取地理位置信息,进行逆地理编码获取当前位置。

dart 复制代码
import { geoLocationManager } from '@kit.LocationKit';

        private locationChange: (err: BusinessError, location: geoLocationManager.Location) => void = (err, location) => {

    if (location) {
      let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
        'latitude': location.latitude,
        'longitude': location.longitude,
        'maxItems': 1
      };

      // 逆地址编码转化,获取地址位置描述
      geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
        if (data) {
          hilog.info(0x00000, 'getAddressesFromLocation: data=', JSON.stringify(data));
          if (data[0].locality !== undefined) {
            let local = data[0].locality.replace(/"/g, '').slice(0, -1);
            let currentLocal = data[0].locality.replace(/"/g, '').slice(0, -1);
            console.log(this.TAG, " local: " + local + " currentLocal: " + currentLocal)
          }
        }
      });
    }
  };

    	geoLocationManager.getCurrentLocation(this.locationChange);

三、DEMO完整示例:

dart 复制代码
import { abilityAccessCtrl } from '@kit.AbilityKit';
import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

@Entry
@Component
struct LocationPage {

  private TAG: string = "LocationPage";

  /**
   * 定位回调
   */
  private locationChange: (err: BusinessError, location: geoLocationManager.Location) => void = (err, location) => {
    if (err) {
      //
      console.log(this.TAG, " locationChanger: err=: " + JSON.stringify(err))
    }
    if (location) {
      let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
        'latitude': location.latitude, // 表示纬度信息,正值表示北纬,负值表示南纬。取值范围为-90到90。仅支持WGS84坐标系。
        'longitude': location.longitude, // 表示经度信息,正值表示东经,负值表是西经。取值范围为-180到180。仅支持WGS84坐标系。
        // 指定返回位置信息的最大个数。取值范围为大于等于0,推荐该值小于10。默认值是1。
        'maxItems': 1
      };

      // 逆地址编码转化,获取地址位置描述
      geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
        if (data) {
          hilog.info(0x00000, 'getAddressesFromLocation: data=', JSON.stringify(data));
          if (data[0].locality !== undefined) {
            let local = data[0].locality.replace(/"/g, '').slice(0, -1);
            let currentLocal = data[0].locality.replace(/"/g, '').slice(0, -1);
            console.log(this.TAG, " local: " + local + " currentLocal: " + currentLocal)
          }
        }
      });
    }
  };

  onClickGetLocation = ()=>{
    // 请求用户同意权限
    abilityAccessCtrl.createAtManager().requestPermissionsFromUser(getContext(), [
      'ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION']).then(() => {
        // 获取当前位置
      geoLocationManager.getCurrentLocation(this.locationChange);

    });
  }


  build() {
    RelativeContainer() {
      Text("获取当前定位信息")
        .id('LocationPageHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(this.onClickGetLocation)
    }
    .height('100%')
    .width('100%')
  }
}

一般获取定位,还需要配置网络权限,用于方便系统定位。

dart 复制代码
      {
        "name": "ohos.permission.INTERNET",
        "reason": "$string:reason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "always"
        }
      }
相关推荐
搞瓶可乐4 小时前
鸿蒙ArkUI实战之TextArea组件、RichEditor组件、RichText组件、Search组件的使用
华为·harmonyos·arkui·搜索框·富文本组件·富文本输入框·鸿蒙原生api
孤寂码农_defector4 小时前
鸿蒙系统的 “成长烦恼“:生态突围与技术迭代的双重挑战
macos·华为·objective-c·cocoa·harmonyos
别说我什么都不会5 小时前
【仓颉三方库】 数据解析——TOML4CJ
harmonyos
鸿蒙布道师5 小时前
鸿蒙NEXT开发LRUCache缓存工具类(单例模式)(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
城中的雾7 小时前
HarmonyOS Next 编译之如何构建不同包名应用
harmonyos·arkts
别说我什么都不会7 小时前
【仓颉三方库】 数据解析—— jwt4cj
harmonyos
周胡杰8 小时前
鸿蒙-跨设备互通,设备互通提供跨设备的相机、扫描、图库访问能力,平板或2in1设备可以调用手机的相机、扫描、图库等功能。
数码相机·华为·自动化·电脑·harmonyos·鸿蒙·鸿蒙系统
SuperHeroWu78 小时前
【HarmonyOS 5】VisionKit人脸活体检测详解
华为·harmonyos·人脸活体检测·visionkit
别说我什么都不会12 小时前
【仓颉三方库】 数据解析—— html4cj&asn1-cj
harmonyos
conkl14 小时前
华为设备命令部分精简分类汇总示例
网络·华为·智能路由器