st_contains Polygon beschneiden

Probleme, Fragen die mit der Installation und Anwendung der PostGIS-Erweiterung zu tun haben.
Antworten
tommytom73
Neuer Benutzer
Beiträge: 7
Registriert: Mo 6. Feb 2017, 13:09

st_contains Polygon beschneiden

Beitrag von tommytom73 » Mo 6. Feb 2017, 13:33

Hallo in Forum

Ich versuche gerade eine Aufgabenstellung zu lösen.

Ich habe 4 große Gebiete die durch Polygons dargestellt werden. Ich habe ganz viele kleine Polygons welche ich erst prüfe ob sie innerhalb eines der großen Gebiete liegen.

Code: Alles auswählen

IF st_contains(geom_gebiet, geom_polygon) = TRUE THEN
Wenn nicht prüfe ich ob sie teilweise in einem Gebiet liegen.

Code: Alles auswählen

IF st_intersects(geom_gebiet, geom_polygon) = TRUE THEN
Wenn Sie teilweise in einem Gebiet liegen dann splitte ich die Polygons.

Code: Alles auswählen

SELECT st_split(geom_polygon, ST_Boundary(geom_gebiet
Jetzt gehe ich die erzeugten Teilstücke in einer Schleife durch um zu prüfen welches erzeugte Teilstück sich jetzt innerhalb des Gebiets befindet. Hier kommt mein Problem "st_contains" liefert immer "False" weil sich eine Grenze des Polygons auf der Linie des Gebiets befindet. Wie könnte man jetzt das Polygon des Gebiets um 1-2 Punkte temporär vergrößern so das "st_contains" wieder "True" ergibt?

Vielen Dank im Voraus für die Hilfe
Gruß Thomas

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

Re: st_contains Polygon beschneiden

Beitrag von Gisman » Mo 6. Feb 2017, 16:12

Schau mal was st_covers() für Ergebnisse liefert.
Gruß Uwe

tommytom73
Neuer Benutzer
Beiträge: 7
Registriert: Mo 6. Feb 2017, 13:09

Re: st_contains Polygon beschneiden

Beitrag von tommytom73 » Mo 6. Feb 2017, 16:27

st_within liefert False
st_contains liefert False
st_covers liefert False
st_intersects liefert True

Gruß Thomas

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

Re: st_contains Polygon beschneiden

Beitrag von Gisman » Di 7. Feb 2017, 08:27

Hm. Leider Sind die kleinen Polygone einzelnen Geometrien oder Multipolygone? hast du die Schnittpunkte in das große Polygon eingefügt? Welches Ergebnis liefern die Funktionen dann? Diese könntest du dann ggf. verschieben, um das kleine Polygon wieder im Inneren zu haben. Oder zu machst einen Buffer um das kleine Polygon, vereinigst diesen mit dem großen und hast wieder die kleine Geometrie im Innern. Oder du probierst st_dwithin() und probierst eine Abstand aus.
Das PostGIS Handbuch hat im übrigen wie ich im Moment sehe ein ganzes Kapitel zu dem Thema (4.3.6). Anscheinend funktionieren die ganzen Funktionen nur, wenn sich die Geometrien in einem Punkt schneiden. Die Funktion ST_Relate() scheint das zu umgehen. Vielleicht hilft dir das weiter.

Gruß Uwe

Edit: Natürlich kannst du auch einfach einen Buffer um das große Polygon legen... Note to myself: Keine Posts mehr ohne Kaffee :)

tommytom73
Neuer Benutzer
Beiträge: 7
Registriert: Mo 6. Feb 2017, 13:09

Re: st_contains Polygon beschneiden

Beitrag von tommytom73 » Di 7. Feb 2017, 10:01

Hallo Uwe,

danke erstmal das du mir hilfst.

Die geschnittenen kleinen Polygone sind alles einzelne Flächen die auch in eine neue Tabelle eingefügt werden und keine Multipolygons. Ja ich belese mich gerade auch noch und bin auch schon auf st_relate gestoßen so richtig weiß ich noch nichts damit anzufangen. Ich glaube eine temporäre Flächenvergrößerung des Gebiets um 0,5m müsste ausreichen. Wie macht man einen Buffer um ein Polygon? Mit Punkten und Linien habe ich es schon gemacht?

Gruß Thomas

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

Re: st_contains Polygon beschneiden

Beitrag von Gisman » Di 7. Feb 2017, 10:53

Das geht im wesentlichen genauso. Ein negativer Bufferwert erzeugt einen Buffer nach innen.

Gruß Uwe

tommytom73
Neuer Benutzer
Beiträge: 7
Registriert: Mo 6. Feb 2017, 13:09

Re: st_contains Polygon beschneiden

Beitrag von tommytom73 » Di 7. Feb 2017, 12:04

Hallo Uwe

Danke so hat's funktioniert :-)

Code: Alles auswählen

IF (SELECT public.st_contains(st_buffer(gebiet.wkb_geometry, 0.1), geomItem)) = TRUE THEN
gruß Thomas

PS: Thema kann abgeschlossen werden

Antworten