MULTIPOLYGON

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.

ST_GeomFromText(‘MULTIPOLYGON((i.feed_spaces_geometry_value))’, 4326)

Du übergibst den Namen des Feldes als String, nicht den Inhalt.
Gruß Uwe

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.

Ein String ist in ‘Anführumngsstriche’ eingeschlossen, ein Feldname nicht oder in “doppelten”. Laß also die ’ einfach mal weg …

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.

ahhh, Danke @Gisman. Bin halt nicht so geübt im Umgang mit den GIS-Funktionen, nahm das, das sei ‘nur’ ein Funktionsaufruf…

danke euch, hat sich mit
ST_GeomFromText(‘MULTIPOLYGON(((’||replace(replace(replace(i.feed_spaces_geometry_value,’ ‘,’;’),’,’,’ ‘), ‘;’, ‘,’)||’)))’, 4326)
erledigt!

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:

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.

Es ist kein Funktionsaufruf!

t(a)

ist der Tabellen Alias für

unnest(string_to_array())

und bedeute das Funktionsergebnis soll als Tabelle t mit Spalte a verstanden werden.

Über

t.a

wird dann auf die Tabelle.Spalte zugegriffen.

Siehe https://www.postgresql.org/docs/11/sql-select.html