HarmonyOS 鸿蒙Next如何获取地理位置信息
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
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) => {
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) => {
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来实现。具体步骤如下:
-
权限声明:在
config.json
文件中声明地理位置权限,包括读取位置信息和访问位置服务的权限。 -
引入相关模块:在代码中引入位置服务模块,例如
ohos.location
。 -
创建位置客户端:使用
ohos.location.LocationManager.createClient
方法创建位置客户端实例。 -
设置位置监听器:通过位置客户端的
setLocationListener
方法设置位置监听器,用于接收位置更新。 -
启动位置服务:调用位置客户端的
start
方法启动位置服务,根据需要选择高精度、低功耗等模式。 -
处理位置信息:在位置监听器的回调方法中处理接收到的位置信息,包括经度、纬度、海拔等。
-
停止位置服务:在不再需要位置信息时,调用位置客户端的
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