Seite 1 von 2

MULTIPOLYGON

Verfasst: Di 30. Okt 2018, 11:36
von tomalkis
Hallo,

ich habe eine Tabelle erstellt, mit
create table park_mpoly(
poi_id SERIAL PRIMARY KEY,
poi_name TEXT,
coordinates GEOMETRY (MULTIPOLYGON, 4326))

Jetzt möchte ich die Tabelle mit Daten aus einer anderen Tabelle folgendermaßen füllen:

insert into park_mpoly(poi_id, poi_name, coordinates)
SELECT i.feed_spaces_id, i.feed_spaces_title, ST_GeomFromText('MULTIPOLYGON((i.feed_spaces_geometry_value))', 4326)
FROM park_static i
WHERE i.feed_spaces_id is not null
and i.feed_spaces_geometry_value is not null
and i.feed_spaces_title is not null
GROUP BY i.feed_spaces_id, i.feed_spaces_title, i.feed_spaces_geometry_value;

Ich habe aber ein Problem mit i.feed_spaces_geometry_value. Ein Beispiel der Daten aus der i.feed_spaces_geometry_value Spalte:

"48.13716763477679,11.559044122695923 48.136865128775696,11.559038758277893 48.13686333879406,11.559277474880219 48.13716763477679,11.559277474880219 48.13716763477679,11.559044122695923"

Fehler, die ich bekomme:
ERROR: FEHLER: parse error - invalid geometry
HINT: "MULTIPOLYGON((i." <-- parse error at position 16 within geometry
SQL state: XX000

Soweit ich weiß, müssen die multipolygon-Koordinaten so rein: x y, x1 y1, x2 y3 usw. Und
wie man im Beispiel sieht, habe ich diese in dem Format: x,y x1,y1 x2,y2 usw.
Wie löse ich das Problem richtig? Liegt es nur daran? Oder habe ich noch irgendwas falsch gemacht?

Danke.
Grüße
Tamara.

Re: MULTIPOLYGON

Verfasst: Di 30. Okt 2018, 19:51
von Gisman
ST_GeomFromText('MULTIPOLYGON((i.feed_spaces_geometry_value))', 4326)
Du übergibst den Namen des Feldes als String, nicht den Inhalt.
Gruß Uwe

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 08:39
von tomalkis
Das habe ich vermurtet. Ich weiß aber leider nicht, wie ich das anders machen könnte. Ich bin die Anfängerin und weiß ehrlich gesagt nicht viel davon.
Grüße
Tamara.

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 09:04
von akretschmer
Ein String ist in 'Anführumngsstriche' eingeschlossen, ein Feldname nicht oder in "doppelten". Laß also die ' einfach mal weg ...

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 09:21
von Gisman
ST_GeomFromText('MULTIPOLYGON(('||i.feed_spaces_geometry_value||'))', 4326)
So sollte das in etwa aussehen. Wenn ich Polygone 'von Hand bauen' muss gehe ich immer ganz an der Basis und baue mir Punkte, daraus Linienzüge und daraus wieder Polygone. ( st_makepoint, st_makeline, etc.). Das hat z.B. den Vorteil, wenn man Fehler suchen muss oder Änderungen vornehmen muss geht das einfacher. st_makeline ist auch eine Aggregatfunktion, was ich auch gerne nutze.

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 09:23
von akretschmer
ahhh, Danke @Gisman. Bin halt nicht so geübt im Umgang mit den GIS-Funktionen, nahm das, das sei 'nur' ein Funktionsaufruf...

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 14:07
von tomalkis
Gisman hat geschrieben:
Di 6. Nov 2018, 09:21
ST_GeomFromText('MULTIPOLYGON(('||i.feed_spaces_geometry_value||'))', 4326)
So sollte das in etwa aussehen. Wenn ich Polygone 'von Hand bauen' muss gehe ich immer ganz an der Basis und baue mir Punkte, daraus Linienzüge und daraus wieder Polygone. ( st_makepoint, st_makeline, etc.). Das hat z.B. den Vorteil, wenn man Fehler suchen muss oder Änderungen vornehmen muss geht das einfacher. st_makeline ist auch eine Aggregatfunktion, was ich auch gerne nutze.
danke für deine Antwort. Ich habe damit versucht:
ST_GeomFromText('MULTIPOLYGON(('||replace(replace(replace(i.feed_spaces_geometry_value,' ',';'),',',' '), ';', ',')||'))', 4326)

kriege wieder einen parse error. was mache ich wieder falsch? Darf ich die replace Funktion da nicht benutzen?

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 14:53
von tomalkis
danke euch, hat sich mit
ST_GeomFromText('MULTIPOLYGON((('||replace(replace(replace(i.feed_spaces_geometry_value,' ',';'),',',' '), ';', ',')||')))', 4326)
erledigt!

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 14:58
von Gisman
Ich würde an deiner Stelle mit dem textparsen aufhören, wie schon erwähnt ist das eher ungut beim Fehlersuchen. In der PostGIS-Doku findest du eine Beschreibung wie das WKT für Polygone aussehen soll.

Ich hab dir mal was zusammengebaut, wie ich es tun würde bei dem gegebenen Koordinatenstring:

Code: Alles auswählen

select st_makepolygon(
         st_makeline(
           st_setsrid(
             st_makepoint(tb.xcoord, tb.ycoord), 4326))) as geom
  from (select split_part(t.a, ',', 1)::numeric as ycoord, split_part(t.a, ',', 2)::numeric as xcoord
          from unnest(string_to_array('48.13716763477679,11.559044122695923 48.136865128775696,11.559038758277893 48.13686333879406,11.559277474880219 48.13716763477679,11.559277474880219 48.13716763477679,11.559044122695923', ' ')) t(a)
          ) tb
Zur Erklärung: Das unnest macht aus dem mit string_to_array erzeugten Array eine Tabelle aus einzelnen Koordinatenstrings. Diese werden dann im Subselect zu x und y Koordinaten gemacht und mit den st_funktionen zu Geometrien verarbeitet.

Re: MULTIPOLYGON

Verfasst: Di 6. Nov 2018, 15:44
von tomalkis
Gisman hat geschrieben:
Di 6. Nov 2018, 14:58
Ich würde an deiner Stelle mit dem textparsen aufhören, wie schon erwähnt ist das eher ungut beim Fehlersuchen. In der PostGIS-Doku findest du eine Beschreibung wie das WKT für Polygone aussehen soll.

Ich hab dir mal was zusammengebaut, wie ich es tun würde bei dem gegebenen Koordinatenstring:

Code: Alles auswählen

select st_makepolygon(
         st_makeline(
           st_setsrid(
             st_makepoint(tb.xcoord, tb.ycoord), 4326))) as geom
  from (select split_part(t.a, ',', 1)::numeric as ycoord, split_part(t.a, ',', 2)::numeric as xcoord
          from unnest(string_to_array('48.13716763477679,11.559044122695923 48.136865128775696,11.559038758277893 48.13686333879406,11.559277474880219 48.13716763477679,11.559277474880219 48.13716763477679,11.559044122695923', ' ')) t(a)
          ) tb
Zur Erklärung: Das unnest macht aus dem mit string_to_array erzeugten Array eine Tabelle aus einzelnen Koordinatenstrings. Diese werden dann im Subselect zu x und y Koordinaten gemacht und mit den st_funktionen zu Geometrien verarbeitet.
super, vielen Dank! Sieht kompliziert aus, aber ich versuch es zu realisieren.
Ich habe schon die ersten Fehler, die ich vielleicht damit vermeiden könnte. Und zwar: ich habe versucht die Polygone im QGIS visualisieren zu lassen. Diese sind aber an der falschen Stelle auf der Karte. Und es liegt wohl daran, dass die Koordinaten (lat und long) im JSON nicht in der für QGIS richtigen Reihenfolge sind.