需要一些高级 DAX 计算帮助 - 将三角函数应用于存储表

问题描述 投票:0回答:1

我目前正在尝试创建一个计算列,该列获取位置的纬度、经度和半径,并返回与表中每个位置的半径重叠的位置列表。

我想出了逻辑,但我遇到了语法问题,或者可能是 dax 本身对表变量工作方式的限制。关于如何剥皮有什么想法吗?

看起来我需要为每条记录创建一个真实的表来添加计算列,但这不是一个适用于 4000 多个位置的可扩展解决方案

Overlapping GLIDs = 
//storing values for current row
VAR __GLID1 = [GLID]
VAR __lat1 = [POS_LATITUDE]
VAR __long1 = [POS_LONGITUDE]
VAR __radius1 = [POS_RADIUS]/1000  //converting radius from m to km

//storing a duplicate location table as a table variable
VAR table1 = SUMMARIZE('LocTable1','LocTable1'[GLID],'LocTable1'[POS_LATITUDE],'LocTable1'[POS_LONGITUDE],'LocTable1'[POS_RADIUS])

//haversine formula to calculate distance between stored row and each row in the stored table
VAR __radiusEarth = 6371   // earth radius in kilometers
VAR __multiplier = PI()/180
VAR __latDiff = Calculate((selectedvalue(LocTable1[POS_LATITUDE])-__lat1) * __multiplier,table1)
VAR __lonDiff = Calculate((selectedvalue(LocTable1[POS_LONGITUDE])-__long1) * __multiplier,table1)
VAR __formula1 = Calculate(SIN(__latDiff/2) * SIN(__latDiff/2) +
    COS(selectedvalue('LocTable1'[POS_LATITUDE]) * __multiplier) * COS(__lat1 * __multiplier) * 
    SIN(__lonDiff/2) * SIN(__lonDiff/2),table1)
VAR __formula2 = Calculate(2 * ATAN(DIVIDE(SQRT(__formula1),SQRT(1-__formula1))),table1)
VAR __distance = Calculate(__radiusEarth * __formula2,table1)

//add distance column to stored table and filter table to locations whos radius+the stored row's radius is less than distance between locations
VAR table2 = addcolumns(table1,"distance",__distance)
VAR table3 = calculatetable(
        filter(table2,
        [distance]<(__radius1+(selectedvalue(LocTable1[POS_RADIUS])/1000))
    ))

//turn filtered table into a string of "overlapping GLIDs"    
VAR __ListGLIDs = Concatenatex(table3,[GLID],"^")

RETURN
__ListGLIDs
dax trigonometry calculated-columns
1个回答
0
投票

我最终创建了第二个表,其中每个位置配对都有一行,包括纬度、经度和半径列。将 4k 行变成 16k 行。添加了使用半正弦公式计算距离的列

VAR __radiusEarth = 6371   // earth radius in kilometers
VAR __multiplier = PI()/180
VAR __latDiff = ([POS_LATITUDE1]-[POS_LATITUDE2]) * __multiplier
VAR __lonDiff = ([POS_LONGITUDE1]-[POS_LONGITUDE2]) * __multiplier
VAR __formula1 = SIN(__latDiff/2) * SIN(__latDiff/2) +
    COS([POS_LATITUDE1] * __multiplier) * COS([POS_LATITUDE2] * __multiplier) * 
    SIN(__lonDiff/2) * SIN(__lonDiff/2)
VAR __formula2 = 2 * ATAN(DIVIDE(SQRT(__formula1),SQRT(1-__formula1)))
VAR __distance = __radiusEarth * __formula2
RETURN
__distance

添加了一列,用于将添加的半径转换为公里

([Radius1]+[Radius2])/1000

然后在原始表中添加一个计算列,总结第二个表,过滤到距离为 < the added radius and turning it into a string

的位置
Overlapping GLID = 
VAR __GLID = 'Location Master'[GLID]
VAR table1 = Filter(summarizecolumns(LocDistanceTable[GLID],LocDistanceTable[GLID2],LocDistanceTable[Added Radius km],LocDistanceTable[Distance km]),LocDistanceTable[GLID]=__GLID)
VAR table2 = Calculatetable(
    filter(table1,
    LocDistanceTable[Distance km]<LocDistanceTable[Added Radius km] && LocDistanceTable[GLID2]<>__GLID)
)
VAR __ListGLIDs = Concatenatex(table2,[GLID2],"^")

RETURN
__ListGLIDs

瞧!

© www.soinside.com 2019 - 2024. All rights reserved.