MULTIPOLYGON
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.
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.
-
- Erfahrener Benutzer
- Beiträge: 1140
- Registriert: Fr 20. Jan 2006, 15:30
- Wohnort: Pfalz
- Kontaktdaten:
Re: MULTIPOLYGON
Du übergibst den Namen des Feldes als String, nicht den Inhalt.ST_GeomFromText('MULTIPOLYGON((i.feed_spaces_geometry_value))', 4326)
Gruß Uwe
Re: MULTIPOLYGON
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.
Grüße
Tamara.
-
- Erfahrener Benutzer
- Beiträge: 7677
- Registriert: So 29. Okt 2006, 13:35
- Wohnort: Kaufbach, Sachsen, Germany, Germany
- Kontaktdaten:
Re: MULTIPOLYGON
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
-
- Erfahrener Benutzer
- Beiträge: 1140
- Registriert: Fr 20. Jan 2006, 15:30
- Wohnort: Pfalz
- Kontaktdaten:
Re: MULTIPOLYGON
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.ST_GeomFromText('MULTIPOLYGON(('||i.feed_spaces_geometry_value||'))', 4326)
-
- Erfahrener Benutzer
- Beiträge: 7677
- Registriert: So 29. Okt 2006, 13:35
- Wohnort: Kaufbach, Sachsen, Germany, Germany
- Kontaktdaten:
Re: MULTIPOLYGON
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
Re: MULTIPOLYGON
danke für deine Antwort. Ich habe damit versucht:Gisman hat geschrieben: ↑Di 6. Nov 2018, 09:21So 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.ST_GeomFromText('MULTIPOLYGON(('||i.feed_spaces_geometry_value||'))', 4326)
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
danke euch, hat sich mit
ST_GeomFromText('MULTIPOLYGON((('||replace(replace(replace(i.feed_spaces_geometry_value,' ',';'),',',' '), ';', ',')||')))', 4326)
erledigt!
ST_GeomFromText('MULTIPOLYGON((('||replace(replace(replace(i.feed_spaces_geometry_value,' ',';'),',',' '), ';', ',')||')))', 4326)
erledigt!
-
- Erfahrener Benutzer
- Beiträge: 1140
- Registriert: Fr 20. Jan 2006, 15:30
- Wohnort: Pfalz
- Kontaktdaten:
Re: MULTIPOLYGON
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:
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.
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
Re: MULTIPOLYGON
super, vielen Dank! Sieht kompliziert aus, aber ich versuch es zu realisieren.Gisman hat geschrieben: ↑Di 6. Nov 2018, 14:58Ich 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: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.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
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.