Wenn ich die Frage richtig verstanden habe und wie bereits erwähnt, trägt ihr Kreativteam die Verantwortung für den Betrieb des PostGIS-Ofens.
Ich werde darum bitten, mich von niemandem in meinem humorvollen Stil beleidigen zu lassen und es als Spiel zu verstehen!
Die Originaldatei besteht aus geschnittenen Früchten und einfachen Formen (im Folgenden als Frucht bezeichnet), siehe Abbildung 1 unten.
Hier ist mein Rezept und ich werde dabei von lieben Programmierern unterstützt, die Sie später kennenlernen werden. Beginnen wir, und dafür werden wir einen Teig herstellen, in den unsere Früchte gelegt werden, für den das Skript ausgeführt wird:
create table poly_extent as
SELECT ST_SetSRID(ST_Buffer(ST_Envelope(ST_Extent(geom)),0.05),4326) as geom FROM poly;
Siehe das Ergebnis in Abbildung 2 unten
Wenn es nur wenige Früchte gibt, wie in meinem Bild, erstellen Sie den Rand des externen Puffers auf der Frucht, oder wenn es viele Früchte gibt, erstellen Sie den Rand des negativen Puffers, für den das Skript ausgeführt wird:
create table poly_buff_dump as
SELECT ((ST_Dump(ST_Boundary(ST_Union(ST_Buffer((geom),0.01, 'join=mitre mitre_limit=5.0'))))).geom) geom FROM poly;
Und schneiden Sie die Pufferlinien um jede Frucht
UPDATE poly_buff_dump SET geom=ST_RemovePoint(geom, ST_NPoints(geom)-1)
WHERE ST_IsClosed(geom)=true;
Siehe das Ergebnis in Abbildung 3 unten
(Eigentlich dachte ich, dass ich als Ergebnis unterbrochene Linien bekommen würde (wie in einem Kreis), aber wenn die Figuren schwierig sind, werden manchmal Brüche erhalten, falsche, zum Beispiel eine Seite des Rechtecks fiel ab usw. )
Dann müssen Sie die erhaltenen Linien auf eine für Sie bequeme Weise in gleiche Segmente unterteilen und Punkte daraus extrahieren
create table poly_buff_dump_pt as
SELECT (ST_DumpPoints((geom))).geom geom FROM poly_buff_segm;
Ergebnis, siehe Abbildung 4 unten
Führen Sie nun das Voronoi-Tool aus. An dieser Stelle habe ich das von MickyT vorgeschlagene Tool verwendet: /gis//a/172246/120129
, wodurch Sie Tabellen mit dem Namen „voronoi“ erstellt haben "Für die Tatsache, dass" mein erster Assistent "vom Küchenchef getrennt ist, danke vom Küchenchef!" :-).
Die zweite Möglichkeit in diesem Schritt besteht darin, die Funktion ST_VoronoiPolygons auszuführen.
Ergebnis, siehe Abbildung 5 unten
Schneiden Sie nun die zusätzlichen Teile aus, indem Sie das Skript ausführen:
create table poly_voronoi_cut as
SELECT ST_Intersection(a.geom, b.geom) geom
FROM voronoi a INNER JOIN poly_extent b ON ST_Intersects(a.geom, b.geom);
Ergebnis, siehe Abbildung 6 unten.
Führen Sie nun das Skript aus, um den Geodatentyp in LineString auszurichten:
create table poly_voronoi_dump as
SELECT (ST_Dump(geom)).geom as geom
FROM poly_voronoi_cut;
Und jetzt werde ich "meinen zweiten Kumpel" bitten, meine Pflichten zu übernehmen und den Kuchen zu mixen (Jeff - /gis//a/785/120129 ), und zwar in einer einzigen Schicht und dafür , danke mir dafür!
CREATE TABLE poly_overlay_cut AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(geom) AS geom FROM (
SELECT ST_Union(geom) AS geom FROM (
SELECT ST_ExteriorRing(geom) AS geom FROM poly_voronoi_dump) AS lines
) AS noded_lines
)
);
Jetzt ist es Zeit für mich, mich an die Arbeit zu machen, für die ich das Skript ausführe:
create table poly_voronoi_union as
SELECT b.id, (ST_ConvexHull(ST_Union(a.geom, b.geom))) geom
FROM poly_overlay_cut a INNER JOIN poly_buff_dump b ON ST_Intersects(a.geom, b.geom)
GROUP BY b.id, a.geom, b.geom;
und ein weiteres Skript:
create table poly_voronoi_union_area as
SELECT ST_Union(ST_ConvexHull(ST_BuildArea(geom))) as geom FROM poly_voronoi_union
GROUP BY id;
siehe Abbildung 7 unten
Wie Sie auf dem Bild sehen können, haben unsere Schnitte kleine Ebenen, die optional mit ST_SnapToGrid (oder auf andere Weise) entfernt werden können:
Und zum Schluss werden wir unsere gebackenen Früchte aus unserer Torte herausschneiden, ich bin sogar ein bisschen müde geworden, als ich am Ofen stand :-)
create table polygon_voronoi_result as
SELECT (ST_Dump(ST_Difference(a.geom, b.geom))).geom as geom
FROM poly_voronoi_union_area_snap as a JOIN poly b ON ST_Intersects(a.geom, b.geom);
Ergebnis siehe Abbildung 8
Alles von diesem Tag an wird jetzt jeder lernen, leckere Kuchen zu backen - Obstteller. Hilf dir selbst, und wähle die Teile aus, die dir gefallen, genug für alle.
(Es ist schade, dass ich wirklich nicht alle Menschen ernähren kann, nicht mit elektronischen Kuchen, sondern mit echten Kuchen, vielleicht würde der Hunger auf der Erde enden ...)
Edit: Die Kirsche auf dem Kuchen könnte so aussehen :-):
WITH
tbla AS (SELECT (ST_DumpPoints(geom)).geom geom FROM poly),
tblb AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tbla),
tblc AS (SELECT ST_Intersection(a.geom, b.geom) geom FROM tblb a JOIN poly_extent b ON ST_Intersects(a.geom,b.geom)),
tbld AS (SELECT id, ((ST_Dump(geom)).geom) geom FROM poly GROUP BY id, geom)
SELECT id, ST_Union(a.geom) as geom FROM tblc a JOIN tbld b ON ST_Intersects(a.geom, b.geom) GROUP BY id;
oder
WITH
tbla AS (SELECT (ST_DumpPoints(geom)).geom geom FROM polygons),
tblb AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tbla),
tblc AS (SELECT id, ((ST_Dump(geom)).geom) geom FROM polygons GROUP BY id, geom)
SELECT id, ST_Union(a.geom) geom FROM tblb a JOIN tblc b ON ST_Intersects(a.geom, b.geom) GROUP BY id;
Mit dir war gut und fair Mr.Baker, vielen Dank und viel Glück, :-) ...
Originelle Lösungen.
Dieses Skript heißt: ST_VoronoiDiagramsFromPolygons.