সুতরাং, আমি আপনার জন্য একটি কেক প্রস্তুত করব - ফলত প্লেটার, পোস্টগিস সরঞ্জামগুলি ব্যবহার করে, যেমন আপনি অনুরোধ করেছিলেন, যদি আমি প্রশ্নটি সঠিকভাবে বুঝতে পারি এবং যেমন আমি উল্লেখ করেছি, পোস্টজিআইএস চুলা পরিচালনার দায়দায়িত্ব তার সৃজনশীল দল বহন করে।
আমি আমার হাস্যকর স্টাইলে কারও কাছে অসন্তুষ্ট না হতে এবং এটিকে একটি খেলা হিসাবে বুঝতে বলব!
মূল ফাইলটি কাটা ফল এবং সহজ আকার (এর পরে ফল হিসাবে চিহ্নিত করা হয়), নীচের চিত্র 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 ফলাফল দেখুন
(আসলে, আমি ভেবেছিলাম ফলস্বরূপ আমি ভাঙ্গা রেখাগুলি পেয়ে যাব (যেমন একটি বৃত্তের মধ্যে)) তবে চিত্রগুলি যদি কঠিন হয় তবে কখনও কখনও বিরতি পাওয়া যায়, ভুলগুলি হয়, উদাহরণস্বরূপ, আয়তক্ষেত্রের একটি দিক বন্ধ হয়ে যায়, ইত্যাদি etc. )
তারপরে আপনাকে প্রাপ্ত লাইনগুলি আপনার জন্য একটি সমান অংশে বিভক্ত করতে হবে এবং সেগুলি থেকে পয়েন্ট উত্তোলন করতে হবে
create table poly_buff_dump_pt as
SELECT (ST_DumpPoints((geom))).geom geom FROM poly_buff_segm;
ফলাফল, নীচে চিত্র 4 দেখুন
এখন ভোরোনাই সরঞ্জামটি চালান, এই স্থানে আমি মিকিটি লিঙ্কটি প্রস্তাবিত সরঞ্জামটি ব্যবহার করেছি: /gis//a/172246/120129
, ফলস্বরূপ আপনি "ভোরোনাই" নামটি দিয়ে সারণী তৈরি করবেন will "এই সত্যের জন্য যে" আমার প্রথম সহকারী "শেফের থেকে শেফকে ধন্যবাদ থেকে আলাদা! :-)।
এই পদক্ষেপের দ্বিতীয় উপায় হ'ল এসT_ ভারোনোইপলিগনস ফাংশনটি চালানো।
ফলাফল, নীচের চিত্র 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 চিত্র দেখুন
আপনি যেমন ছবিতে দেখতে পাচ্ছেন, আমাদের কাটগুলির মধ্যে ছোট স্তর রয়েছে, যা সরানো যেতে পারে, এস এসস্প্যাপটোগ্রিড (বা অন্য কোনও উপায়ে) ব্যবহার করে বিকল্প হিসাবে:
এবং অবশেষে, আমরা আমাদের পাই থেকে আমাদের বেকড ফলগুলি কেটে দেব, আমি এমনকি চুলাটির পাশে দাঁড়িয়ে কিছুটা ক্লান্ত হয়ে পড়েছিলাম, :-)
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_Voronoi ডায়াগ্রামফ্রমপলিগনস।