+ Antworten
Ergebnis 1 bis 10 von 10

Thema: Mergen in einer bestimmten Reihenfolge

  1. #1
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard Mergen in einer bestimmten Reihenfolge

    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.

    Code:
    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
    
    erg1.jpg

    Wie kann ich die Segmente in der festgelegten Reihenfolge mergen?

    Gruß Karl

  2. #2
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    628

    Standard

    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!

  3. #3
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard

    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
    
    Aussgabe: 145 Datensätze, also alle Segmente.
    Oder schon im Collect sortieren? Subselect?

  4. #4
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    628

    Standard

    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!

  5. #5
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard

    Der Feierabend und das Wochenende sollten auch anderweitig genutzt werden...

  6. #6
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard

    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?

  7. #7
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard

    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;
    

  8. #8
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard

    Jetzt noch ein Beispiel, vielleicht versteht man es so besser.

    Die Tabelle:
    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);
    
    Durch diese Abfrage wird die Geometrie nach dem kabel gruppiert.

    Code:
    SELECT AsText(st_linemerge(geom)) FROM (SELECT ST_UNION((geom)) AS geom FROM tmp1 GROUP BY tmp1.kabel) AS geom;
    
    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)
    
    Die Reihenfolge (kabel_nr) muss aber noch noch berücksichtig werden. Doch wo baut man ein ORDER BY ein?

    Karl

  9. #9
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    628

    Standard

    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!

  10. #10
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    203

    Standard

    Hab jetzt nochmal im Internet nach Lösungen gesucht. Leider nichts gefunden.

+ Antworten

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum