পোস্টজিআইএস দিয়ে "দীর্ঘ এবং সংকীর্ণ" বহুভুজ সনাক্তকরণ


10

নগরীর পাড়াগুলি বলুন, আমার কাছে বহু অঞ্চলগুলির একটি বৃহত অঞ্চল উপস্থাপন করার একটি সেট রয়েছে। আমি তাদের মধ্যে বৃহত ওভারল্যাপিং অঞ্চলগুলি সনাক্ত করতে চাই।

তবে একটি সমস্যা আছে: কখনও কখনও এই বহুভুজগুলি তাদের ঘেরগুলির সাথে ওভারল্যাপ হয়ে যায় (কারণ এগুলি সামান্য নির্ভুলতার সাথে আঁকা হয়েছিল)। এটি এমন দীর্ঘ এবং সংকীর্ণ ওভারল্যাপগুলি উত্পন্ন করবে যা আমি যত্ন করি না।

তবে অন্য সময় শক্তিশালী বহুভুজগুলির বড় আকারের ওভারল্যাপগুলি আসবে, যার অর্থ এমন বৃহত অঞ্চল যেখানে কোনও প্রতিবেশীর বহুভুজ অন্যটির ওভারল্যাপ হয়। আমি কেবল এইগুলি নির্বাচন করতে চাই।

কেবল ওভারল্যাপগুলির নীচের চিত্রটি দেখুন। ভাবুন আমি নীচের বাম কোণে কেবল নীল বহুভুজ নির্বাচন করতে চেয়েছি।

উপরে জড়ান

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

আমি এমনকি ব্যবহার করার চেষ্টা করেছি ST_MinimumClearance, তবে কখনও কখনও বড় অঞ্চলগুলির সাথে এটি একটি সংকীর্ণ অংশ বা দুটি খুব কাছের কোণে সংযুক্ত থাকে।

অন্যান্য পদ্ধতির কোনও ধারণা?


নীচে @ সিরিল এবং @ এফগ্রিগের পরামর্শ অনুসারে, আমার জন্য যা সবচেয়ে ভাল কাজ করেছে তা হল একটি নেতিবাচক বাফার ব্যবহার করা।

আমি এরকম কিছু ব্যবহার করেছি:

ST_Area(ST_Buffer(geom, -10)) as neg_buffer_area

আমার ক্ষেত্রে, ইউনিটগুলি মিটার ছিল, সুতরাং 10 মিটার নেতিবাচক বাফার।

সংকীর্ণ বহুভুজগুলির জন্য, এই অঞ্চলটি শূন্য ফিরে এসেছে (এছাড়াও, জ্যামিতিটি খালি হবে)। তারপরে আমি এই কলামটি সংকীর্ণ বহুভুজগুলি ফিল্টার করার জন্য ব্যবহার করেছি।


4
অবশ্যই এর জন্য অঞ্চল / ঘেরের অনুপাত ব্যবহার করা যেতে পারে।
ভিন্স

ইমেজ থেকে স্বতন্ত্র বহুভুজটি কোথায় তা বলা শক্ত, তবে এই gis.stackexchange.com/a/265233/64838 এর মতো কিছু করা কাজ করতে পারে? সর্বনিম্ন ঘোরানো বাউন্ডিং বাক্স গণনা করুন তারপরে ছোট প্রস্থ বা উচ্চতাযুক্তগুলি বাতিল করুন।
এফগ্রিগ

আপনি এখানে বর্ণিত হিসাবে নেতিবাচক বাফার ব্যবহার করে দেখতে পারেন: আমি কীভাবে আমার আকৃতি ফাইলটিতে পাতলা বহুভুজ সনাক্ত করতে পারি?
এফগ্রিগ

উত্তর:


5

আমি নেতিবাচক বাফার তৈরি করার চেষ্টা করব, যদি এটি পাতলা বহুভুজ খান তবে এটি ভাল, যদি বহুভুজটি না খায় তবে এটি আমার ... :-)

রৈখিক বহুভুজগুলির প্রস্থের পূর্বে 2/3 সেট করে এই স্ক্রিপ্টটি চালান ...

create table name_table as
SELECT ST_Buffer(
(ST_Dump(
(ST_Union(
ST_Buffer(
(geom),-0.0001))))).geom,
0.0001)) as geom from source_table

ওএস: -) ...


শেষ পর্যন্ত আপনার পরামর্শটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। আমি ST_Area(ST_Buffer(geom, -10))আমার ক্ষেত্রে -10 মিটার-এর মতো কিছু ব্যবহার করে শেষ করেছি। যদি কোনও কিছু সেই অভিব্যক্তি থেকে 0 ফিরে আসে তবে আমি এটি ফিল্টার করে দিতে পারি।
বিপিএলএম্প

9

অঞ্চল / ঘেরের পরিবর্তে ঘেরের স্কোয়ার (বা এর বিপরীত) দ্বারা বিভক্ত অঞ্চলটি ব্যবহার করা ভাল।

একে "শেপ ইনডেক্স "ও বলা হয়। অঞ্চলটি দ্বারা বিভক্ত ঘেরের বর্গক্ষেত্রটির সর্বনিম্ন মান 4 * পাই () হয় (কোনও ডিস্কের ক্ষেত্রে, যা সর্বাধিক কমপ্যাক্ট 2 ডি জ্যামিতি হয়), সুতরাং এটি একটি সহজ জন্য 4 * পাই () দ্বারা স্বাভাবিক করা যায় ব্যাখ্যায়িতকরণ (1 এর কাছাকাছি স্বাভাবিক মানের মানে এর অর্থ আপনার কাছে খুব কমপ্যাক্ট অবজেক্ট রয়েছে এবং স্কোয়ারের মান প্রায় 1.27 থাকে)।

সম্পাদনা: খুব সামান্য আর্টেফ্যাক্টগুলি সরিয়ে ফেলতে এই অঞ্চলের একটি প্রান্তটি ব্যবহারযোগ্য হবে যা কমপ্যাক্ট হতে পারে। তারপরে শেপ সূচকটি আরও ভাল বৈপরীত্য প্রদর্শন করবে। সম্পাদনা: এই উত্তর ছাড়াও, ST_Snap ব্যবহার আপনাকে সমস্যাটি হওয়ার আগে সমাধান করতে সহায়তা করতে পারে।


ধন্যবাদ! তবে আমি নিশ্চিত নই যে এস এসএনপ এই ক্ষেত্রে কীভাবে সহায়তা করতে পারে ... যদি আমি এটি সঠিকভাবে পাই তবে আপনি কি এরকম কিছু প্রস্তাব দিচ্ছেন (o.overlap_perimeter^2 / o.overlap_area) / (4 * Pi()) as overlap_ratio? এটি কেবল অঞ্চল / ঘেরের চেয়ে আমার জন্য খারাপ ফলাফল করছে।
বিপিএলএম্প

এখন o.overlap_perimeter / (4 * sqrt(o.overlap_area)) as overlap_ratioএই কাগজ অনুসারে ব্যবহার করা হচ্ছে, তবে এরপরে আরও খারাপ ফলাফল (যদিও আমি এর চেয়ে খারাপ বলতে চাইছি তা নির্ধারণ করা শক্ত) ইস্পার্স- এ্যান্টি-ফোটোগ্রামম- রেমোট- একসেস / স্পেসিয়াল- ইনফ- এসসি.এন.আই / আই-7 / 135/… , পৃষ্ঠা 183.
বিপিএলপি

2
এর জন্য আপনাকে ধন্যবাদ, আমি কখনই "আকৃতি সূচক" শুনিনি। আমি সর্বদা ভেবেছিলাম যে ন্যূনতম বাউন্ডিং আয়তক্ষেত্রটি ব্যবহার করা এই ধরণের প্রশ্নের উত্তর দেওয়ার সর্বোত্তম উপায়। আমি এটি খুঁজে পেয়েছি, repository.asu.edu/attachments/111230/content/… , যা আকর্ষণীয়।
জন পাওয়েল

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

@bplmp ST_Snap আপনাকে "প্রায়" সংলগ্ন বহুভুজগুলির শীর্ষস্থানগুলি স্ন্যাপ করতে সহায়তা করবে যাতে তারা আর ওভারল্যাপ না করে। আপনার পরিসংখ্যানগুলিতে কোনও স্কেল নেই, তবে আপনার প্রত্নতাত্ত্বিক লাইনের মতো দেখায়, তাই আমি অনুমান করি যে আপনি সহনশীলতার মানটি ব্যবহার করতে পারেন থিয়েটটি প্রত্নসম্পদ এড়ানোর জন্য যথেষ্ট তবে বড় বহুভুজনকে প্রভাবিত করে না।
রেডাক্সজু

5

একটি বিকল্প হ'ল বহুভুজের ক্ষেত্রফলের দৈর্ঘ্যটি দীর্ঘতম রেখার সাথে অনুপাত ব্যবহার করা হবে যা এর লম্বগুলি ব্যবহার করে আঁকতে পারে। দীর্ঘ সংকীর্ণ বহুভুজ সনাক্তকরণ।

select * from polygons where ST_Length(ST_LongestLine(geom, geom)) < ST_Area(geom) * 4

এটি স্লিভার বহুভুজগুলির জন্য বেশ ভাল কাজ করে। আপনার প্রয়োজনীয়তা এবং অভিক্ষেপ অনুসারে আপনি কোনটি অনুপাত (আপনি অঞ্চলটি কী দিয়ে গুণান) ঠিক করতে পারেন।


1

দেখে মনে হচ্ছে এটি আপনার ব্যবহারের সাথে মেলে: নির্বাচিত বহুভুজগুলি বাদ দিন

ইনপুট লেয়ারের নির্বাচিত বহুভুজগুলি তাদের সাধারণ সীমানা মোছার মাধ্যমে নির্দিষ্ট সংলগ্ন বহুভুজগুলির সাথে একত্রিত করে। সংলগ্ন বহুভুজটি হয় বৃহত্তম বা ক্ষুদ্রতম অঞ্চল সহ এক হতে পারে বা বহুভুজের সাথে সবচেয়ে সাধারণ সাধারণ সীমানা ভাগ করে নেওয়া নির্মূল করা যায়।

এলিমিনেট সাধারণত স্লিভার বহুভুজগুলি, যেমন ক্ষুদ্র বহুভুজগুলি পরিত্রাণ পেতে ব্যবহার করা হয় যা বহুভুজ ছেদ প্রক্রিয়াগুলির ফলাফল যেখানে ইনপুটগুলির সীমানা সমান হয় তবে অভিন্ন নয়।

মনে হচ্ছে আপনি "বৃহত্তমতম সাধারণ সীমানা" বিকল্পটি চেষ্টা করতে চান।


আমি বুঝতে পেরেছি আপনি এখন কুইগিস সলিউশন নয় পোস্টগিস সলিউশন চাইছেন। আমার ক্ষমাপ্রার্থনা, আমি মনে করি না পোস্টজিসের একটি সমতুল্য কার্যকারিতা রয়েছে তবে আমি এটি উত্তরসূরির জন্য ছেড়ে দেব।
এফগ্রিগ

0

পোস্টজিআইএস টপোলজি এক্সটেনশনের জন্য এটি আমার কাছে নিখুঁত ব্যবহারের মতো দেখাচ্ছে । টপোলজির সহনশীলতা প্যারামিটারটি নির্ধারণ করবে যে আপনি উত্সকে অন্যান্য তথ্যের বহুগুণগুলিতে স্ন্যাপ করতে, উত্সের তথ্যের স্বল্প নির্ভুলতার সাথে মোকাবিলা করতে এবং এটি পরিষ্কার করার অনুমতি দিচ্ছেন।

সংক্ষেপে, কৌশলটি হ'ল:

1. টপোলজি এক্সটেনশন সক্ষম করুন

CREATE EXTENSION postgis_topology;

2. একটি নতুন খালি টপোলজি তৈরি করুন

SELECT topology.CreateTopology('neighborhoods_topo', 4326, 1e-7);

তৃতীয় প্যারামিটার হ'ল সিআরএসের এককগুলিতে সহনশীলতা; এটি বিজ্ঞতার সাথে চয়ন করুন। আদর্শভাবে, আপনি এমন একটি সিআরএস চান যেখানে ইউনিট মিটার। সিআরএস ইউনিট যদি মিটার না হয় তবে ডাব্লুজিএস ৮৮ ওরফে ST_Transform৪৩2626 এর মতো, আপনার বহুভুজগুলি পুনরায় প্রসারণ করতে ব্যবহার করুন ।

৩. বহুভুজ টেবিলটিতে একটি শীর্ষস্থানীয় জ্যামিতি কলাম যুক্ত করুন

SELECT topology.AddTopoGeometryColumn('neighborhoods_topo', 'public', 'neighborhoods', 'topogeom', 'POLYGON');

এটি একটি নতুন ফেরত layer_id। এটি সংরক্ষণ করুন, এটি পরে প্রয়োজন হবে। 1আপনার স্তরটি স্ক্র্যাচ থেকে শুরু হয়ে গেলে এবং প্রতিটি নতুন কল এ বাড়ানো থাকলে এটি স্তর হবে ।

৪) টপোলজিতে সমস্ত বহুভুজ যুক্ত করুন

UPDATE public.neighborhoods
SET topogeom = topology.toTopoGeom(geom, 'neighborhoods_topo', 1, 1e-7);

এটি একটি বড় ডেটাসেটের জন্য কয়েক ঘন্টা সময় নিতে পারে, ধৈর্য ধরুন। 1স্তর_আইডি ফিরে এসেছে।

৫. বেশ কয়েকটি পাড়াতে উপস্থিত মুখগুলি সন্ধান করুন

টপোলজি থেকে 2 বা ততোধিক টপোজোমেট্রিতে উপস্থিত সমস্ত মুখগুলি সন্ধান করুন। আমি কোয়েরিটি অনুশীলন হিসাবে ছেড়ে দেব। খুব সহজেই GetTopoGeomElementsফাংশনটির সাথে রয়েছে, তারপরে ফেস আইডির মাধ্যমে গ্রুপ করুন এবং 2 বা তার বেশি সংখ্যক গণনা সহ এগুলি দেখুন। বিকল্পভাবে, আপনি টপোজোম কলাম থেকে পরিষ্কার জ্যামিতি দিয়ে একটি নতুন টেবিল তৈরি করতে পারেন, এটি কেবল স্ট্যান্ডার্ড জ্যামিতিতে ফেলে দিতে পারেন topogeom::geometryএবং আপনার ইতিমধ্যে যা আছে তা পুনরাবৃত্তি করতে পারেন, তবে এখন স্লিভার ওভারল্যাপ ছাড়াই একটি পরিষ্কার ডেটাসেট দিয়ে।

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