Hallo zusammen,
ich hänge nun schon seit ein paar Stunden an einem Problem.
Ich möchte zu einem Punkt den nächsten Nachbarn suchen (PostGIS), um das ganze performanter zu machen benutze ich ich eine BOX3D um meinen Bereich in dem der nächste Nachbar gesucht werden soll.
CREATE OR REPLACE FUNCTION my_nearest_srtm_neighbor(p_in geometry) RETURNS TABLE(id integer, height integer, point geometry, distance double precision) AS $$
DECLARE
x double precision := ST_X(p_in);
y double precision := ST_Y(p_in);
mybox box3d := ('BOX3D(' || (x-0.005) || ' ' || (y-0.005) || ', ' || (x+0.005) || ' ' || (y+0.005) || ')')::box3d;
BEGIN
RAISE NOTICE 'Point is: %', ST_AsText(p_in);
RAISE NOTICE 'Box is: %', ST_AsText(mybox);
RETURN QUERY SELECT id, height, point, ST_Distance(point, p_in)
FROM srtm
WHERE point && mybox
AND ST_Distance(point, p_in) =
(
SELECT MIN(ST_Distance(point, p_in))
FROM srtm
WHERE point && mybox
);
END;
$$ LANGUAGE plpgsql;
Ich bekomme allerdings ständig 0 Zeilen zurückgeliefert. Mein Punkt (Parameter) ist ok, die Box die erstellt wird stimmt und wenn ich die Query so, also ohne PGSQL-Funktion ausführe funktioniert es.
Was lustigerweise auch funktioniert ist folgendes:
DROP FUNCTION my_nearest_srtm_neighbor(geometry);
/*TABLE(id integer, height integer, point geometry, distance double precision)*/
CREATE OR REPLACE FUNCTION my_nearest_srtm_neighbor(p_in geometry) RETURNS integer AS $$
DECLARE
x double precision := ST_X(p_in);
y double precision := ST_Y(p_in);
mybox box3d := ('BOX3D(' || (x-0.005) || ' ' || (y-0.005) || ', ' || (x+0.005) || ' ' || (y+0.005) || ')')::box3d;
t_row RECORD;
BEGIN
RAISE NOTICE 'Point is: %', ST_AsText(p_in);
RAISE NOTICE 'Box is: %', ST_AsText(mybox);
SELECT id, height, point, ST_Distance(point, p_in)
INTO t_row
FROM srtm
WHERE point && mybox
AND ST_Distance(point, p_in) =
(
SELECT MIN(ST_Distance(point, p_in))
FROM srtm
WHERE point && mybox
);
RETURN t_row.id;
END;
$$ LANGUAGE plpgsql;
Ich lasse mir also nicht die ganze Zeile ausgeben sondern lediglich die ID des Punktes. Das funktioniert wunderbar. Warum funktioniert mein erster Ansatz nicht?
Vielen Dank für eure Hilfe!
Viele Grüße
PS: Ich hoffe ich habe die Board-Konventionen mit CodeTags etc. eingehalten