HarmonyOS鸿蒙Next中使用sceneMap(场景化控件)标点偏移和距离计算不对
HarmonyOS鸿蒙Next中使用sceneMap(场景化控件)标点偏移和距离计算不对
使用sceneMap(场景化控件)标点偏移和距离计算不对,将坐标转化为GCJ02坐标只能解决标点偏移的问题,距离计算还是不对,有什么解决方案
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';
let locationChoosingOptions: sceneMap.LocationChoosingOptions = {
location: { latitude: 39.92194051376904, longitude: 116.3971836796932 },
language: 'en',
searchEnabled: true,
showNearbyPoi: true
};
sceneMap.chooseLocation(this.getUIContext().getHostContext() as common.UIAbilityContext, locationChoosingOptions)
.then((data) => {
console.info("ChooseLocation", "Succeeded in choosing location.");
})
.catch((err: BusinessError) => {
console.error("ChooseLocation", `Failed to choose Location, code: ${err.code}, message: ${err.message}`);
});
更多关于HarmonyOS鸿蒙Next中使用sceneMap(场景化控件)标点偏移和距离计算不对的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
在HarmonyOS Next中使用sceneMap进行标点定位时出现偏移和距离计算不准的问题,通常与坐标系转换或地图投影参数设置有关。确保使用正确的GeoCoordinate坐标系进行位置标定,检查sceneMap的mapProjection参数是否设置为当前区域适用的投影类型(如GCJ-02)。距离计算误差可能源于未使用ellipsoidalDistance方法进行大地线距离计算,而非平面坐标系下的直线距离。验证定位数据源的坐标系是否与sceneMap匹配。
更多关于HarmonyOS鸿蒙Next中使用sceneMap(场景化控件)标点偏移和距离计算不对的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
关于HarmonyOS Next中sceneMap控件标点偏移和距离计算问题
建议检查以下几点:
1. 坐标系转换问题
- 确保所有坐标点都使用相同的坐标系(推荐GCJ02)
- 在计算距离前统一转换坐标系
2. 距离计算方式
- 检查是否使用了正确的球面距离计算公式
- 可以使用Haversine公式进行精确计算
3. 代码改进建议
// 添加坐标系转换
import { geoLocationManager } from '@kit.LocationKit';
// 转换坐标到GCJ02
async function convertToGCJ02(lat, lon) {
try {
const result = await geoLocationManager.convertCoord(lat, lon, geoLocationManager.CoordType.WGS84, geoLocationManager.CoordType.GCJ02);
return result;
} catch (err) {
console.error('Coordinate conversion failed');
return {latitude: lat, longitude: lon};
}
}
// 计算两点间距离
function calculateDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // 地球半径(km)
const dLat = (lat2 - lat1) * Math.PI / 180;
const dLon = (lon2 - lon1) * Math.PI / 180;
const a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return R * c * 1000; // 返回米
}
4. 使用场景化控件时
- 确保sceneMap初始化时指定了正确的坐标系参数
- 检查地图缩放级别是否合适
如果问题仍然存在,建议提供更详细的场景描述和测试数据。