I do it this way. I pass in the lat/long via field maps but same concept should work.

For you I think

pulldata on the geopoint to get lat and long where they are like this pulldata("@geopoint", ${GPS}, "x")

pulldata on the csv to get lat long of where they should be

calc a field using this formula and put a constraint on it - I found this formula no idea how it works but it does in meters. I use a red warning note instead of a constraint just in case their GPS is not working.

round(acos(sin(${SampledMidLatitude} * pi() div 180)*sin(${DesignLat} * pi() div 180) + cos(${SampledMidLatitude} * pi() div 180)*cos(${DesignLat} * pi() div 180)*cos((${DesignLong} * pi() div 180)-(${SampledMidLongitude} * pi() div 180))) * 6371000,2)

Hope that makes sense. Works great for us. Note I guess they could cheat the map by manually moving but they should know.