Supabase 客户端(JS):按距离过滤

问题描述 投票:0回答:1

在 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 的记录,是否可以这样做?

javascript postgis supabase supabase-database
1个回答
0
投票

实现这一点的最好方法是将其直接封装在 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}]

© www.soinside.com 2019 - 2024. All rights reserved.