bzgl. PostGIS bzw. der Datenbankstruktur habe ich eine ganz grundlegende Frage. Angenommen ich möchte ein Polygon (4 Eckpunkte) speichern, und die dazugehörigen Punkte auch. Nun habe ich mir gedacht, in einer Tabelle speichere ich die Punkte (Geometry-Spalte vom typ Point) udn dort kann ich dann die Punkte wie folgt einfugen (auszugsweise)
Nun möchte ich in einer zweiten Tabelle das aus diesen Punkten bestehende Polygon speichern, hab da aber in allen möglichen Quellen im Internet nur gefunden, dass ich die Koordinaten im Polygon expliziet speichern muss, was wie folgt geht:
GeometryFromText ( ‘POLYGON ( ( 10 10, 10 20, 20 20, 20 10, 10 10 ) )’, -1 ) );
Nun steh ich jedoch vor dem Problem, wenn sich Punkt1 ändert, muss ich alle Polygone, die diesen Punkt enthalten Updaten.
Die Frage die sich mir stellt, kann man nicht einfach ein Polygon mit Referenzen auf Punkte erstellen? Wie macht ihr das?
Das ist in der Tat ein Problem. Du kannst Geometrien als einzelen Obkjekte abspeichern, dann wissen sie nichts von ihren Beziehungen untereinander. Wenn du das brauchst, musst du die Daten topologisch aufbereiten, d.h. du verwaltest sie in Topologietabellen, die Knoten und Verbindungen speichern.
Etwa so in deinem Fall:
Punkte-Tabelle:
id name x y
1 p1 0 0
2 p2 1 0
3 p3 1 1
4 p4 0 1
Hier sind die Punkte mit ihren Koordinaten abgelegt.
Polygon-Tabelle
id name Punkte
1 poly1 (1,2,3,4,1)
In dieser Tabelle befinden sich nur Polygon-elemente, die Verweise auf Punkte haben. Dabei ist die Reihenfolge wichtig, ggf muß auch der 1. Punkt am Ende wieder auftauchen, um einen geschlossenen Ring erzeugen zu können.
Eine konkrete Geometrie kann man dann mit einem View erzeugen. Die Verwaltung von Topologien ist allerdings recht aufwendig. PostGIS stellt dafür einige Funktionen zur Verfügung, du findest sie im Source-Tree unter ‘topology’. Zur Zeit befindet auch eine Highperformance-Topologie für PostGIS in der Entwicklung, wenn das fertig ist, kann man auch komplette Geländemodelle in der DB verwursten . Da freu ich mich schon drauf, keine Files mehr im GIS…
Gisman: Hier sind die Punkte mit ihren Koordinaten abgelegt.
Polygon-Tabelle
id name Punkte
1 poly1 (1,2,3,4,1)
In dieser Tabelle befinden sich nur Polygon-elemente, die Verweise auf Punkte haben. Dabei ist die Reihenfolge wichtig, ggf muß auch der 1. Punkt am Ende wieder auftauchen, um einen geschlossenen Ring erzeugen zu können. Wie kann so ein SQL Befehl aus sehen der so etwas erzeugt? Ein Postgis.Polygon oder **Postgis.***Linestring mit Postgis.point aus einer anderen Tabelle.??
*
update Tabelle set spaltegeom = geometry(‘SRID=31467;LINESTRING(?)’)
Du machts aus Punkten eine Linie oder Polygon mit dem Befehl LinefromMultipoint oder MakePolygon. Eine Aggregation und Sortierung kannst du mit Collect vornehmen. Mehr dazu steht in der PostGIS-Referenz unter Geometry-Constructors. Mit diesem einfachen Beispiel erzeuge ich z.B. aus einzelnen Punkten einen Profilschnitt.
CREATE OR REPLACE VIEW line AS
SELECT p1.prf_id, p1.station, linefrommultipoint(collect(p1.geom)) AS geom
FROM punkte p1
GROUP BY p1.prf_id, p1.station
order by p1.station;
Falls du mit einer ‘echten’ Topologie arbeiten willst, solltest du die Doku im entsprechenden Contrib-Modul zu Rate ziehen. Da kann ich dir aus dem hohlen Bauch grad auch net helfen.
Also ok aus einem Punkt was zu machen ist eine Idee ich möchte aber aus mehren Punkten was machen. Ich habe mir dazu ein Java Prog gebastelt. Doch es muss ja einfacher gehen mit SQL Anweisungen.
Ich habe auch was gefunden aber ich weis noch nicht so genau wie ich das super in SQL einsetzen kann da ich von SQL nicht ganz soviel Ahnung habe. vor allen wen es so komplex wird. (Bin gerade in der Lernphase)
Gefunden:
6.2.6. Geometry Editors:
ST_AddPoint(linestring, point, [])
“Adds a point to a LineString before point (0-based index). Third parameter can be omitted or set to -1 for appending”
Meine Idee wäre dann diesen Befehl zu verwenden und ihn in eine While schleife zu packen. Doch es muss doch einfacher gehen. Problem die Punkte die ich schon hatte! hmmmmm
Ehrlich gesagt versteh ich grad nicht was du überhaupt machen willst Entweder du willst was mit java machen, dann könnte dir das OpenJump Projekt helfen, wenn du kein SQL nutzen willst. Andererseits postest du immer SQL-Statements… Das AddPoint fügt halt in die bestehende Linie einen Punkt ein. Das Statement, das ich gepostet habe macht übrigens was mit vielen Punkten, nämlich eine geordnete Linie und kommt dem was du beschrieben hast eigentlich schon recht nahe. Must es halt an deine Bedürfnisse anpassen. Es liefert dir so einen View mit den Linien und wenn du einen Punkt in der Tabelle änderst, ändert sich auch die Linie. Ansonsten kann dir da mit Sicherheit das Topologiemodul helfen, wenn du das Problem, das du im ersten Post beschrieben hast lösen willst. Es ist halt nicht unbedingt einfach zu händeln, dein Problem CU Uwe
hab es mit andere Hilfe und deinem Code Teil geschafft das Problem mit SQL zu lösen. DANKE!!!
update track t set track=(select linefrommultipoint(collect(g.geom))
as geom from gps_messwerte g where t.id=g.messung_id
group by messung_id ) ;
Wichtig dabei ist das group by wie es sich raus stellte.
Eine weitere Frage die sich gleich danach stellte ist das es bei einigen tracks wunder bar funktionierte und bei anderen nicht.
Gibt es vielleicht eine Beschränkung bei collect oder line??
Ein Beschränkung sollte es eigentlich nicht geben. Allerdings kann ich im Moment nicht sagen, wie das denn auf evtl. fehlerhafte Daten oder NULL reagiert. Da hilft nur die fehlerhaften Stellen zu untersuchen. Was für einen Darstellungsfehler bringt es denn? Ist der an den gleichen Stellen wie die anderen Fehler?
da ich ich bei den anderen Tracks jetzt auch werte bekommen habe wenn ich nach einzelnen groessen frage gehe ich hier von einer Beschränkung von pgadmin aus.
Ah, PgAdmin. Ja, das hat manchmal seltsame Ansichten über PostGIS-Inhalte. Das ist mir auch schon öfters aufgefallen.
Du kannst mal schauen ob mit psql alles stimmt, PgAdmin hat wohl einige Darstellungsfehler.