Kreiskoordinaten manipulieren

Probleme, Fragen die mit der Installation und Anwendung der PostGIS-Erweiterung zu tun haben.
pgSteffen
Benutzer
Beiträge: 78
Registriert: Di 14. Dez 2010, 09:46

Kreiskoordinaten manipulieren

Beitrag von pgSteffen » Fr 5. Aug 2016, 13:49

Hallo Wissende,
ich habe in einer "Fremdanwendung" eine Kreisgeometrie mit 5 Punkten:
P1,P2,P3,PM,P4 (PM... Kreismittelpunkt)
Diese entspricht allerdings nicht der PostGIS-Definition. Ich müsste jetzt eigentlich nur PM entfernen und P1 anhängen.
Die sollte prinzipiell über die Manipulation von WKT kein Problem sein. Allerdings möchte ich vermeiden eine dafür eine eigene Funktion in der Fremddatenbank zu definieren.

Seht ihr eine Chance mit eingebauten PostGIS-Funktionen und SQL die entsprechende Manipulation vorzunehmen.

Gruß Steffen

akretschmer
Erfahrener Benutzer
Beiträge: 7485
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Kreiskoordinaten manipulieren

Beitrag von akretschmer » Fr 5. Aug 2016, 16:48

zeig doch mal bitte die Tabellendefinition, paar Demodaten dazu, und was rauskommen soll.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Gisman
Erfahrener Benutzer
Beiträge: 1101
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: Kreiskoordinaten manipulieren

Beitrag von Gisman » Sa 6. Aug 2016, 07:29

pgSteffen hat geschrieben:
Seht ihr eine Chance mit eingebauten PostGIS-Funktionen und SQL die entsprechende Manipulation vorzunehmen.

Gruß Steffen
Ja, allerdings wäre eine genauere Beschreibung dessen, was du vorliegen hast und was du tun willst hilfreich.

Gruß Uwe

pgSteffen
Benutzer
Beiträge: 78
Registriert: Di 14. Dez 2010, 09:46

Re: Kreiskoordinaten manipulieren

Beitrag von pgSteffen » Sa 6. Aug 2016, 16:40

Hallo,
danke für die Antworten.
Man kann ja bekanntermaßen einen Kreis aus 3 Punkten generieren (warum PostGIS 4 Punkte braucht erschließt sich mir allerdings nicht).
Der (vollständige) Kreis ist in PostGIS korrekt so definiert

Code: Alles auswählen

CIRCULARSTRING Z( P1   , P2   , P3   , P4   , P1   )
CIRCULARSTRING Z(0 -1 0,-1 0 0, 0 1 0, 1 0 0,0 -1 0)
In der Fremddatenbank sieht das Ganze aber wie oben schon beschrieben aus:

Code: Alles auswählen

CIRCULARSTRING Z( P1   , P2   , P3   , PM   , P4   )
CIRCULARSTRING Z(0 -1 0,-1 0 0, 0 1 0, 0 0 0, 1 0 0)
Daraus wird dann z.B. in QGIS natürlich kein "richtiger" Kreis.

Ich muss also aus dem Punktarray den 4. Punkt löschen und den ersten anfügen. Für so eine Aktion habe ich keine entsprechende PostGIS Funktion gefunden.
Es gibt eigentlich (fast) gar keine Kreismanipulationsfunktionen. Es würde mich aber nicht stören, wenn der Kreis nach der Manipulation als "LINESTRING" dargestellt wird.

.... und wie gesagt, ich will die Orginaldaten nicht umschreiben, sondern per (Live) SQL-Abfrage in QGIS einbinden

Gruß Steffen
Zuletzt geändert von pgSteffen am Sa 6. Aug 2016, 17:06, insgesamt 1-mal geändert.

akretschmer
Erfahrener Benutzer
Beiträge: 7485
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Kreiskoordinaten manipulieren

Beitrag von akretschmer » Sa 6. Aug 2016, 17:05

was sicher gehen sollte ist, wenn Du via st_astext(() und st_geomfromtext() und dazwischen mit Stringfunktionen hantierst.

Code: Alles auswählen

gis=*# select st_geomfromtext('srid=0;circularstring(0 2, 2 0, 0 -2,-2 -2,0 2)');
                                                                                  st_geomfromtext                                                                                   
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 0108000000050000000000000000000000000000000000004000000000000000400000000000000000000000000000000000000000000000C000000000000000C000000000000000C000000000000000000000000000000040
(1 Zeile)

gis=*# select st_astext(st_geomfromtext('srid=0;circularstring(0 2, 2 0, 0 -2,-2 -2,0 2)'));
               st_astext                
----------------------------------------
 CIRCULARSTRING(0 2,2 0,0 -2,-2 -2,0 2)
(1 Zeile)
Notfalls dazu eine kleine Funktion schreiben und dann vielleicht einen (materialized) View bauen. Mal so als Idee.
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

pgSteffen
Benutzer
Beiträge: 78
Registriert: Di 14. Dez 2010, 09:46

Re: Kreiskoordinaten manipulieren

Beitrag von pgSteffen » Sa 6. Aug 2016, 17:12

Hallo,
Steffen hat geschrieben:Dies sollte prinzipiell über die Manipulation von WKT kein Problem sein.
ja über WKT und String wäre meine letzte Möglichkeit (habe schon damit gegonnen).
Wird aber ziemlich komplex, da ich die Originaldatenbank nicht manipulieren möchte, dh. weder eine Funktion noch eine View speichern will.

Gruß Steffen

Gisman
Erfahrener Benutzer
Beiträge: 1101
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: Kreiskoordinaten manipulieren

Beitrag von Gisman » Mo 8. Aug 2016, 08:49

Du solltest per st_dumppoints die einzelnen Punkte der Geometrie als Array bekommen und kannst dann darauf eine Umsortierung machen. Ich hab allerdings mit Circularstrings und so noch nicht wirklich viel gemacht, kann also nicht sagen was dabei rauskomt. Das Handbuch bietet aber einige Beispiele zu der Funktion. Wie das in QGIS funktioniert kann ich dir im Moment noch nicht sagen.

Gruß Uwe

Gisman
Erfahrener Benutzer
Beiträge: 1101
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: Kreiskoordinaten manipulieren

Beitrag von Gisman » Mo 8. Aug 2016, 08:59

Du kannst das SQL im DB-Manager von QGIS ausführen und das Ergebnis als Layer darstellen. Damit solltest du auf Änderungen an der Datenbank verzicheten können. Du findest ihn im Menü unter Datenbank/DB-Verwaltung. Je nach Alter der QGIS-Version mußt du ihn als PlugIn nachinstallieren. Es gibt wohl auch noch andere PlugIns die das machen können.

Gruß Uwe

pgSteffen
Benutzer
Beiträge: 78
Registriert: Di 14. Dez 2010, 09:46

Re: Kreiskoordinaten manipulieren

Beitrag von pgSteffen » Mo 8. Aug 2016, 09:07

Hallo Uwe,
danke für die Antworten. QGIS ist mir alles klar :-). Muss halt nur ein SQL "basteln".
Ich mach es jetzt erst mal über WKT und schau mir danach mal st_dumppoints an.

Gruß Steffen

Gisman
Erfahrener Benutzer
Beiträge: 1101
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Re: Kreiskoordinaten manipulieren

Beitrag von Gisman » Mo 8. Aug 2016, 10:05

Hallo nochmal:

Nur so als kurzes Beispiel. Es entsorgt den 4. Punkt des Linestrings und fügt den Anfangspunkt ans Ende an.

Code: Alles auswählen

select st_addpoint(st_removepoint(t1.geom, 3), st_startpoint(t1.geom)) 
  from (select st_geomfromtext('linestring(0 0, 4 0, 4 4, 0 4, 0 0)') as geom) t1 
Die Überführung des Circularstrings in einen Linstring und zurück überlasse ich den geneigten Leser zur Übung ;)

Viele Grüße Uwe

Antworten