Ir para conteúdo
  • 0

Erro na formula DAX


Dbechelli
Ir para solução Solucionado por Dums ,

Pergunta

2 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
  • Solução

Olá, tudo bem?

Cara, o DAX tem uma parada que deixa um lixo na enésima casa decimal, pelo que percebi isso está acontecendo no retorno da função COS, deixando o valor maior que 1 (é 1, mas lá na última casa decimal tem algum lixo), ai faz com que a ACOS considere isso um erro (fora da faixa de -1 até 1)...

 

Fiz um tratamento na sua medida, pelos testes aqui deu boa:

Distancia = 
VAR LatitudeReferencia = SELECTEDVALUE(Referencia[LATITUDE])
VAR LongitudeReferencia = SELECTEDVALUE(Referencia[LONGITUDE])
VAR Raio = [Valor Parâmetro]
VAR paramArcos = 
    COS(RADIANS(SELECTEDVALUE('Municípios'[LATITUDE]))) *
                COS(RADIANS(LatitudeReferencia)) *
                COS(RADIANS(SELECTEDVALUE('Municípios'[LONGITUDE])) - RADIANS(LongitudeReferencia)) +
                SIN(RADIANS(SELECTEDVALUE('Municípios'[LATITUDE]))) *
                SIN(RADIANS(LatitudeReferencia))
VAR paramArcosAjustado =
    SWITCH(
        TRUE(),
        paramArcos > 1,
        1,
        paramArcos < -1,
        -1,
        paramArcos
    )
VAR vACOS =  ACOS(paramArcosAjustado) * 6371
RETURN
CALCULATE (
    SUMX (
        'Municípios',
        IF (vACOS <= Raio && vACOS > 0,
            1,
            0
        )
    )
)

Na Distancia_2 também precisa este "ajuste":

Distancia_2 = 
VAR x1 = RADIANS(SELECTEDVALUE('Municípios'[LATITUDE]))
VAR x2 = RADIANS(SELECTEDVALUE(Referencia[LATITUDE]))
VAR y1 = RADIANS(SELECTEDVALUE('Municípios'[LONGITUDE]))
VAR y2 = RADIANS(SELECTEDVALUE(Referencia[LONGITUDE]))
VAR Raio = 6371
VAR lcos = SIN(x1) * SIN(x2) + COS(x1) * COS(x2) * COS(y1-y2)
VAR paramArcosAjustado =
    SWITCH(
        TRUE(),
        lcos > 1,
        1,
        lcos < -1,
        -1,
        lcos
    )
VAR varco = ACOS(paramArcosAjustado) 
RETURN
CALCULATE (
    SUMX (
        'Municípios',
        IF (
            varco * 6371 <= Raio && varco * 6371 > 0 ,
            varco * Raio,
            BLANK()
        )
    )
)

image.png.e3a7ae4f3f83660332af938093104c47.png

Editado por Dums
  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
1 hora atrás, Dums disse:

Olá, tudo bem?

Cara, o DAX tem uma parada que deixa um lixo na enésima casa decimal, pelo que percebi isso está acontecendo no retorno da função COS, deixando o valor maior que 1 (é 1, mas lá na última casa decimal tem algum lixo), ai faz com que a ACOS considere isso um erro (fora da faixa de -1 até 1)...

 

Fiz um tratamento na sua medida, pelos testes aqui deu boa:

Distancia = 
VAR LatitudeReferencia = SELECTEDVALUE(Referencia[LATITUDE])
VAR LongitudeReferencia = SELECTEDVALUE(Referencia[LONGITUDE])
VAR Raio = [Valor Parâmetro]
VAR paramArcos = 
    COS(RADIANS(SELECTEDVALUE('Municípios'[LATITUDE]))) *
                COS(RADIANS(LatitudeReferencia)) *
                COS(RADIANS(SELECTEDVALUE('Municípios'[LONGITUDE])) - RADIANS(LongitudeReferencia)) +
                SIN(RADIANS(SELECTEDVALUE('Municípios'[LATITUDE]))) *
                SIN(RADIANS(LatitudeReferencia))
VAR paramArcosAjustado =
    SWITCH(
        TRUE(),
        paramArcos > 1,
        1,
        paramArcos < -1,
        -1,
        paramArcos
    )
VAR vACOS =  ACOS(paramArcosAjustado) * 6371
RETURN
CALCULATE (
    SUMX (
        'Municípios',
        IF (vACOS <= Raio && vACOS > 0,
            1,
            0
        )
    )
)

Na Distancia_2 também precisa este "ajuste":

Distancia_2 = 
VAR x1 = RADIANS(SELECTEDVALUE('Municípios'[LATITUDE]))
VAR x2 = RADIANS(SELECTEDVALUE(Referencia[LATITUDE]))
VAR y1 = RADIANS(SELECTEDVALUE('Municípios'[LONGITUDE]))
VAR y2 = RADIANS(SELECTEDVALUE(Referencia[LONGITUDE]))
VAR Raio = 6371
VAR lcos = SIN(x1) * SIN(x2) + COS(x1) * COS(x2) * COS(y1-y2)
VAR paramArcosAjustado =
    SWITCH(
        TRUE(),
        lcos > 1,
        1,
        lcos < -1,
        -1,
        lcos
    )
VAR varco = ACOS(paramArcosAjustado) 
RETURN
CALCULATE (
    SUMX (
        'Municípios',
        IF (
            varco * 6371 <= Raio && varco * 6371 > 0 ,
            varco * Raio,
            BLANK()
        )
    )
)

image.png.e3a7ae4f3f83660332af938093104c47.png

Perfeito, muito obrigado pela colaboração!!!!

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...