我目前正在尝试创建一个计算列,该列获取位置的纬度、经度和半径,并返回与表中每个位置的半径重叠的位置列表。
我想出了逻辑,但我遇到了语法问题,或者可能是 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
我最终创建了第二个表,其中每个位置配对都有一行,包括纬度、经度和半径列。将 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
瞧!