0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探索HarmonyOS位置服务:为用户提供直观的坐标显示

ITMING 来源:ITMING 作者:ITMING 2024-08-20 10:51 次阅读

关于作者
白晓明
宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人
华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL
华为开发者学堂/51CTO学堂/CSDN学堂认证讲师
开放原子开源基金会2023开源贡献之星
OpenHarmony三方库贡献者
公众号:开源开发者新视界(openwatcher)

在先前的环节中,我们所获取到的位置信息是以经纬度的方式来呈现。不可否认,这种呈现方式在描述位置时具有极高的准确性,能够精确地定位到地球的每一个点。然而,不得不承认的是,对于普通用户而言,经纬度的表述形式显示得过于专业和晦涩,缺乏直观性和易理解性,确实不够友好。

HarmonyOS的位置服务(Location Kit)则犹如一位贴心的助手,为开发者提供了地理编码转化和逆地理编码转化这两种极为实用的能力。其中,地理编码就像是一个信息丰富的宝藏,它包含了多个属性来对位置进行细致入微的描述。比如,它涵盖了国家这个宏观层面的标识,让我们能够快速确定位置所在的大区域;还有行政区划,进一步明确了具体的地区范围;街道的描述则让我们对周边环境有了更清晰的认知;门牌号更是精准地指向了具体的地点;而地址描述则以一种更为通俗易懂的方式将所有这些信息整合起来,为用户提供一个全面而直观的位置表达。这样丰富多样的信息呈现方式,无疑更加便于用户理解和把握自己所处的位置,无论是在日常的出行导航中,还是在社交应用里与朋友分享位置,都能让用户轻松便捷地知晓自己的具体方位,为我们的数字生活带来更多的便利和舒适体验。

查看地理编码与逆地理编码服务是否可用

首先,开发者在进行操作时,需要优先调用isGeoServiceAvailable方法来查询地理编码与逆地理编码服务的可用性。这一步骤至关重要,因为只有当确定服务可用的情况下,才能够进行后续的编码转化操作。如果经过查询发现服务不可用,那么就意味着该设备并不具备地理编码与逆地理编码转化能力。这种情况下,开发者务必不要使用相关接口,以免引起不必要的错误或者异常情况,从而确保应用程序的稳定性。

let isAvailable = geoLocationManager.isGeocoderAvailable();

把坐标转化为地理位置信息

在实际应用中,我们可以通过调用getCurrentLocation()函数获取当前位置,也可以使用on('locationChange')方法进行位置变化订阅。然而,通过这两种方式所获取到的位置信息都是以坐标形式呈现出来的,对于普通用户而言,这种坐标形式的位置信息可能会显得比较抽象且难以理解。

为了能够让用户更加直观地理解位置信息,开发者可以调用getAddressesFromLocation方法,该方法能够将坐标形式的位置信息转化为地理位置信息。比如国家信息、行政区、城市信息、区/县信息、路名等等。具体位置信息如以下类所示:

/**
 * 地理编码地址信息
 */
export interface GeoAddress {
    /**
     * 纬度信息,正值表示北纬,负值表示南纬。
     * 取值范围为[-90, 90],仅支持WGS84坐标系。
     */
    latitude?: number;
    /**
     * 经度信息,正值表示东经,负值表示西经。
     * 取值范围为[-180, 180],仅支持WGS84坐标系。
     */
    longitude?: number;
    /**
     * 位置描述信息的语言。
     * zh:中文;en:英文。
     */
    locale?: string;
    /**
     * 详细地址信息。
     */
    placeName?: string;
    /**
     * 国家码信息。
     */
    countryCode?: string;
    /**
     * 国家信息。
     */
    countryName?: string;
    /**
     * 一级行政区,一般是省/州。
     */
    administrativeArea?: string;
    /**
     * 二级行政区,一般是市。
     */
    subAdministrativeArea?: string;
    /**
     * 城市信息,一般是市。
     */
    locality?: string;
    /**
     * 子城市信息,一般是区/县。
     */
    subLocality?: string;
    /**
     * 路名信息。
     */
    roadName?: string;
    /**
     * 子路名信息。
     */
    subRoadName?: string;
    /**
     * 门牌号信息。
     */
    premises?: string;
    /**
     * 邮政编码信息。
     */
    postalCode?: string;
    /**
     * 联系方式信息。
     */
    phoneNumber?: string;
    /**
     * 位置信息附件的网址信息。
     */
    addressUrl?: string;
    /**
     * 附加的描述信息。
     * 目前包含城市编码cityCode和区划编码adminCode。
     */
    descriptions?: Array< string >;
    /**
     * 附加的描述信息数量。
     * 取值大于等于0,推荐该值小于10。
     */
    descriptionsSize?: number;
}

以转化当前坐标为例,代码如下所示:

/**
 * 逆地理编码请求参数
 */
export interface ReverseGeoCodeRequest {
    /**
     * 指定位置描述信息的语言。
     * zh:中文;en:英文。
     */
    locale?: string;
    /**
     * 限制查询结果在指定的国家区,采用ISO3166-1 alpha-2。
     * CN代表中国。
     */
    country?: string;
    /**
     * 纬度信息。
     */
    latitude: number;
    /**
     * 经度信息。
     */
    longitude: number;
    /**
     * 指定返回位置信息的最大个数。
     */
    maxItems?: number;
}

/**
 * 坐标转化为地理位置信息
 * @param latitude
 * @param longitude
 * @param maxItems
 * @returns
 */
static async getAddressesFromLocation(latitude: number,
  longitude: number, maxItems: number = 1): Promise< geoLocationManager.GeoAddress[] | undefined > {
  const request: geoLocationManager.ReverseGeoCodeRequest = {
    locale: "zh",
    country: "CN",
    latitude,
    longitude,
    maxItems
  };
  let location: geoLocationManager.GeoAddress[] | undefined = undefined;
  try {
    location = await geoLocationManager.getAddressesFromLocation(request);
    console.info(`[AppLogger]坐标转化为地理位置信息:${JSON.stringify(location)}`);
  } catch (error) {
    const err = error as BusinessError;
    console.error(`[AppLogger]坐标转化为地理位置信息异常:${JSON.stringify(err)}`);
  }
  return location;
}


Button('坐标转化为地理位置信息')
  .onClick(async () = > {
    this.location = await LocationUtil.getSingleLocationRequest(geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED);
    if (this.location !== undefined) {
      this.locationArr = await LocationUtil.getAddressesFromLocation(this.location?.latitude, this.location?.longitude);
    }
  })

image20240817155340722.png

把地理位置信息转化为坐标

在导航类App的实际使用场景中,当用户进行位置搜索时,通常会输入具体的位置信息,比如某个商场的名称、某条街道的地址或者某个景点的具体描述等。但是,对于地图的显示而言,它所需要的是精确的位置坐标信息,只有这样才能够准确地在地图上进行标注和展示。

在这种情况下,为了实现从用户输入的位置描述到地图所需的坐标信息的转化,开发者可以调用getAddressesFromLocationName方法。这个方法就像是一座桥梁,能够将用户输入的直观的位置描述转化为地图能够识别和使用的位置坐标。通过这样的转化,不仅可以满足地图显示的需求,还能够为用户提供更加准确和便捷的导航服务,让用户能够更加轻松地找到自己想要达到的目的地。

以转化用户输入地理位置为例,代码如下所示:

/**
 * 地理编码请求参数
 */
export interface GeoCodeRequest {
    /**
     * 位置描述信息的语言。
     * zh:中文;en:英文。
     */
    locale?: string;
    /**
     * 限制查询结果在指定的国家区,采用ISO3166-1 alpha-2。
     * CN代表中国。
     */
    country?: string;
    /**
     * 位置信息描述。
     */
    description: string;
    /**
     * 返回结果信息的最大个数。
     */
    maxItems?: number;
    /**
     * 最小纬度信息。
     */
    minLatitude?: number;
    /**
     * 最小经度信息。
     */
    minLongitude?: number;
    /**
     * 最大纬度信息。
     */
    maxLatitude?: number;
    /**
     * 最大经度信息。
     */
    maxLongitude?: number;
}

/**
 * 地理位置转化为坐标信息
 * @param description
 * @param maxItems
 * @returns
 */
static async getAddressesFromLocationName(description: string,
  maxItems: number = 1): Promise< geoLocationManager.GeoAddress[] | undefined > {
  const request: geoLocationManager.GeoCodeRequest = {
    description,
    maxItems
  };
  let location: geoLocationManager.GeoAddress[] | undefined = undefined;
  try {
    location = await geoLocationManager.getAddressesFromLocationName(request);
    console.info(`[AppLogger]地理位置转化为坐标信息:${JSON.stringify(location)}`);
  } catch (error) {
    const err = error as BusinessError;
    console.error(`[AppLogger]地理位置转化为坐标信息异常:${JSON.stringify(err)}`);
  }
  return location;
}

TextInput({ placeholder: "请输入具体的位置信息..." })
  .onChange((value: string) = > {
    this.val = value;
  })
Button('坐标转化为地理位置信息')
  .onClick(async () = > {
    if (LocationUtil.usedGeocoderAvailable()) {
      this.locationArr = await LocationUtil.getAddressesFromLocationName(this.val, 5);
    }
  })

image20240817170727668.png

使用ForEach渲染列表数据

List() {
  ForEach(this.locationArr, (item: geoLocationManager.GeoAddress) = > {
    ListItem() {
      Column({ space: 8 }) {
        Text(item.placeName)
          .fontSize(16)
        Text(`坐标:[${item.latitude}, ${item.longitude}]`)
          .fontSize(12)
        Text(`${item.countryName} ${item.administrativeArea} ${item.locality} ${item.subLocality} ${item.roadName} ${item.subRoadName}`)
          .fontSize(12)
      }
      .width('100%')
      .padding(12)
      .backgroundColor(0xF1F3F5)
      .borderRadius(8)
      .justifyContent(FlexAlign.Start)
    }
  })
}
.width('90%')
.divider({
  strokeWidth: 4,
  color: 0xFFFFFF
})

image20240817193205402.png

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 位置服务
    +关注

    关注

    0

    文章

    5

    浏览量

    2052
  • HarmonyOS
    +关注

    关注

    79

    文章

    1965

    浏览量

    29953
收藏 人收藏

    评论

    相关推荐

    人员定位技术向化工厂的智慧平台提供精准的位置服务

    化工厂的智慧平台提供精准的位置服务。 人员定位系统功能1、三维展示模块系统平台采用三维地图作为基础,实现变电站整体的三维场景浏览、报警监控、重要数据统计、人员精确定位、历史轨迹查询、作业票导入、电子围栏、作业过
    的头像 发表于 08-30 11:00 220次阅读
    人员定位技术向化工厂的智慧平台<b class='flag-5'>提供</b>精准的<b class='flag-5'>位置服务</b>

    服务体验-服务发现

    服务发现,无论线上或线下的方式都可以发现元服务。 线上:基于用户意图。从精准意图的搜索、用户事件触发的推荐到主动探索等场景。
    发表于 07-15 17:02

    HarmonyOS NEXT Developer Beta1最新术语表

    服务 原名原子化服务,是HarmonyOS提供的一种面向未来的服务提供方式,是有独立入口的(
    发表于 06-27 16:16

    HarmonyOS NEXT Developer Beta1中的Kit

    HarmonyOS NEXT Developer Preview1(API 11)版本开始,HarmonyOS SDK以Kit维度提供丰富、完备的开放能力,涵盖应用框架、系统、媒体、图形、应用
    发表于 06-26 10:47

    鸿蒙原生应用元服务开发-位置服务申请权限

    申请位置权限开发指导 场景概述 应用在使用位置服务系统能力前,需要检查是否已经获取用户授权访问设备位置信息。如未获得授权,可以向用户申请需要
    发表于 06-18 15:27

    鸿蒙原生应用元服务开发-位置服务开发概述

    ,无论用户设备在室内或是户外,都可以准确地确定设备位置位置服务除了提供基础的定位服务之外,还提供
    发表于 06-17 17:47

    鸿蒙原生应用元服务开发-位置服务获取设备信息开发

    ,如车载、步行导航。 . 在此场景下,保证系统提供位置结果精度最优,主要使用GNSS定位技术提供定位服务,结合场景特点,在导航启动之初,
    发表于 06-14 14:46

    鸿蒙原生应用元服务开发-位置服务地理编码转化开发

    (逆)地理编码转化开发 场景概述 使用坐标描述一个位置,非常准确,但是并不直观,面向用户表达并不友好。系统向开发者提供了以下两种转化能力。
    发表于 06-12 17:22

    HarmonyOS开发技术全面分析

    、穿戴专有业务、IoT 专有业务等子系统组成。 ⚫ 硬件服务子系统集 : HarmonyOS 提供硬件服务,由
    发表于 02-21 16:31

    鸿蒙应用/元服务开发-窗口概述

    在一定范围内对窗口的位置和叠加层次进行调整。 提供窗口动效。 在窗口显示、隐藏及窗口间切换时,窗口模块通常会添加动画效果,以使各个交互过程更加连贯流畅。在HarmonyOS中,应用窗口
    发表于 02-19 10:33

    HarmonyOS SDK 助力新浪新闻打造精致易用的新闻应用

    之一,从有声资讯入手,基于 Speech Kit 朗读控件上线听新闻功能,让新浪新闻充分发挥 HarmonyOS 原生智能优势,鸿蒙用户带来更加智能易用的新闻即时获取体验。 朗读控件,更智能、更精
    发表于 02-07 15:51

    HarmonyOS位置服务开发指南

    ”);通过这些定位技术,无论用户设备在室内或是户外,都可以准确地确定设备位置位置服务除了提供基础的定位服务之外,还
    发表于 11-27 16:02

    【鸿蒙生态千帆起】HarmonyOS系统级地图与位置服务,赋能广大开发者

    设备接续、无缝流转。! 未来,HarmonyOS系统级地图与位置服务将深入更多行业场景,开发者提供更多更有竞争力的产品及解决方案。
    发表于 11-22 10:37

    【鸿蒙生态千帆起】HarmonyOS系统级地图与位置服务,赋能广大开发者

    位置服务能力。 端云协同软硬结合,提供更全面差异化的位置服务 华为 终端云服务地图 业务高级产品经理表示, Petal Maps 将为 Harmo
    的头像 发表于 11-21 21:10 547次阅读
    【鸿蒙生态千帆起】<b class='flag-5'>HarmonyOS</b>系统级地图与<b class='flag-5'>位置服务</b>,赋能广大开发者

    HarmonyOS上使用ArkUI实现计步器应用

    介绍 本篇Codelab使用ArkTS语言实现计步器应用,应用主要包括计步传感器、定位服务和后台任务功能: 通过订阅计步器传感器获取计步器数据,处理后显示。 通过订阅位置服务获取位置
    发表于 11-16 11:17