【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"
        }
      }
相关推荐
遇到困难睡大觉哈哈2 小时前
HarmonyOS 应用数据持久化概述:Preferences、KV-Store、RelationalStore 到底怎么选?
笔记·华为·harmonyos
宇擎智脑科技3 小时前
Flutter 对接高德地图 SDK 适配鸿蒙踩坑记录与通信架构解析
flutter·架构·harmonyos
嗝o゚3 小时前
鸿蒙智慧屏与Flutter适配:无硬件功能的兼容处理
flutter·华为·开源·harmonyos
kirk_wang3 小时前
Flutter media_info插件在OpenHarmony平台的适配实践
flutter·移动开发·跨平台·arkts·鸿蒙
luxy20043 小时前
HarmonyOS简易时钟应用
华为·harmonyos
俩毛豆5 小时前
基于HarmonyOS(NEXT)的超级App中的搜索架构实现(直播文字干货版)
成长·架构·app·harmonyos·搜索
嗝o゚5 小时前
Flutter 无障碍功能开发最佳实践
python·flutter·华为
嗝o゚6 小时前
开源鸿蒙 Flutter 应用包瘦身实战
flutter·华为·开源·harmonyos
云和数据.ChenGuang7 小时前
鸿蒙负一屏的技术定位与核心价值
华为·wpf·harmonyos
遇到困难睡大觉哈哈9 小时前
HarmonyOS 关系型数据库 RDB 数据持久化(ArkTS)实战:建库建表、CRUD、事务、FTS、性能优化,一篇搞懂
笔记·华为·harmonyos