HarmonyOS 鸿蒙Next--定位服务获取经纬度,逆地理编码为地址,并计算两个经纬度之间的距离
HarmonyOS 鸿蒙Next–定位服务获取经纬度,逆地理编码为地址,并计算两个经纬度之间的距离
0、使用定位服务获取经纬度,再通过逆地理编码获取地址,并计算两个经纬度之间的距离
1、获取定位权限
Button(“获取定位权限”)
.onClick(async () => {
const permissions: Array<Permissions> =
[‘ohos.permission.APPROXIMATELY_LOCATION’, ‘ohos.permission.LOCATION’];
const context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
await checkPermissions(permissions, context).then((isGrant: boolean) => {
if (isGrant) {
this.appPathStack.pushPathByName(NavigationKey.ATTENDANCE_CLOCK_IN_PAGE, null)
}
})
})
2、获取定位信息
initLocation() {
let requestInfo: geoLocationManager.LocationRequest = {
‘priority’: geoLocationManager.LocationRequestPriority.FIRST_FIX, // 快速定位优先策略
‘timeInterval’: 0,
‘distanceInterval’: 0,
‘maxAccuracy’: 0
};
let locationChange = (location: geoLocationManager.Location): void => {
console.log('locationChanger: data: ’ + JSON.stringify(location));
this.getAddresses(location) // 逆地理编码
};
// 启动定位
try {
geoLocationManager.on(‘locationChange’, requestInfo, locationChange);
} catch (err) {
setTimeout(() => {
toast(“请打开定位功能”)
}, 1000)
console.error(“errCode:” + (err as BusinessError.BusinessError).code + “,errMessage:” +
(err as BusinessError.BusinessError).message);
}
}
3、逆地理编码获取地理信息
getAddresses(location: geoLocationManager.Location) {
let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
“latitude”: location.latitude,
“longitude”: location.longitude,
“maxItems”: 1
};
let isAvailable = false
// 查询geoCoder服务是否可用
try {
isAvailable = geoLocationManager.isGeocoderAvailable();
} catch (err) {
console.error(“errCode:” + (err as BusinessError.BusinessError).code + “,errMessage:” +
(err as BusinessError.BusinessError).message);
}
if (isAvailable) {
try {
geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
if (err) {
// 定位失败
console.log('getAddressesFromLocation err: ’ + JSON.stringify(err));
} else {
// 定位成功,处理位置信息
console.log('getAddressesFromLocation data: ’ + JSON.stringify(data[0]));
}
});
} catch (err) {
console.error(“errCode:” + (err as BusinessError.BusinessError).code + “,errMessage:” +
(err as BusinessError.BusinessError).message);
}
}
}
4、结束定位
aboutToDisappear(): void {
// 结束定位
geoLocationManager.off(‘locationChange’, this.locationChange);
}
5、计算两个经纬度之间的距离
function getRad(d: number) {
const PI = Math.PI
return d * PI / 180.0
}
export function getDistance(lat1: number, lng1: number, lat2: number, lng2: number) {
const EARTH_RADIUS = 6378137.0
let f = getRad((lat1 + lat2) / 2)
let g = getRad((lat1 - lat2) / 2)
let l = getRad((lng1 - lng2) / 2)
let sg = Math.sin(g)
let sl = Math.sin(l)
let sf = Math.sin(f)
let s: number, c: number, w: number, r: number, d: number, h1: number, h2: number
let a = EARTH_RADIUS
let fl = 1 / 298.257
sg = sg * sg
sl = sl * sl
sf = sf * sf
s = sg * (1 - sl) + (1 - sf) * sl
c = (1 - sg) * (1 - sl) + sf * sl
w = Math.atan(Math.sqrt(s / c))
r = Math.sqrt(s * c) / w
d = 2 * w * a
h1 = (3 * r - 1) / 2 / c
h2 = (3 * r + 1) / 2 / s
return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg))
}
在HarmonyOS鸿蒙系统中,若要实现定位服务获取经纬度、逆地理编码为地址,并计算两个经纬度之间的距离,您可以参考以下步骤:
-
获取经纬度:
- 使用HarmonyOS提供的定位API(如LocationKit)获取设备的当前经纬度。确保应用已申请并获取了定位权限。
-
逆地理编码:
- 利用地图服务SDK(如华为地图服务)的逆地理编码功能,将经纬度转换为详细的地址信息。需调用相应的逆地理编码API,并传入经纬度数据。
-
计算两个经纬度之间的距离:
- 采用Haversine公式或其他地理距离计算公式,根据两个经纬度的坐标计算出它们之间的距离。这些公式在多种编程语言中都有实现,可以根据需求选择合适的实现方式。
以上步骤在HarmonyOS环境下通常是可行的,但具体实现细节可能因API版本、设备兼容性等因素有所不同。在开发过程中,建议详细阅读HarmonyOS开发者文档和相关SDK的API参考,以确保功能的正确实现。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html