HarmonyOS 鸿蒙Next如何获取地理位置信息

发布于 1周前 作者 itying888 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next如何获取地理位置信息

通过高德sdk获取到经纬度

 private listener: IAMapLocationListener = {
    onLocationChanged: async (location) => {
      try {
        let isAvailable = geoLocationManager.isGeocoderAvailable();
        if (isAvailable) {
          let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest =
            { 'latitude': location.latitude, 'longitude': location.longitude, 'maxItems': 1 };
          try {
            geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
              if (err) {
                console.log(' err: ' + JSON.stringify(err));
              } else {
                console.log('data: ' + JSON.stringify(data));
                this.placeName = data[0].placeName
              }
            });
          } catch (err) {
            console.error('err' + JSON.stringify(err));
          }
        }
      } catch (err) {
        console.error("err" + JSON.stringify(err));
      }

      this.getListData(location.latitude, location.longitude)
    }, onLocationError: (error) => {
     
    }
  };

这样获取到的位置不准确怎么解决啊


更多关于HarmonyOS 鸿蒙Next如何获取地理位置信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

ohos.permission.APPROXIMATELY_LOCATION,ohos.permission.LOCATION两个权限都申请了吗

在module.json5也要配置

可以参考下下面这段

import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { Logger } from '../log/Logger';
import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { intl } from '@kit.LocalizationKit';

const REQUEST_PERMISSIONS: Array<Permissions> = [
  'ohos.permission.APPROXIMATELY_LOCATION',
  'ohos.permission.LOCATION'
]

@Entry
@Component
struct Index {
  private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  @State message: string = '当前位置:';
  @State locale: string = new intl.Locale().language;

  getCurrentLocation() {
    let atManager = abilityAccessCtrl.createAtManager();
    try {
      atManager.requestPermissionsFromUser(this.context, REQUEST_PERMISSIONS).then((data) => {
        if (data.authResults[0] !== 0 || data.authResults[1] !== 0) {
          return;
        }

        let locationChange = (err: BusinessError, location: geoLocationManager.Location) => {
          // 获取经纬度
          if (location.latitude === 0 && location.longitude === 0) {
            return;
          }

          // 将经纬度转成实际位置
          let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
            'locale': this.locale.toString().includes('zh') ? 'zh' : 'en',
            'latitude': location.latitude,
            'longitude': location.longitude,
            'maxItems': 1
          };
          geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest).then(data => {
            if (data[0].placeName) {
              this.message = this.message + data[0].placeName;
            }
          }).catch((err: Error) => {
            Logger.error('GetAddressesFromLocation err ' + JSON.stringify(err));
          });
        };

        geoLocationManager.getCurrentLocation(locationChange);
      }).catch((err: Error) => {
        Logger.error(`req permissions failed, error.code:${err.name}, error message: ${err.message}.`)
      })
    } catch (err) {
      Logger.error(`req permissions failed, error.code:${err.code}, error message: ${err.message}.`)
    }
  }

  build() {
    Row() {
      Column() {
        Button("获取当前位置")
          .fontSize(20)
          .onClick(() => {
            this.getCurrentLocation()
          })

        Text(this.message)
          .fontSize(30)
          .fontWeight(FontWeight.Bold)

      }
      .width('100%')
    }
    .height('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next如何获取地理位置信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


定位不准确啊,获取的地理位置大概有1公里左右的偏差

试下使用鸿蒙的Map Kit获取经纬度

import { MapComponent, mapCommon, map } from ‘@kit.MapKit’; import { AsyncCallback } from ‘@kit.BasicServicesKit’;

@Entry @Component struct BasicMapDemo { private mapOptions?: mapCommon.MapOptions; private callback?: AsyncCallback<map.MapComponentController>; private mapController?: map.MapComponentController;

aboutToAppear(): void { // Map initialization parameters used to set the coordinates of the map center point and zoom level. let target: mapCommon.LatLng = { latitude: 39.9181, longitude: 116.3970193 }; let cameraPosition: mapCommon.CameraPosition = { target: target, zoom: 15 }; this.mapOptions = { position: cameraPosition };

// Map initialization callback.
this.callback = async (err, mapController) =&gt; {
  if (!err) {
    this.mapController = mapController;
    // Marker initialization parameters.
    let markerOptions: mapCommon.MarkerOptions = {
      position: {
        latitude: 39.9181,
        longitude: 116.3970193
      }
    };
    // Create a default marker icon.
    await this.mapController?.addMarker(markerOptions);
    let mapEventManager: map.MapEventManager = this.mapController.getEventManager();
    let callback = (position: mapCommon.LatLng) =&gt; {
      console.info("mapClick", `on-mapClick position = ${position.longitude}`);
      console.info("mapClick", `on-mapClick position = ${position.latitude}`);
    };
    mapEventManager.on("mapClick", callback);
  }
}

}

build() { Stack() { // Call the MapComponent component to initialize the map. MapComponent({ mapOptions: this.mapOptions, mapCallback: this.callback }).width(‘100%’).height(‘100%’); }.height(‘100%’) } }

通过高德获取的经纬度信息怎么通过鸿蒙代码获取地理位置信息啊,有没有大佬知道

在HarmonyOS 鸿蒙Next系统中,获取地理位置信息主要通过调用系统提供的地理位置API来实现。具体步骤如下:

  1. 权限声明:在config.json文件中声明地理位置权限,包括读取位置信息和访问位置服务的权限。

  2. 引入相关模块:在代码中引入位置服务模块,例如ohos.location

  3. 创建位置客户端:使用ohos.location.LocationManager.createClient方法创建位置客户端实例。

  4. 设置位置监听器:通过位置客户端的setLocationListener方法设置位置监听器,用于接收位置更新。

  5. 启动位置服务:调用位置客户端的start方法启动位置服务,根据需要选择高精度、低功耗等模式。

  6. 处理位置信息:在位置监听器的回调方法中处理接收到的位置信息,包括经度、纬度、海拔等。

  7. 停止位置服务:在不再需要位置信息时,调用位置客户端的stop方法停止位置服务,释放资源。

示例代码(简化):

let locationManager = ohos.location.LocationManager.createClient(context);
locationManager.setLocationListener({
    onLocationChanged: (location) => {
        console.log("Latitude: " + location.latitude + ", Longitude: " + location.longitude);
    }
});
locationManager.start();

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部