You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI中Haversine公式计算结果不符合预期的问题求助

Power BI Haversine距离计算异常问题排查

需求说明

  • 核心目标:选择英国邮编区域(如BS10、L20、LS9)和指定英里半径,在地图上可视化该范围内的所有员工
  • 限制:因数据保护无法提供示例文件,仅能通过文字描述问题

数据表结构

  • rv_staff:员工信息表,包含员工完整/部分邮编、对应经纬度字段(Lat、Long)
  • Area Selection:英国邮编区域表,仅存储邮编前半部分、对应经纬度字段(latitude、longitude)及地区(利兹/曼彻斯特/布里斯托尔等)信息
  • 表关系:通过部分邮编建立rv_staff到Area Selection的多对一关系(区域表中每个邮编唯一,员工表中对应多条记录)

已完成设置

  • 已配置半径滑块控件
  • 已设置切片器/下拉列表,可从Area Selection表中选择目标邮编区域
  • 需要实现:生成表格,仅显示所选邮编区域指定半径内的员工,同时展示员工到该区域的距离

问题及尝试过程

尝试1:初始Haversine度量值

使用参考资料中的DAX公式计算距离:

Distance = 

var Lat1 = MIN('Area Selection'[latitude])
var Lng1 = MIN('Area Selection'[longitude])

var Lat2 = MIN(rv_staff[Lat])
var Lng2 = MIN(rv_staff[Long])

var P = DIVIDE( PI(), 180)
var A = 0.5 - COS((Lat2-Lat1) * p)/2 + 
    cos(Lat1 * p) * COS(Lat2 * P) * (1-COS((Lng2 - Lng1) * p)) /2
var final = (3958 * ASIN((SQRT(A))))
return final

异常现象:设置半径为100英里时,康沃尔/德文郡的员工到任意地区(甚至格拉斯哥)的距离均显示为50-100英里,结果明显错误。

尝试2:验证所选区域的经纬度

为排查坐标是否正确,创建两个度量值获取选中邮编区域的经纬度:

Selected Postcode - Lat = LOOKUPVALUE('Area Selection'[latitude], 'Area Selection'[postcode], SELECTEDVALUE('Area Selection'[postcode]))
Selected Postcode - Long = LOOKUPVALUE('Area Selection'[longitude], 'Area Selection'[postcode], SELECTEDVALUE('Area Selection'[postcode]))

验证结果:每次切换邮编区域,坐标都会正确更新,与谷歌地图抽查的地点坐标匹配,排除初始邮编选择的问题。

尝试3:代入验证后的坐标重新计算

将上述验证后的度量值代入Haversine公式(疑问:仅使用一组坐标时为何需要MIN()函数?):

Linguist Distance (Miles) = 

var Lat1 = [Selected Postcode - Lat]
var Lng1 = [Selected Postcode - Long]

var Lat2 = MIN(rv_staff[Lat])
var Lng2 = MIN(rv_staff[Long])

var P = DIVIDE( PI(), 180)
var A = 0.5 - COS((Lat2-Lat1) * p)/2 + 
    cos(Lat1 * p) * COS(Lat2 * P) * (1-COS((Lng2 - Lng1) * p)) /2
var final = (3958 * ASIN((SQRT(A))))
return final

异常现象:所有员工的距离均显示为0,完全不符合实际。

尝试4:社区建议的列计算方法

尝试使用另一版本的Haversine公式(列计算):

Distance = 
acos(sin([Selected Postcode - Lat])*sin(rv_staff[Lat])+cos([Selected Postcode - Lat])*cos(rv_staff[Lat])*cos(rv_staff[Long]-[Selected Postcode - Long]))*3958

异常现象:触发错误提示:函数'ACOS'的参数数据类型错误,或结果过大/过小

请求帮助

目前已尝试多种方法均未得到正确的距离计算结果,不清楚问题根源所在,希望能得到解决建议或排查方向。

内容的提问来源于stack exchange,提问作者Sh4dow85

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:43:27