Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
7 years ago
Solved

Measuring Distance to find closest point between points from a single table

Hi All,    Hoping someone may know how to include a FILTER to remove itself as a possible answer.    For the example i am trying to find the closest neighbour to a house in a single table, i have...
  • dedelman_clng's avatar
    dedelman_clng
    7 years ago

    OK, I took AlBs code and Anonymouss last post and turned it into a measure.  First, I recreated 'Route Information' to have 5 dates' worth of data, one date of which is missing 3 of the locations (Dt is literally just a list of 5 dates 1/14 - 1/18):

     

    Route Information =
    UNION (
        CROSSJOIN (
            SUMMARIZE (
                'Table2 (2)',
                'Table2 (2)'[MEMNO],
                'Table2 (2)'[Post Code],
                'Table2 (2)'[Lattitude],
                'Table2 (2)'[Longitude]
            ),
            FILTER ( Dt, Dt[Date] < "1/18/18" )
        ),
        CROSSJOIN (
            SUMMARIZE (
                FILTER (
                    'Table2 (2)',
                    NOT ( 'Table2 (2)'[MEMNO] IN { "A21200", "A22701", "B10500" } )
                ),
                'Table2 (2)'[MEMNO],
                'Table2 (2)'[Post Code],
                'Table2 (2)'[Lattitude],
                'Table2 (2)'[Longitude]
            ),
            FILTER ( Dt, Dt[Date] = "1/18/18" )
        )
    )

    Then taking the working code, transformed it into a measure, keeping the Date filter (I'm probably not doing it the most efficient way using variables - I still have trouble getting ALLEXCEPT and KEEPFILTER working without trial and error):

     

    DCH (Miles) =
    VAR HouseLatitude = MIN ( 'Route Information'[Lattitude] )
    VAR HouseLongitude = MIN ( 'Route Information'[Longitude] )
    VAR EarthCircumference = 3959
    VAR P = DIVIDE ( PI (), 180 )
    VAR House = SELECTEDVALUE ( 'Route Information'[MEMNO] )
    VAR __Dt = SELECTEDVALUE ( 'Route Information'[Date] )
    RETURN
        MINX (
            FILTER (
                ALL ( 'Route Information' ),
                'Route Information'[MEMNO] <> House
                    && 'Route Information'[Date] = __Dt
            ),
            VAR CinemaLatitude = 'Route Information'[Lattitude]
            VAR CinemaLongitude = 'Route Information'[Longitude]
            VAR _DistanceFromCurrentRough =
                80 * SQRT ( POWER ( ( HouseLatitude - CinemaLatitude ), 2 ) +  POWER ( ( HouseLongitude - CinemaLongitude ), 2 )
                    )
            RETURN
                IF ( _DistanceFromCurrentRough <> 0, _DistanceFromCurrentRough )
        )

    As you can see, on 1/18/18, the distance is different for M49418