इसलिए, मैं आपके लिए एक केक तैयार करूंगा - फ्रूट प्लैटर, पोस्टगिस टूल्स का उपयोग करके, जैसा कि आपने अनुरोध किया था, अगर मैंने सही ढंग से प्रश्न को समझा है, और जैसा कि मैंने उल्लेख किया है, पोस्टगिस ओवन के संचालन की जिम्मेदारी उसकी रचनात्मक टीम द्वारा वहन की जाती है।
मैं अपने हास्य शैली में किसी के द्वारा नाराज नहीं होने और इसे एक खेल के रूप में समझने के लिए कहूंगा!
मूल फ़ाइल कटा हुआ फल और सरल आकार है (बाद में फल के रूप में संदर्भित), नीचे चित्र 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 देखें
अब वोरोनोई टूल चलाएं, इस स्थान पर मैंने लिंक मिकी द्वारा सुझाए गए टूल का उपयोग किया है: /gis//a/172246/120129
, जिसके परिणामस्वरूप आपने "वोरोनोई" नाम के साथ तालिकाओं का निर्माण किया होगा। "इस तथ्य के लिए कि" मेरा पहला सहायक "महाराज से धन्यवाद से अलग है! :-)।
इस चरण में दूसरा तरीका 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 देखें।
अब लाइनस्ट्रिंग में जियोडेटा प्रकार संरेखित करने के लिए स्क्रिप्ट चलाएँ:
create table poly_voronoi_dump as
SELECT (ST_Dump(geom)).geom as geom
FROM poly_voronoi_cut;
और अब मैं अपने कर्तव्यों को पूरा करने के लिए "मेरे दूसरे साथी" से पूछूंगा और केक वेल (जेफ़ - /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;
संशोधित स्क्रिप्ट 01.04.2020:
WITH tbla AS (
WITH atbl AS (SELECT id, (ST_ExteriorRing(((ST_Dump(geom)).geom))) geom FROM polygons),
intervals AS (SELECT generate_series (0, 501) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM atbl, intervals GROUP BY id, intervals.steps, geom),
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।