I would be interested in comparing the performance of Uber's first pass "city-fencing" vs a pre-computed 1D array.
EG: Subdivide a flat projection of earth into n^2 squares. Create an array of length n^2. Set the value of each element in the array to a list of canidate geofences(which have area in that square).
Scale lat and long between 0 and 1. Then you can index directly into it with PrecomputedArray[floor(lat*n+long)]
This is trading space for time, may as well choose space here.