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.