それで、私はあなたのためにケーキを準備します-あなたが要求したように、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」という名前のテーブルが作成されます。 「私の最初のアシスタント」はシェフとは別のシェフだからです!:-)。
このステップの2番目の方法は、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;
そして今、私は「二人目の仲間」に任務を任せ、ケーキウェル(Jeff- https: //gis.stackexchange.com/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;
君は良かったし、Mr.Baker、ありがとう、そして幸運をありがとう、:-)...
オリジナルのソリューション。
このスクリプトは、ST_VoronoiDiagramsFromPolygonsと呼ばれます。