George MacKerron đã viết một hàm Neighbor Neighbor đơn giản mà tôi thấy khá hữu ích. Hàm này trả về ID của hàng xóm gần nhất với một tính năng nhất định:
create or replace function
nn(nearTo geometry
, initialDistance real
, distanceMultiplier real
, maxPower integer
, nearThings text
, nearThingsIdField text
, nearThingsGeometryField text)
returns integer as $$
declare
sql text;
result integer;
begin
sql := ' select ' || quote_ident(nearThingsIdField)
|| ' from ' || quote_ident(nearThings)
|| ' where st_dwithin($1, '
|| quote_ident(nearThingsGeometryField) || ', $2 * ($3 ^ $4))'
|| ' order by st_distance($1, ' || quote_ident(nearThingsGeometryField) || ')'
|| ' limit 1';
for i in 0..maxPower loop
execute sql into result using nearTo -- $1
, initialDistance -- $2
, distanceMultiplier -- $3
, i; -- $4
if result is not null then return result; end if;
end loop;
return null;
end
$$ language 'plpgsql' stable;
Ví dụ sử dụng:
SELECT id, nn(pt_geom,0.00001,2,100,'nw_node','node_id','node_geom') FROM my_point_table;
... Chọn nút gần nhất trong bảng nw_node cho mỗi mục trong my_point_table.
Ngoài ra còn có một chức năng chung hơn trên trang web Boston GIS .