因此,如果我正确理解了这个问题,我将按照您的要求使用PostGis工具为您准备蛋糕-水果拼盘,并且正如我提到的,PostGIS烤箱的操作责任由她的创意团队承担。
我会要求任何人都不要以我的幽默风格来冒犯,并将其理解为一种游戏!
原始文件是切成薄片的水果和简单的形状(以下称为水果),请参见下面的图1。
这是我的秘诀,亲爱的程序员将为我提供帮助,稍后您将学习。让我们开始吧,为此,我们将创建一个面团,将其放入水果中,并为此运行脚本:
create table poly_extent as
SELECT ST_SetSRID(ST_Buffer(ST_Envelope(ST_Extent(geom)),0.05),4326) as geom FROM poly;
参见下面图2的结果
现在,如果水果很少(如我的图片所示),则在水果上创建外部缓冲区的边界,或者如果水果很多,则创建负缓冲区的边界,并为此运行脚本:
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;
并将每个水果的缓冲线切成薄片
UPDATE poly_buff_dump SET geom=ST_RemovePoint(geom, ST_NPoints(geom)-1)
WHERE ST_IsClosed(geom)=true;
参见下面图3的结果
(实际上,我认为结果是会出现虚线(例如圆形),但是如果图形很困难,有时会出现断点,例如矩形的一侧掉落等不正确的断点等。 )
然后,您需要以方便的方式将获得的线划分为相等的线段并从中提取点
create table poly_buff_dump_pt as
SELECT (ST_DumpPoints((geom))).geom geom FROM poly_buff_segm;
结果,请参见下面的图4
现在运行Voronoi工具,在这里我使用了链接MickyT建议的工具:https ://gis.stackexchange.com/a/172246/120129
,因此,您将创建名称为“ voronoi”的表感谢“我的第一助手”与厨师分开,感谢厨师!:-)。
此步骤的第二种方法是运行ST_VoronoiPolygons函数。
结果,请参见下面的图5
现在,通过运行脚本切断多余的部分:
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);
结果,请参见下面的图6。
现在运行脚本以在LineString中对齐地理数据类型:
create table poly_voronoi_dump as
SELECT (ST_Dump(geom)).geom as geom
FROM poly_voronoi_cut;
现在我会问:“我的二副”拿起我的职责和混合蛋糕WEL(杰夫- /gis//a/785/120129),练级吧单层,并为,谢谢我!
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
)
);
现在是我开始工作的时候了,为此我运行了脚本:
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;
和另一个脚本:
create table poly_voronoi_union_area as
SELECT ST_Union(ST_ConvexHull(ST_BuildArea(geom))) as geom FROM poly_voronoi_union
GROUP BY id;
参见下面的图7
如您在图片中所看到的,我们的剪切具有较小的图层,可以使用ST_SnapToGrid(或以其他方式)将其删除,作为一个选项:
最后,我们将从馅饼中切出烤好的水果,我什至有点不耐烦地站在烤箱旁,:-)
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);
结果见图8
从这一天开始的一切,现在每个人都将学会烤美味的馅饼-水果拼盘。全力以赴,选择适合自己的零配件。
(可惜我真的不能养活所有人,不是用电子蛋糕,而是用真正的蛋糕,也许饥饿会在地球上终结...)
编辑:馅饼上的樱桃可能看起来像这样:-):
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;
要么
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;
贝克先生,您真是个好人,谢谢大家,祝您好运,:-)...
原始解决方案。
该脚本称为:ST_VoronoiDiagramsFromPolygons。