Quindi, preparerò una torta per te: un piatto di frutta, usando gli strumenti PostGis, come hai richiesto, se ho capito correttamente la domanda e, come ho già detto, la responsabilità per il funzionamento del forno PostGIS è a carico del suo team creativo.
Chiederò di non essere offeso da nessuno nel mio stile umoristico e di capirlo come un gioco!
Il file originale è frutta a fette e forme semplici (di seguito denominate frutta), vedere la Figura 1 di seguito.
Ecco la mia ricetta, e sarò aiutato in questo da cari programmatori, di cui imparerai più avanti. Cominciamo, e per questo creeremo un impasto in cui verranno deposti i nostri frutti, per cui eseguiamo la sceneggiatura:
create table poly_extent as
SELECT ST_SetSRID(ST_Buffer(ST_Envelope(ST_Extent(geom)),0.05),4326) as geom FROM poly;
Vedere il risultato nella Figura 2 di seguito
Ora, se ci sono pochi frutti, come nella mia immagine, creare il bordo del buffer esterno sul frutto, o se ci sono molti frutti, creare il bordo del buffer negativo, per il quale eseguire lo script:
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;
E tagliare le linee del buffer attorno a ciascun frutto
UPDATE poly_buff_dump SET geom=ST_RemovePoint(geom, ST_NPoints(geom)-1)
WHERE ST_IsClosed(geom)=true;
Vedere il risultato nella Figura 3 di seguito
(In realtà, ho pensato che di conseguenza avrei ottenuto linee spezzate (come in un cerchio), ma se le figure sono difficili, a volte si ottengono interruzioni, quelle errate, ad esempio, un lato del rettangolo cadeva, ecc. )
Quindi devi dividere le linee ottenute in modo conveniente per te in segmenti uguali ed estrarre punti da esse
create table poly_buff_dump_pt as
SELECT (ST_DumpPoints((geom))).geom geom FROM poly_buff_segm;
Risultato, vedere la Figura 4 di seguito
Ora esegui lo strumento Voronoi, in questo posto ho usato lo strumento suggerito dal link MickyT: /gis//a/172246/120129
, a seguito del quale avrai creato le tabelle con il nome “voronoi "Per il fatto che" il mio primo assistente "è separato dallo chef grazie dallo chef! :-).
Il secondo modo in questo passaggio è eseguire la funzione ST_VoronoiPolygons.
Risultato, vedere la Figura 5 di seguito
Ora, taglia le parti extra eseguendo lo script:
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);
Risultato, vedere la Figura 6 di seguito.
Ora esegui lo script per allineare il tipo di geodati in LineString:
create table poly_voronoi_dump as
SELECT (ST_Dump(geom)).geom as geom
FROM poly_voronoi_cut;
E ora chiederò al "mio secondo ufficiale" di assumere i miei doveri e mescolare la torta wel (Jeff - /gis//a/785/120129 ), livellandola in un singolo strato, e per quello , grazie a me per questo!
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
)
);
Ora è il momento di mettermi al lavoro, per il quale eseguo lo script:
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;
e un'altra sceneggiatura:
create table poly_voronoi_union_area as
SELECT ST_Union(ST_ConvexHull(ST_BuildArea(geom))) as geom FROM poly_voronoi_union
GROUP BY id;
vedere la figura 7 in basso
Come puoi vedere nella figura, i nostri tagli hanno piccoli livelli, che possono essere rimossi, come opzione usando ST_SnapToGrid (o in un altro modo):
E infine, ritaglieremo la nostra frutta cotta dalla nostra torta, mi sono persino stancato in piedi accanto al forno :-)
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);
Risultato vedi figura 8
Tutto da questo giorno, ora tutti impareranno a cuocere deliziose torte - piatto di frutta. Aiutati tutti e scegli i pezzi che ti piacciono, abbastanza per tutti.
(È un peccato che non riesca davvero a sfamare tutte le persone, non con torte elettroniche, ma con torte vere, forse la fame finirebbe sulla Terra ...)
Modifica: la ciliegia sulla torta potrebbe assomigliare a questo :-):
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;
o
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;
Con te è stato buono e giusto Mr.Baker, grazie a tutti e buona fortuna,: -) ...
Soluzioni originali.
Questo script si chiama: ST_VoronoiDiagramsFromPolygons.