Indem du sie entsprechend sortierst. Du kannst den Geometrien, die du im Collect zusammenfassen willst, nach einem Kriterium sortieren mittels order by.
CU Uwe *der_jetzt_wieder_mit_den_schnellen_tools_schafft*
Hallo,
Kabel bestehen aus Trassensegmenten.
Jedes Kabel ist wie die Trassensegmente noch einem Pfad zugeordnet. Dadurch ist auch die Reihenfolge der Trassensegmente entlang eines Kabels festgelegt.
erg1.jpgCode:SELECT public.kabel.id_kabel, public.trassensegment.id_segment, astext(public.trassensegment.the_geom) AS the_geom, public.pfadknoten.pfad_id, public.pfadknoten.pfadknoten_nr FROM public.trassensegment_kabel RIGHT OUTER JOIN public.kabel ON (public.trassensegment_kabel.kabel_id = public.kabel.id_kabel) INNER JOIN public.trassensegment ON (public.trassensegment_kabel.segment_id = public.trassensegment.id_segment) INNER JOIN public.pfadknoten ON (public.trassensegment_kabel.pfadknoten_id_nach = public.pfadknoten.id_pfadknoten) ORDER BY public.pfadknoten.pfad_id, public.pfadknoten.pfadknoten_nr
Wie kann ich die Segmente in der festgelegten Reihenfolge mergen?
Gruß Karl
Indem du sie entsprechend sortierst. Du kannst den Geometrien, die du im Collect zusammenfassen willst, nach einem Kriterium sortieren mittels order by.
CU Uwe *der_jetzt_wieder_mit_den_schnellen_tools_schafft*
Have a lot of fun!
Aussgabe: 145 Datensätze, also alle Segmente.Code:SELECT public.trassensegment_kabel.kabel_id, st_astext(st_linemerge(st_collect(trassensegment.the_geom))) AS the_geom, public.pfadknoten.pfadknoten_nr, public.pfadknoten.pfad_id FROM public.trassensegment_kabel INNER JOIN public.trassensegment ON (public.trassensegment_kabel.segment_id = public.trassensegment.id_segment) INNER JOIN public.pfadknoten ON (public.trassensegment_kabel.pfadknoten_id_nach = public.pfadknoten.id_pfadknoten) GROUP BY pfadknoten.pfadknoten_nr, trassensegment_kabel.kabel_id, pfadknoten.pfad_id ORDER BY pfadknoten.pfad_id, pfadknoten.pfadknoten_nr
Oder schon im Collect sortieren? Subselect?
Hm. Grübel. Eventuell braucht man ein Subselect. Aber ich mach erst mal Feierabend für heut.
Grüssle Uwe
Have a lot of fun!
Der Feierabend und das Wochenende sollten auch anderweitig genutzt werden...
er1..jpg er..jpg
Hier das ER und die Ausgabe für die Abfrage. Über die Pfadknoten_nr wird die Reihenfolge der Trassensegmente festgelegt.
Subselect: Zu jedem Kabel die Trassensegmente getrennt auslesen?
Das letzte Beispiel von ST_LineMerge ist ja ein Subselect. Nur wie baue ich hier ein Join ein?
Code:CREATE TABLE tmp1 (id int, geom geometry); INSERT INTO tmp1 VALUES (3,'LINESTRING(0 0, 1 0, 2 0, 5 0)'); INSERT INTO tmp1 VALUES (1,'LINESTRING(2 0, 5 0, 6 0, 7 0)'); INSERT INTO tmp1 VALUES (2,'LINESTRING(1 0, 2 0, 5 0, 6 0)'); SELECT AsText(ST_Union(geom)) FROM tmp astext SELECT AsText(ST_Collect(geom)) FROM tmp; SELECT AsText(ST_Union(geom)) FROM (SELECT ST_Collect(geom) as geom FROM tmp) AS foo; SELECT AsText(ST_Union(geom, ST_StartPoint(geom))) FROM (SELECT ST_Collect(geom) as geom FROM tmp) AS foo; SELECT AsText(ST_LineMerge(geom)) FROM (SELECT ST_Union(geom) AS geom FROM tmp) AS foo;
Jetzt noch ein Beispiel, vielleicht versteht man es so besser.
Die Tabelle:
Durch diese Abfrage wird die Geometrie nach dem kabel gruppiert.Code:CREATE TABLE tmp1 ( geom geometry, id integer NOT NULL, kabel integer, nr integer ); INSERT INTO tmp1 (geom, id, kabel, nr) VALUES ('01020000000400000000000000000000000000000000000000000000000000F03F00000000000000000000000000000040000000000000000000000000000014400000000000000000', 1, 1, 1); INSERT INTO tmp1 (geom, id, kabel, nr) VALUES ('0102000000040000000000000000000040000000000000000000000000000014400000000000000000000000000000184000000000000000000000000000001C400000000000000000', 2, 1, 2); INSERT INTO tmp1 (geom, id, kabel, nr) VALUES ('010200000004000000000000000000F03F0000000000000000000000000000004000000000000000000000000000001440000000000000000000000000000018400000000000000000', 3, 1, 3); INSERT INTO tmp1 (geom, id, kabel, nr) VALUES ('01020000000400000000000000000000000000000000000000000000000000F03F00000000000000000000000000000040000000000000000000000000000024400000000000000000', 4, 1, 4); INSERT INTO tmp1 (geom, id, kabel, nr) VALUES ('01020000000400000000000000000000000000000000000000000000000000F03F00000000000000000000000000000040000000000000000000000000000014400000000000000000', 5, 2, 3); INSERT INTO tmp1 (geom, id, kabel, nr) VALUES ('0102000000040000000000000000000040000000000000000000000000000014400000000000000000000000000000184000000000000000000000000000001C400000000000000000', 6, 2, 1); INSERT INTO tmp1 (geom, id, kabel, nr) VALUES ('010200000006000000000000000000F03F000000000000000000000000000000400000000000000000000000000000144000000000000000000000000000001C4000000000000000000000000000002040000000000000000000000000000024400000000000000000', 7, 2, 2);
Code:SELECT AsText(st_linemerge(geom)) FROM (SELECT ST_UNION((geom)) AS geom FROM tmp1 GROUP BY tmp1.kabel) AS geom;Die Reihenfolge (kabel_nr) muss aber noch noch berücksichtig werden. Doch wo baut man ein ORDER BY ein?Code:LINESTRING(0 0,1 0,2 0,5 0,6 0,7 0,10 0) LINESTRING(0 0,1 0,2 0,5 0,6 0,7 0,8 0,10 0)
Karl
Sorry, ich bin leider noch nicht dazu gekommen, mir das mal anzuschauen. Vielleicht klapptst ja heut noch mal.
Gruß Uwe
Have a lot of fun!
Hab jetzt nochmal im Internet nach Lösungen gesucht. Leider nichts gefunden.
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen