MULTIPOLYGON

Probleme, Fragen die mit der Installation und Anwendung der PostGIS-Erweiterung zu tun haben.
tomalkis
Neuer Benutzer
Beiträge: 25
Registriert: Fr 14. Sep 2018, 11:01
Wohnort: Olching

MULTIPOLYGON

Beitrag von tomalkis » Di 30. Okt 2018, 11:36

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.

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

Re: MULTIPOLYGON

Beitrag von Gisman » Di 30. Okt 2018, 19:51

ST_GeomFromText('MULTIPOLYGON((i.feed_spaces_geometry_value))', 4326)
Du übergibst den Namen des Feldes als String, nicht den Inhalt.
Gruß Uwe

tomalkis
Neuer Benutzer
Beiträge: 25
Registriert: Fr 14. Sep 2018, 11:01
Wohnort: Olching

Re: MULTIPOLYGON

Beitrag von tomalkis » Di 6. Nov 2018, 08:39

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.

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

Re: MULTIPOLYGON

Beitrag von akretschmer » Di 6. Nov 2018, 09:04

Ein String ist in 'Anführumngsstriche' eingeschlossen, ein Feldname nicht oder in "doppelten". Laß also die ' einfach mal weg ...
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

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

Re: MULTIPOLYGON

Beitrag von Gisman » 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.

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

Re: MULTIPOLYGON

Beitrag von akretschmer » Di 6. Nov 2018, 09:23

ahhh, Danke @Gisman. Bin halt nicht so geübt im Umgang mit den GIS-Funktionen, nahm das, das sei 'nur' ein Funktionsaufruf...
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

tomalkis
Neuer Benutzer
Beiträge: 25
Registriert: Fr 14. Sep 2018, 11:01
Wohnort: Olching

Re: MULTIPOLYGON

Beitrag von tomalkis » Di 6. Nov 2018, 14:07

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?

tomalkis
Neuer Benutzer
Beiträge: 25
Registriert: Fr 14. Sep 2018, 11:01
Wohnort: Olching

Re: MULTIPOLYGON

Beitrag von tomalkis » Di 6. Nov 2018, 14:53

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

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

Re: MULTIPOLYGON

Beitrag von Gisman » 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.

tomalkis
Neuer Benutzer
Beiträge: 25
Registriert: Fr 14. Sep 2018, 11:01
Wohnort: Olching

Re: MULTIPOLYGON

Beitrag von tomalkis » Di 6. Nov 2018, 15:44

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.

Antworten