বহিরাগত বহুভুজ থেকে ভোরোনাই ডায়াগ্রামের মতো মোজাইক তৈরি করুন


12

নীচের চিত্রটি সমস্যাটি দেখায় :

এখানে চিত্র বর্ণনা লিখুন

হিসেবে (ক) আমি গ্রন্থিচ্যুত বহুভুজ একটি সেট, জ্যামিতি যেমন PostGIS হবে। আমি কিছু প্রয়োজন (খ) , "মোজাইক" বহুভুজের এই সেট এর একটি Voronoi নির্মাণ মত (দ্বারা চিত্রিত, একটি "প্রভাব অঞ্চল" মানদণ্ড দ্বারা এটি নির্মাণের ... (গ) আসলে, যদি বহুভুজ হয়েছিল:) পয়েন্টস, প্রভাব অঞ্চলগুলি ভোরোনাই oi

সংক্ষিপ্তসার: আমার একটি এসকিউএল অ্যালগরিদম (বা পোস্টজিআইএসের জন্য কিছু নির্দিষ্ট) দরকার যা বিচ্ছিন্ন বহুভুজগুলির সেটগুলির "মোজাইক" উত্পন্ন করে। (সম্ভবত সামান্য ST_Buffer এবং ST_Differences ক্রিয়াকলাপ)

পিএস: আমার দরকার, ভোরোনাইয়ের মতো, স্পেস ডিলিমেটেশন (একটি স্কোয়ার ফ্রেম (বি) ) উপেক্ষা করা হবে।


এই সমস্যাটি লাইনগুলি সম্পর্কে এই অন্যান্যর মতো ।

সম্পাদনা করুন (@ ফেলিক্সআইপি মন্তব্যের পরে)

আমি ভেক্টর মহাবিশ্বে থাকার জন্য , যথার্থতা হারাতে প্রেরণা করি না ( উদাহরণস্বরূপ ST_DelaunayTriangles ব্যবহার করে এবং মূল বহুভুজ দ্বারা অভ্যন্তরীণ সংযোজন এবং বিয়োগ করানো , সেগুলি একটি দ্বৈত গ্রাফ সমাধানের সাথে অভিযোজিত ) ... কিছু সহজ এবং স্বয়ংক্রিয় প্যাকেজ যেমন প্রিপিয়ার ( কিউজিআইএস টপোলজিকাল সরঞ্জামগুলির মতো সহায়তা করা) স্বয়ংক্রিয় নয়)। তবে রাস্টার সম্ভবত সহজ এবং কম সিপিইউ গ্রহণযোগ্য।

এই "জিআরআইডি প্রক্রিয়া" চিত্রটি সমাধান হিসাবে বৈধ, এটি ধরে নিলে এটি একই সূক্ষ্মতা এবং "ইউক্যালিডিয়ান প্রভাব অঞ্চল বৃদ্ধি পেতে পারে" allowing

এখানে চিত্র বর্ণনা লিখুন

এআরসিজিআইএস-এ ইউক্লিডিয়ান অ্যালোকেশন নামে পরিচিত একটি স্থানিক বিশ্লেষণ সরঞ্জাম উপস্থিত রয়েছে , সুতরাং, সম্ভবত বহুভুজের সেট (বহুভুজকে শ্রেণিবদ্ধকরণ, রাস্টারাইজিং এবং মেকিং-ব্যাক) দিয়ে শুরু করে একটি পোস্টজিআইএস অনুরূপ সমাধান রয়েছে


ধন্যবাদ @ নীর, পয়েন্টগুলির সাথে বিভ্রান্তির জন্য দুঃখিত, আমি পয়েন্টগুলি ব্যবহার করছি না, উদাহরণের আইটেম (ক) এবং (খ) হিসাবে কেবল বহুভুজ ... সমাধান সম্পর্কে আপনার কিছুর একটি যোগসূত্র আছে?
পিটার ক্রাউস

আর্কিসে ইউক্লিডিয়ান বরাদ্দ বা নৈকট্য নামে একটি রাস্টার সমাধান রয়েছে
ফেলিক্সআইপি

ধন্যবাদ @ ফেলিক্সআইপি, আমি "ওয়েল কম রাস্টার সমাধানগুলি" সম্পাদনা করেছি ;-)
পিটার ক্রাউস

আপনি যদি তাদের বহুভুজকে তাদের পরিসীমা থেকে মুছে ফেলেন pস্পলিওন, আপনি বহুভুতে রেখে যাবেন। এটির কঙ্কাল gis.stackexchange.com/questions/177/… আপনার অনুমান করা দরকার। বাস্তবায়ন যদিও এক বিশাল কাজ
ফেলিক্সিপ

1
@ সিরিল, আমি আপনার স্ক্রিপ্টগুলি পর্যালোচনা করতে পারি ... পরের সপ্তাহে এমন কিছু পোস্ট করা যা আধুনিক পোস্টজিআইএস ফাংশনগুলির সাথে সমাধান মনে হয়, এটি প্রথম পদক্ষেপ হবে।
পিটার ক্রাউস

উত্তর:


1

সুতরাং, আমি আপনার জন্য একটি কেক প্রস্তুত করব - ফলত প্লেটার, পোস্টগিস সরঞ্জামগুলি ব্যবহার করে, যেমন আপনি অনুরোধ করেছিলেন, যদি আমি প্রশ্নটি সঠিকভাবে বুঝতে পারি এবং যেমন আমি উল্লেখ করেছি, পোস্টজিআইএস চুলা পরিচালনার দায়দায়িত্ব তার সৃজনশীল দল বহন করে।

আমি আমার হাস্যকর স্টাইলে কারও কাছে অসন্তুষ্ট না হতে এবং এটিকে একটি খেলা হিসাবে বুঝতে বলব!

মূল ফাইলটি কাটা ফল এবং সহজ আকার (এর পরে ফল হিসাবে চিহ্নিত করা হয়), নীচের চিত্র 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 ডায়াগ্রামফ্রমপলিগনস।


1
হাই, ভাল চিত্র, এবং ভাল ফলাফল (!) বলে মনে হচ্ছে। সংক্ষিপ্ত আলোচনার পরামর্শ, @ জিওজিক সমাধান দেখুন, কিউজিসের পদক্ষেপগুলি এখানে পোস্টজিআইএসের মূল পদক্ষেপগুলি মনে হচ্ছে ... কেন ই দরকার ST_Bufferএবং ST_ConvexHull? একটি বিকল্প অ্যালগরিদম আছে?
পিটার ক্রাউস

1) দেখুন, ভোরোনাই ফাংশনের প্রয়োগের সময় মূল চিত্রগুলির মধ্যে পৃথকীকরণের রেখাটি হ্রাস করার জন্য এস এস বাফার এবং বহুভুজের উপর তৈরি করা হয়েছে, অতএব, আপনি যে পরিমাণ বড় বাফার আকারটি নির্দিষ্ট করতে পারবেন, তত সহজেই পৃথকীকরণের লাইনগুলি নির্মিত হবে একটি ভোরোনাই ফাংশন ... ২) প্রতিটি বহুভুজের উপর বহুসংখ্যক পরিসংখ্যান থেকে এস এস কনভেক্সহুল, আমাদের বহুভুজটির প্রয়োজন ... 3) আজ, আপনার প্রশ্নটি সমাধান করার বিষয়টি আমার দৃষ্টিভঙ্গি, আমি জানি না আমাদের সবার কী হবে? এবং ভবিষ্যতে আমাদের সিদ্ধান্তগুলি ...
সিরিল মিখালচেঙ্কো

বাফার লাইনের আরেকটি গুরুত্বপূর্ণ মান হ'ল তারা প্রতিটি আকারের জন্য সম্মিলিত বহুভুজ তৈরি করতে ভোরোনাইয়ের ক্রিয়াকলাপের ফলাফল থেকে টুকরোগুলি নির্বাচন করতে আমাদের সহায়তা করবে ...
সিরিল মিখালচেনকো

যাইহোক, আমি কোড এবং পদ্ধতির উন্নতির স্বাগত জানাই, যাতে তারা ফলাফলটি আরও খারাপ না করে ...
সাইরিল মিকালচেনকো

1
হাই সাইরিল, আমি সম্মতি দিচ্ছি যে কনট্যুর লাইনগুলি নিখুঁত (!) হিসাবে স্বাভাবিক করার জন্য ST_Buffer একটি ভাল বিকল্প। সম্পর্কে ST_ConvexHull, কেবল একটি কৌতূহল, আমরা চিত্র 6 পরে কী ধরণের ফলাফল পেতে পারি, poly_voronoi_unionST_ConvexHull ছাড়াই।
পিটার ক্রাউস

8

পোস্টগিসের ভোরোনাইয়ের জন্য ডেডিকেটেড ফাংশন নেই, তবে কিগিসে ভার্নোই ফাংশন রয়েছে যা পয়েন্ট থেকে ভোরোনাই বহুভুজ তৈরি করতে পারে, তাই কিগিস ব্যবহার করে আমি এই ফলাফলগুলি অনুসরণ করার জন্য নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করেছি:

extract nodesফাংশন ব্যবহার করে বহুভুজ থেকে পয়েন্ট তৈরি করুন ।

-কিউগিসে ভোরই ফাংশন ব্যবহার করে ভার্নোয় বহুভুজ তৈরি করুন।

- কিগিসে একটি স্থানিক যোগদান করুন।

ফলাফল সমাধান করুন।

এখানে চিত্র বর্ণনা লিখুন


1
সুন্দর সমাধান (!), এবং দৃষ্টান্তটি ধন্যবাদ। আপনি এটি বৃদ্ধি করতে পারেন? নীচের বাম আয়তক্ষেত্রটি দেখুন, এটি ভোরোনাইয়ের 4 পয়েন্ট ছিল এবং আয়তক্ষেত্রের কেন্দ্রটির কোনও প্রতিনিধিত্ব নেই, এর অঞ্চলটি বিকৃত করা হয়েছে (হ্রাস হারা ত্রিভুজটি হ'ল) ​​... সম্ভবত প্রতিটি বহুভুজের নিয়মিত নমুনা তৈরি করা সম্ভব হয় ... এবং সম্ভবত কিছু অভ্যন্তরীণ পয়েন্ট।
পিটার ক্রাউস

আমি আর্কজিআইএস-এ ঘনক্ষেত্রের সরঞ্জামটি ব্যবহার করি। এটি উল্লেখযোগ্যভাবে বহুভুজকে উন্নত করে। +1
ফেলিক্সপ

3

ঠিক আছে - এটি সম্পর্কে একটু চিন্তাভাবনা করে দেখেছি এটি এমন কিছু হয়েছিল যা আমি ইদানীং দেখছি।

আপনার প্রারম্ভিক পোলগুলি নিন:

এখানে চিত্র বর্ণনা লিখুন

একটি সংখ্যা দিয়ে একটি নতুন বৈশিষ্ট্য তৈরি করুন (আমার ক্ষেত্রে 100) ভেক্টর ব্যবহার করুন -> গবেষণা সরঞ্জামগুলি -> বহুভুজ সরঞ্জামের মধ্যে এলোমেলো পয়েন্ট এটি প্রতিটি বহুভুজের ভিতরে (100) পয়েন্ট উত্পন্ন করবে: এখানে চিত্র বর্ণনা লিখুন

তারপরে ভেক্টর-> জ্যামিতি সরঞ্জাম -> ভোরোনয় সেই বিন্দু স্তরের উপর ভিত্তি করে পোলি উত্পন্ন করতে।

এখানে চিত্র বর্ণনা লিখুন

এখন, আপনি ভেক্টর -> স্পেসিয়াল ক্যোয়ারী সরঞ্জামটি ব্যবহার করতে পারেন: একটি বহুভুজের (বা বহুভুজের একটি) অন্তর্গত পয়েন্টগুলি নির্বাচন করুন that বহুভুজের ক্ষেত্রে প্রযোজ্য আপনার ভোরোনাই বহুভুজগুলির একটি নির্বাচন উত্পন্ন করতে স্থানিক ক্যোয়ারী সরঞ্জামটি ব্যবহার করুন। ভারোনি বহুভুজের সাথে একটি বৈশিষ্ট্য যুক্ত করুন যা আগ্রহের বহুভুজের সাথে মিলে যায়। (আমি সবেমাত্র 1,2,3,4 ব্যবহার করেছি)

এখন আপনি ভেক্টর-> জিওপ্রসেসিং সরঞ্জাম-> আপনার নতুন বৈশিষ্ট্যের উপর ভিত্তি করে দ্রবীভূত করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন


ধন্যবাদ @ অ্যামেস (!), চিত্রগুলি ভাল, এবং পদ্ধতিটি একটি ভাল বিকল্প ... তবে প্রশ্নটি "একটি এসকিউএল অ্যালগরিদম (বা পোস্টজিআইএসের জন্য কিছু নির্দিষ্ট)" এবং এখন, ফাংশনটির ব্যবহার সম্পর্কে অনুভূতি এসT_ ভোরোনাই পলিগনস () , এটি সম্ভবত একটি ক্লিকে সমস্ত সমস্যার সমাধান করে ;-)
পিটার ক্রাউস

@ এ্যামেস একটি দ্রুত অনুসন্ধান প্রকাশ করে যে পোস্টজিআইএসেও এই পদ্ধতিটি সত্যই ব্যবহৃত হতে পারে। পোষ্টগিসে বহুভুজের মধ্যে এলোমেলো পয়েন্টগুলি কীভাবে তৈরি করা যায় সেগুলি বহুভুজ থেকে বিন্দু তৈরির ব্যাখ্যা দেয় এবং সেখান থেকে এটি মোটামুটি সোজা এগিয়ে হওয়া উচিত।
ফিল জি

আমার অনুগ্রহটি আপনার প্রতি উত্সাহজনক হিসাবে ছিল (এখানে স্বাগত!) তবে প্রশ্ন এবং অনুগ্রহের প্রয়োজনীয়তার জন্য এই উত্তরটি রক্ষিত
পিটার ক্রাউস

ধন্যবাদ পিটার, আমি আপনার নোটগুলি দেখেছি কিন্তু দুর্ভাগ্যক্রমে আমার কাছে ফিরে আসার এবং এটিকে সম্বোধনের সুযোগ হয়নি। পোস্টজিআইএস-এ আমার এখনও কোনও অভিজ্ঞতা নেই এবং যে কোনও ধরণের ভাল প্রতিক্রিয়া জানাতে আমার যে পরিমাণ সময় পাওয়া যায় তার চেয়ে বেশি সময় লাগত। আমি আশা করি আমাদের এই জায়গার অনুসন্ধান ভবিষ্যতে লোকের পক্ষে সহায়ক, সম্ভবত পোস্টজিআইএসে যদি আমি একটি ক্র্যাক পেয়েছি তবে খুব শীঘ্রই আমি ফিরে আসব এবং অনুশীলনের জন্য এটির জন্য আরও একটি পদক্ষেপ নেব!
এএ

2

বহুভুজ থেকে ভোরোনাই বহুভুজ তৈরি করার জন্য এলোমেলো পয়েন্টগুলি ভাল ধারণা, এটি বেশ ভালভাবে কাজ করে তবে একে অপরের নিকটে বহুভুজের পক্ষে এটি খুব খারাপ: এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

পোষ্টজিআইএস ব্যবহার করে এস এস অ্যাপ্রোমিক্সমেডিয়ালএক্সিস আরও একটি ভাল বিকল্প: বহুভুজগুলির জন্য ভেরোনাই ডায়াগ্রাম গণনা করা হচ্ছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.