যেখানে ধারাটিতে ছেদকেন্দ্রের শতাংশ অঞ্চল গণনা করা হচ্ছে


15

পোস্টগ্রিসে আমার বহুভুজ (সেন্সাস ব্লক গ্রুপ) এর একটি টেবিল রয়েছে। আমি শহরের সাথে প্রতিটি ব্লক গ্রুপকে ট্যাগ করতে চাই (অন্য বহুভুজ টেবিল) এটি মূলত এর মধ্যে থাকে। এটা কি সম্ভব? আমি ভাবছি আমার অবশ্যই এমন কিছু তৈরি করতে হবে:

select b.*,t.name  
from blockgroups b, towns t  
where (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5  

তবে এই ক্যোয়ারীটি চিরদিনের জন্য নিচ্ছে (আমার প্রায় 5,000 টি ব্লক গ্রুপ এবং 375 টি শহর আছে ...)। এই ক্যোয়ারীটি ভুল হয়ে থাকলে একেবারেই কীভাবে কাজ করা যায় সে সম্পর্কে কোনও পরামর্শ, বা এটি সঠিক হলে দ্রুত হয়?


আপনি কি সর্বাধিক ওভারল্যাপের উপর ভিত্তি করে ব্লক গ্রুপগুলিতে ট্যাগ করতে চান? যদি তা হয় তবে এই উত্তরটি দেখুন । যদি আপনার 'শহরগুলি'ও আদমশুমারীর ভৌগলিক হয় (এমসিডি বা স্থানগুলি, বলুন) সম্ভবত ওভারল্যাপ শতাংশ গণনা করার দরকার নেই।
dbaston

উত্তর:


23

আপনি যেভাবে এটি করছেন তা কার্যকর হবে তবে এতে অনেক বেশি সময় লাগবে, যেহেতু পোস্টগ্রিস প্রতিটি "ব্লকগ্রুপ বনাম শহর" সংমিশ্রণের ছেদটি জ্যামিতি তৈরি করার চেষ্টা করছে, এমনকি তারা এমনকি স্পর্শ না করলেও।

দুটি জ্যামিতি বাধা আছে কিনা তা যাচাই করার জন্য আপনার WHERE ধারাটিতে অন্য শর্তের চেক যুক্ত করুন এবং এটি বিদ্যমান অবস্থার আগে রেখে দিন:

select b.*,t.name
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) and    
    (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5

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

এছাড়াও, নিশ্চিত করুন যে আপনার ব্লকগ্রুপস.উইকবি_জ্যামিতি এবং টাউনস। ডাব্লু বি বি জ্যামিতিতে স্পেসিয়াল ইনডেক্স রয়েছে।


1
যুক্ত করা ST_Intersectsএখানে যাওয়ার সঠিক উপায়, তবে পরিকল্পনাকারী তারা লিখিতভাবে শর্তটি কার্যকর করতে পারে বা নাও পারে। এই সম্পর্কে বিশদ জন্য পোস্টগ্র্রেস ডক্স দেখুন । ST_Intersectsএবং ST_Intersectionআমার ইনস্টল (100) এ একই ব্যয় করতে হবে, তাই সত্য বলতে আমি পরিকল্পনাকারী কী করছে তা নিশ্চিত নই, তবে এখানে সবসময় সঠিক কাজটি করা মনে হয়।
Dbaston

আহ ... আমি ধরে নিয়েছিলাম যে অন্যান্য ভাষার মতো শর্তগুলিও পরীক্ষা করা হবে। তবে আমার ধারণা এটি পরিকল্পনাকারীকে অন্য একটি বিকল্প দেয়।
আলেকজান্দ্রি

10

আলেকজান্দ্রির খুব দরকারী উত্তরে যুক্ত করা, যদি আপনার কিছু আদমশুমারি ইউনিট আপনার তিনটি শহরে বিস্তৃত হতে পারে (এবং তাই আপনি কোনও শহরে 50% এরও বেশি পতনের গ্যারান্টি দিতে পারবেন না) আপনি এটি করতে পারেন:

select distinct on (b.id)
b.*,t.name,
(st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) as proportion
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) 
order by b.id, proportion desc;

এটি মূলত নিম্নলিখিত পরিস্থিতির বিরুদ্ধে রক্ষা করে - যেখানে নীল অঞ্চলগুলি অদৃশ্য হয়ে যাবে: এখানে চিত্র বর্ণনা লিখুন


1
আমি সম্পূর্ণরূপে এটিকে উপাসনা করি যখন কোনও এসও উত্তরের সাথে আমার প্রথম সমস্যার মুখোমুখি হয় খুব পরের উত্তরের মাধ্যমে সমাধান হয়ে যায়। চিয়ার্স, @ রবিনএল!
wfgeo

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