Abbruch bedingung schreiben für ST_3D_Intersection Funktion

Hallo zusammen,

ich habe ein Problem, zu dem ich leider nichts finden kann. Hat jemand von euch vielleicht eine Idee? Ist die gesuchte Abbruchbedingung schon implementiert?
Ich benutze die ST_3D_Intersection Funktion (http://postgis.net/docs/ST_3DIntersects.html), um Schnitte zwischen 3D-Linien und Polygonen berechnen zu können. Die Schnittpunktskoordinaten spielen keine Rolle, sondern nur, ob eine Linie von einem anderen Objekt (Polygon) geschnitten wird oder nicht. Mit der genannten Funktion ist das zwar alles wie gewünscht berechbar, alllerdings habe ich keine Lösung gefunden, wie ich die Funktion nach einem ‘true’ (Linie wird von Polygon geschnitten) an entsprechender Stelle abbrechen und zur nächsten Linie gehen lasse. Macht die Funktion das schon automatisch? Sinn des Ganzen ist, dass es sehr sehr viele Linien und Polygone sind und die Laufzeit so weit wir möglich verringert werden soll.

Ich bin für jeden Hinweis dankbar :slight_smile:

Viele Grüße

Welche Funktion nutzt du wofür? ST_3DIntersects liefert doch TRUE/FALSE?
Um das schneller zu machen gibt es mehrere Wege. Wie oft ändern sich denn deine Daten? Kannst du die Schnittergebnisse in ein Materialized View schreiben oder bei Insert/Änderung per Trigger in eine Ergebnis-Tabelle schreiben?

Gruß Uwe

Es geht hauptsächlich um die Performanz…wie könnte ich die Funktion denn schneller ‘machen’ :slight_smile:
Ich möchte herausfinden, ob 3D-Linien (gespeichert in der Tabelle ‘lines’) von Polygonen (Tabelle ‘surface_geometry’) geschnitten werden oder nicht, sodass die Info ‘true’ oder ‘false’ an sich ausreicht. Ich brauche einen Befehl, dass die Funktion die Schnittüberprüfung beendet wird, sobald für eine Linie ein ‘true’ ermittelt wurde.

Das aktuelle SQL-Skript lautet:

DROP TABLE IF EXISTS public.lines;
CREATE TABLE public.lines(
id char(20) NOT NULL,
wandpunkt char(20)
– geom geometry
);

SELECT AddGeometryColumn(‘public’, ‘lines’, ‘geom’, 0, ‘GEOMETRY’, 3, true);
–ALTER TABLE public.lines ADD CONSTRAINT lines_pk PRIMARY KEY(id);

INSERT INTO public.lines
SELECT
kuppelpunkte.point_id,
wandpunkte.wand_pk,
ST_MakeLine(wandpunkte.geom, kuppelpunkte.geom)

FROM public.kuppelpunkte,
public.wandpunkte
WHERE
wandpunkte.wand_pk = ‘217586’
–52423
AND
kuppelpunkte.azimuth
BETWEEN wandpunkte.range_a
AND wandpunkte.range_b;


–CREATE B-TREE, PRIMARY KEY & INDEX
CREATE UNIQUE INDEX lines_pk
ON public.lines
USING btree(id);

CREATE INDEX lines_gist3d_geom
ON public.lines
USING gist(geom gist_geometry_ops_nd);

– Add primary key
ALTER TABLE public.lines
ADD CONSTRAINT lines_pk
PRIMARY KEY USING INDEX lines_pk;

DROP TABLE IF EXISTS public.intersection;
CREATE TABLE public.intersection(
id char(20) NOT NULL,
wandp char(20),
inter boolean,
inte boolean

– geom geometry
);
INSERT INTO public.intersection
SELECT DISTINCT
lines.id,
lines.wandpunkt,
–ST_3DIntersects(lines.geom, surface_geometry.geometry) “ST_3DIntersects”,
_ST_3DIntersects(lines.geom, surface_geometry.geometry) “_ST_3DIntersects”
–ST_3DIntersects(lines.geom,kuppelpunkte.geom) “ST_3DIntersects”
FROM
public.lines,
public.surface_geometry
WHERE
ST_DWithin(lines.geom,surface_geometry.geometry, 5);

ALTER TABLE public.intersection
ADD inter_bool boolean;

INSERT INTO public.intersection
SELECT DISTINCT intersection.id
FROM public.intersection;
–ORDER BY intersection.id ASC;

SELECT COUNT(id) FROM public.intersection
UNION
SELECT COUNT(inter) FROM public.intersection WHERE inter =‘f’
–SELECT* FROM public.intersection WHERE inter=‘t’;




–ALTER TABLE public.wandpunkte
–ADD svf double;

–INSERT INTO public.wandpunkte



Die Linien werden aus Punkten auf einer Halbkuppel über einem Stadtmodell und aus Punkten auf Gebäudeflächen erstellt (je eine Linie von jedem Gebäudepunkt zu einem Punkt auf der Halbkuppel). Aktuell bekomme ich am Schluss zwei Werte heraus (aus COUNT…). Diese sind 1. die Gesamtanzahl der Linien pro Gebäudepunkt und 2. die Anzahl der Linien, die nicht durch umliegende Objekte geschnitten werden. Aus diesen beiden Werten berechne ich den Prozentsatz an sichtbaren Punkten auf der Halbkuppel.

Zeig bitte welche Abfrage konkret, und zwar mit Explain Analyse dazu.

Du könntest ganz pauschal alle Intersections der Linien mit den Gebäuden st_3dintersection bestimmen. Aus der daraus resultierenden Ergennismenge suchst du die mit leeren Intersections raus. Könnte sein, dass das schneller geht, weil du dir einen Haufen Checks sparst.

Gruß Uwe

Konkret geht es um folgenden Teil:

INSERT INTO public.intersection
SELECT DISTINCT
lines.id,
lines.wandpunkt,
_ST_3DIntersects(lines.geom, surface_geometry.geometry) “_ST_3DIntersects”
FROM
public.lines,
public.surface_geometry
WHERE
ST_DWithin(lines.geom,surface_geometry.geometry, 5);

Ich habe x Linien und y Polygone, die ich miteinander verschneiden möchte. Die Information, die ich brauche ist, ob eine Linie überhaupt von einem Polygon geschnitten wird. D.h. nach dem ersten Schnitt einer Linie mit einem Polygon könnte die Funktion eig. abbrechen. Den Vorschlag von Gisman habe ich eh schon umgesetzt, danke :slight_smile: Die eigentliche Frage bezog sich eher darauf, ob ein Abbruchkriterium für die Funktion eingebaut werden kann? Aber ich denke es sollte so auch gehen, vielen Dank! :slight_smile: