Kurz:
Kabel werden durch Trassensegmente dargestellt.
Ein Kabel hat außerdem einen Startknoten und einen Endknoten.
Als Ergebnis erscheinen 145 Verbindungen, ich habe aber nur 23 Kabel.
Hier die Abfrage und das ER-Modell dazu. Falls jemand die Zeit zum anschauen hat, vielen Dank.
Karl
er.jpg
Über die Tabelle "N" wird der Startknoten und Endknoten über die sum-Selects gebildet.Code:SELECT "N".netzverbindung_id, "K".id_kabel, st_astext(ST_LineMerge(ST_Collect(public.trassensegment.the_geom))) AS the_geom, public.netzknoten.id_netzknoten, sum(case when "N".start = 1 then "N".netzknoten_id else 0 end) AS startknoten, sum(case when "N".start = 0 then "N".netzknoten_id else 0 end) AS endknoten FROM public.kabel "K" LEFT OUTER JOIN public.trassensegment_kabel ON (public.trassensegment_kabel.kabel_id = "K".id_kabel) INNER JOIN public.trassensegment ON (public.trassensegment.id_segment = public.trassensegment_kabel.segment_id) LEFT OUTER JOIN public.netzverbindung ON ("K".netzverbindung_id = public.netzverbindung.id_netzverbindungen) INNER JOIN public.netzverbindung_netzknoten ON (public.netzverbindung.id_netzverbindungen = public.netzverbindung_netzknoten.netzverbindung_id) INNER JOIN public.netzknoten ON (public.netzverbindung_netzknoten.netzknoten_id = public.netzknoten.id_netzknoten) INNER JOIN netzverbindung_netzknoten "N" ON (public.netzverbindung.id_netzverbindungen = "N".netzverbindung_id) WHERE public.netzverbindung_netzknoten.start = 1 GROUP BY "N".netzverbindung_id, "K".id_kabel, the_geom, public.netzknoten.id_netzknoten
Hier noch einen Teil der Erg-Tabelle, wenn's weiterhilft.
erg.jpg
Wie gesagt, ich habe eigentlich nur 23 Netzverbindungen.
Geändert von karl_ha (19.02.2010 um 09:46 Uhr)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
stimmt. Hier ein SQL-File mit dem Tabellendump (als zip-file)
Postgis-Teil: Es werden die Trassensegmente zu einer langen Line verbunden.
Eigentlich möchte ich nur zwei Abfragen verbinden:
Abfrage der Kabel:
Abfrage der Start- und Endknoten:Code:SELECT public.kabel.id_kabel, st_astext(ST_LineMerge(ST_Collect(public.trassensegment.the_geom))) AS the_geom FROM public.kabel LEFT OUTER JOIN public.trassensegment_kabel ON (public.trassensegment_kabel.kabel_id = public.kabel.id_kabel) INNER JOIN public.trassensegment ON (public.trassensegment.id_segment = public.trassensegment_kabel.segment_id) GROUP BY public.kabel.id_kabel
Code:SELECT "N".netzverbindung_id, sum(case when "N".start = 1 then "N".netzknoten_id else 0 end) AS startknoten, sum(case when "N".start = 0 then "N".netzknoten_id else 0 end) AS endknoten FROM netzverbindung_netzknoten "N" GROUP BY "N".netzverbindung_id
Geändert von karl_ha (19.02.2010 um 10:13 Uhr)
Moin!
PostGIS hab ich erst gar nicht gesehen. Du gruppierst hier über die Geometrien, und die sind bei den Doppelten alle unterschiedlich, insofern leifert es auch jeweils einen Treffer. Eventuell wäre eine Lösung erst die Gruppierung der Sachdaten vorzunehmen und auf dieser Basis eine Geometrie zu erzeugen. Oder du stellst sicher, das halt immer die gleiche Geometrie erzeugt wird, z.B. durch Sortierung der Einzelgeometrien o.ä.
Gruß Uwe
Have a lot of fun!
Ich möcht ja nicht nerven...
Ich habe das ER ausgedünnt.
er.jpg
Das Erg. ist jedoch das gleiche, 145 EinträgeCode:SELECT st_astext("ST_LineMerge"("ST_Collect"(public.trassensegment.the_geom))) AS the_geom, sum(case when public.netzverbindung_netzknoten.start = 1 then public.netzverbindung_netzknoten.netzknoten_id else 0 end) AS startknoten, sum(case when public.netzverbindung_netzknoten.start = 0 then public.netzverbindung_netzknoten.netzknoten_id else 0 end) AS endknoten, public.netzverbindung_netzknoten.netzverbindung_id, public.kabel.id_kabel FROM public.kabel LEFT OUTER JOIN public.trassensegment_kabel ON (public.trassensegment_kabel.kabel_id = public.kabel.id_kabel) INNER JOIN public.trassensegment ON (public.trassensegment.id_segment = public.trassensegment_kabel.segment_id) LEFT OUTER JOIN public.netzverbindung_netzknoten ON (public.kabel.netzverbindung_id = public.netzverbindung_netzknoten.netzverbindung_id) GROUP BY the_geom, public.netzverbindung_netzknoten.netzverbindung_id, public.kabel.id_kabel
erg.jpg
Geändert von karl_ha (19.02.2010 um 11:13 Uhr)
Solange du über die Geometrien gruppierst und da für jede was anderes steht wird sich das auch nicht ändern. Du siehst die Unterschiede in deiner Ergebnistabelle.
Gruß Uwe
Have a lot of fun!
Aha, ok.
Ein Kabel besteht z.B. aus zwei Trassensegmenten:
Wenn ich es mitCode:id_kabel st_astext 1 LINESTRING(3586853.7135 5416708.7432,3587247.7808 5416407.5717) 1 LINESTRING(3586739.638 5416516.5396,3586853.7135 5416708.7432)
mergeCode:st_astext(ST_LineMerge(ST_Collect(public.trassensegment.the_geom))) AS the_geom
habe ich aus den zwei Segmenten eine Linie erstellt:
Als Erg. habe ich die 23 Kabel die es gibt.Code:id_kabel the_geom 1 LINESTRING(3586739.638 5416516.5396,3586853.7135 5416708.7432,3587247.7808 5416407.5717)
Ich muss die Segmente doch zusammenmergen?
Habe jetzt aus den zwei oberen Abfragen je eine View gemacht. Bei einer Abfrage darauf und einem Join über die netzverbindung_id stimmt es. (23 Kabel)
Das dies aber nicht in über gemeinsammen Abfrage geht soll kann ja nicht sein...
Das mag schon richtig sein, aber wenn du dir die Text-Geometrien anschaust( z.B. die Startkoordinaten vom Kabel 2), sind die unterschiedlich, d.h. beim Gruppieren darüber ergibt jede Kombination einen Treffer. Woher das kommt, musst du in deinen Ausgangsgeometrien herausfinden. Abhilfe wäre vielleicht, wie oben schon gesagt, Sortieren der zusammenzufügenden Geometrien nach z.B. Startknotennummer, weil du afaik keine Gewährleistung hast, in welcher Reihenfolge die DB die Einzelgeometrien für das Collect liefert. Oder du machst das Geometriehandling z.B. als Subselect.
Gruß Uwe
Have a lot of fun!
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen