HarmonyOS鸿蒙Next中使用sceneMap(场景化控件)标点偏移和距离计算不对

HarmonyOS鸿蒙Next中使用sceneMap(场景化控件)标点偏移和距离计算不对 image

使用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初始化时指定了正确的坐标系参数
  • 检查地图缩放级别是否合适

如果问题仍然存在,建议提供更详细的场景描述和测试数据。

回到顶部