在 supabase Javascript 客户端中是否可以进行距离过滤? 如果可能的话,我想避免实现服务器端逻辑。
// Define the distance threshold in meters (50km = 50000m)
const distanceThreshold = 50000
const targetLatitude = 10.724577
const targetLongitude = 5.525625
const supabaseClient = createClient(supabaseUrl, supabaseKey)
supabaseClient
.from('my_table')
.select('*')
.filter(
`ST_Distance_Sphere(
ST_MakePoint(longitude, latitude),
ST_MakePoint(${targetLongitude}, ${targetLatitude})
)`, 'lt', distanceThreshold
)
.then(console.log)
我想从“my_table”表中获取距目标位置位置最远 50km 的记录,是否可以这样做?
实现这一点的最好方法是将其直接封装在 RPC 调用中:
CREATE OR REPLACE FUNCTION get_entries_within_distance(tlongitude float, tlatitude float, distance numeric)
RETURNS SETOF my_table AS
$$
BEGIN
RETURN QUERY SELECT * FROM my_table
WHERE ST_DistanceSphere(ST_MakePoint(longitude, latitude), ST_MakePoint(tlongitude, tlatitude)) < distance::float;
END;
$$LANGUAGE plpgsql VOLATILE;
从 SQL 调用:
select * from get_records_within_distance(10.724577,5.525625, 900000);
从 Javascript 客户端库调用:
const { data: ret, error } = await supabase
.rpc('get_entries_within_distance',
{ tlongitude: 5.525625, tlatitude: 10.724577, distance: 900000});
console.log(JSON.stringify(ret));
例如返回:
[{"id":1,"created_at":"2023-02-24T15:03:00.965401+00:00","latitude":10.724578,"longitude":5.525624},{"id":2," created_at":"2023-02-24T15:03:21.587739+00:00","latitude":10.72457,"longitude":5.52561}]