Je vais donc vous préparer un gâteau - plateau de fruits, en utilisant les outils PostGis, comme vous l'avez demandé, si j'ai bien compris la question, et comme je l'ai mentionné, la responsabilité du fonctionnement du four PostGIS est portée par son équipe créative.
Je vais demander à ne pas être offensé par quelqu'un dans mon style humoristique et à le comprendre comme un jeu!
Le fichier d'origine est constitué de fruits tranchés et de formes simples (ci-après appelés fruits), voir la figure 1 ci-dessous.
Voici ma recette, et je serai aidé en cela par de chers programmeurs, dont vous apprendrez plus tard. Commençons, et pour cela nous allons créer une pâte dans laquelle seront déposés nos fruits, pour laquelle exécuter le script:
create table poly_extent as
SELECT ST_SetSRID(ST_Buffer(ST_Envelope(ST_Extent(geom)),0.05),4326) as geom FROM poly;
Voir le résultat dans la figure 2 ci-dessous
Maintenant, s'il y a peu de fruits, comme dans mon image, créez la bordure du tampon externe sur le fruit, ou s'il y a beaucoup de fruits, créez la bordure du tampon négatif, pour lequel exécutez le 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;
Et découpez les lignes tampons autour de chaque fruit
UPDATE poly_buff_dump SET geom=ST_RemovePoint(geom, ST_NPoints(geom)-1)
WHERE ST_IsClosed(geom)=true;
Voir le résultat dans la figure 3 ci-dessous
(En fait, je pensais qu'en conséquence j'obtiendrais des lignes brisées (comme dans un cercle), mais si les chiffres sont difficiles, parfois des ruptures sont obtenues, incorrectes, par exemple, un côté du rectangle est tombé, etc. )
Ensuite, vous devez diviser les lignes obtenues de manière pratique pour vous en segments égaux et en extraire des points
create table poly_buff_dump_pt as
SELECT (ST_DumpPoints((geom))).geom geom FROM poly_buff_segm;
Résultat, voir figure 4 ci-dessous
Maintenant, lancez l'outil Voronoi, à cet endroit, j'ai utilisé l'outil suggéré par le lien MickyT: /gis//a/172246/120129
, à la suite de quoi vous aurez créé des tables avec le nom "voronoi "Pour le fait que" mon premier assistant "est distinct du chef merci du chef! :-).
La deuxième façon de cette étape consiste à exécuter la fonction ST_VoronoiPolygons.
Résultat, voir figure 5 ci-dessous
Maintenant, coupez les parties supplémentaires en exécutant le 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);
Résultat, voir figure 6 ci-dessous.
Exécutez maintenant le script afin d'aligner le type de géodonnées dans LineString:
create table poly_voronoi_dump as
SELECT (ST_Dump(geom)).geom as geom
FROM poly_voronoi_cut;
Et maintenant, je vais demander à "mon second compagnon" de prendre mes fonctions et de mélanger le gâteau wel (Jeff - /gis//a/785/120129 ), en le nivelant en une seule couche, et pour cela , merci à moi pour ça!
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
)
);
Il est maintenant temps pour moi de me mettre au travail, pour lequel je lance le 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;
et un autre script:
create table poly_voronoi_union_area as
SELECT ST_Union(ST_ConvexHull(ST_BuildArea(geom))) as geom FROM poly_voronoi_union
GROUP BY id;
voir figure 7 ci-dessous
Comme vous pouvez le voir sur l'image, nos coupes ont de petites couches, qui peuvent être supprimées, en option en utilisant ST_SnapToGrid (ou d'une autre manière):
Et enfin, nous allons couper nos fruits au four de notre tarte, je me suis même un peu fatigué debout devant le four, :-)
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);
Résultat voir figure 8
Tout de ce jour, maintenant tout le monde apprendra à faire de délicieuses tartes - plateau de fruits. Servez-vous de tous et choisissez les morceaux que vous aimez, pour tous.
(Dommage que je ne puisse vraiment pas nourrir tout le monde, pas avec des gâteaux électroniques, mais avec de vrais gâteaux, peut-être que la faim finirait sur Terre ...)
Edit: La cerise sur le gâteau pourrait ressembler à ceci :-):
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;
ou
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;
Avec vous était bon et juste Mr.Baker, merci à tous et bonne chance,: -) ...
Solutions originales.
Ce script est appelé: ST_VoronoiDiagramsFromPolygons.