অন্যের বহুভুজের মধ্যে একটি শেপফাইলে বহুভুজের শতাংশ


13

আমি একজন নবাগত, ক্ষমা চাইছি যদি এটি স্পষ্ট হয় / ইতিমধ্যে জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে তবে আমি কিছুই খুঁজে পাই না।

আমার দুটি শেফফাইল রয়েছে: ১. যুক্তরাজ্যের একটি কাউন্টির একটি প্রশাসনিক সীমানা স্তর যা এলএসওএ সীমানা হিসাবে পরিচিত, এটিতে ৫০০ টি ছোট অঞ্চল রয়েছে একটি বন্যার অঞ্চল।

আদর্শভাবে আমি বন্যা অঞ্চলের মধ্যে ছোট এলএসওএ অঞ্চলগুলির মধ্যে কোনটি ≥50% এর মধ্যে খুঁজে পেতে চাই এবং 500 টি এলএসওএ অঞ্চলের প্রত্যেকটির জন্য হ্যাঁ / না বা 1/0 দিয়ে শেষ হয়।

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

আমি মনে করি এটি একটি এসকিউএল সমস্যা তবে আমি জানি না। আমি কিউজিআইএস-এ নতুন এবং পোস্টগ্র্রেএসকিউএল কখনও ব্যবহার করি নি।

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে। আপনার সুদৃশ্য লোকেরা আমাকে সাহায্য করার জন্য যা প্রয়োজন তা আমি সরবরাহ করতে পারি।

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

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

উত্তর:


12

এটি কিউজিআইএস-এ অন্তর্ভুক্ত জিওপ্রসেসিং সরঞ্জামগুলি ব্যবহার করে তুলনামূলক সহজ কাজ।

  1. আপনার এলএসওএ অঞ্চলগুলির অঞ্চল গণনা করুন।

    • LSOA স্তর বৈশিষ্ট্য সারণীটি খুলুন।
    • সম্পাদনা মোড সক্ষম করুন।
    • ক্ষেত্র ক্যালকুলেটর খুলুন।
    • "$ অঞ্চল" এক্সপ্রেশন দিয়ে "দশমিক সংখ্যা (বাস্তব)" টাইপের একটি নতুন ক্ষেত্র তৈরি করুন।
    • সম্পাদনা মোড অক্ষম করুন (সম্পাদনাগুলি সংরক্ষণ করে)।
  2. বন্যা অঞ্চল স্তরটিকে একক একাধিক অংশ বৈশিষ্ট্যে মার্জ করুন।

    • Vector > Geometry Tools > Singleparts to Multipart
    • ইউনিক আইডি ক্ষেত্রের জন্য "--- সমস্ত মার্জ করুন ---" নির্বাচন করুন।
  3. মাল্টিপার্ট বন্যা জোন স্তরটি দিয়ে এলএসওএ জোন স্তরটি ছেদ করুন।

    • Vector > Geoprocessing Tools > Intersect
    • ইনপুট স্তর হ'ল এলএসওএ অঞ্চল, ছেদ স্তরটি বন্যার অঞ্চল।
  4. ফলস্বরূপ স্তরটি এলএসওএ অঞ্চলগুলির অংশ হবে (এলএসওএ অঞ্চল স্তর থেকে বৈশিষ্ট্য সহ) যা বন্যার জোনের স্তরটির সাথে ওভারল্যাপ হয়ে গেছে। বন্যার জোনের মধ্যে প্রতিটি এলএসওএ জোনের অনুপাত গণনা করতে:

    • ছেদ করা বৈশিষ্ট্যগুলির ক্ষেত্রফল গণনা করুন (# 1 ধাপ হিসাবে) then
    • ছেদকৃত অঞ্চল দিয়ে মূল (মোট) ক্ষেত্রটি ভাগ করে অন্য ক্ষেত্র যুক্ত করুন। ফলাফলটি 0 এবং 1 এর মধ্যে দশমিক হয় 1 শতাংশ দিতে 100 দ্বারা গুণ করুন।
  5. উভয় স্তর দ্বারা ভাগ করা অনন্য আইডি ব্যবহার করে মূল এলএসওএ স্তরটিকে ছেদ করা স্তরে যোগদান করুন।

  6. যুক্ত লেয়ারটিকে নতুন শেফফাইল হিসাবে রফতানি করুন।

  7. সদৃশ বৈশিষ্ট্য মুছুন।

এট ভয়েইল!

পদক্ষেপ # 2 ব্যতীত প্রতিটি এলএসওএ বৈশিষ্ট্যের জন্য পৃথক পৃথক বন্যা অঞ্চল বৈশিষ্ট্যের জন্য পৃথক বৈশিষ্ট্য তৈরি করা হবে। আপনি সম্ভবত প্রতিটি এলএসওএ জোনের মোট কভারেজের বিষয়ে আগ্রহী হলে এটি সম্ভবত আপনি চান না। আপনি যদি ফ্লুভিয়াল / জোয়ার / প্লুওয়াল বন্যার মধ্যে পার্থক্য করতে চান (এবং বন্যার জোনার ডেটা এটি সমর্থন করে), আপনি "টিওয়াইপিই" ক্ষেত্রটিকে ইউনিক আইডি ক্ষেত্র হিসাবে উল্লেখ করে একক অংশকে রূপান্তর করতে পারেন।


আপনার সাহায্যের জন্য ধন্যবাদ! অনেক প্রশংসিত. তবে আমার কিছুটা সমস্যা হচ্ছে। আমি পদক্ষেপগুলি অনুসরণ করেছি। পদক্ষেপ 3, ছেদটি সম্পূর্ণ করতে 10 ঘন্টা সময় নিয়েছে এবং এটি শেষ হয়ে গেলে আমার কাছে খালি শেফফাইল ছিল: i.imgur.com/QIM6Gtg.png এমন কিছু আছে যা আমি মিস করেছি? আমি প্রক্রিয়াটি শেষ করার এবং চতুর্থ পদক্ষেপ করার চেষ্টা করেছি তবে ছেদটি অঞ্চল গণনা করার জন্য কোনও ডেটা নেই।
কেজেগারবট

এর আগে বন্যা স্তরগুলির সাথে ছেদগুলি করতে আমার সমস্যা হয়েছিল। বৈশিষ্ট্যগুলি বড় এবং জটিল। অতীতে আমি যেভাবে এর আশেপাশে কাজ করেছি তা হ'ল তাদের ছোট বৈশিষ্ট্যগুলিতে বিভক্ত করা, যাতে স্থানিক সূচক আরও কাজ করতে পারে। এটি করার জন্য, বন্যা স্তর ( Vector > Research Tools > Vector Grid... Output grid as polygons) এর সমান পরিমাণে একটি ভেক্টর গ্রিড তৈরি করুন , তারপরে বন্যা স্তর দিয়ে গ্রিডটি ছেদ করুন। তারপরে ৩ য় ধাপে প্লাবন স্তরটির পরিবর্তে আউটপুটটি ব্যবহার করুন I'm আমি অনুমান করছি যে স্তরটি খালি ছিল কারণ এটি ক্র্যাশ হয়েছিল।
স্নোরফলোরপাগাস

আবার ধন্যবাদ. এখন একমাত্র সমস্যা হ'ল প্রতিবার আমি ভেক্টর গ্রিড তৈরি করার চেষ্টা করার সময় কিউজিআইএস ক্র্যাশ হয়। আমি এখান থেকে পরামর্শ অনুসরণ করেছি কিন্তু এটি প্রতিবার ক্রাশ হয়। আমি একাধিকবার প্যারামিটারগুলি পরিবর্তন করেছি এবং আমার সম্পূর্ণ প্রকল্প ফাইলটি খোলার পরিবর্তে কেবল বন্যার জোনের শেফফিল ব্যবহার করার চেষ্টা করেছি এবং এটি প্রতিবার ব্যর্থ হয়। কোন ধারনা? ! স্ক্রিনশট এখানে
কেজেগারবট

আপনার নির্দিষ্ট করা X এবং Y প্যারামিটারগুলি অনেক ছোট। 1000 x 1000 এর মতো কিছু চেষ্টা করুন You আপনি এমনকি একাধিকবার এটি করতে পারেন, অর্থাত প্রথমে 5000 x 5000 করতে পারেন, 500 x 500 তৈরি করতে আউটপুটটি ব্যবহার করুন related
স্নোরফালোরপ্যাগাস

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

6

আপনি স্থানিক এবং কিছু স্থানিক এসকিউএল ফাংশন ব্যবহার করতে পারেন।

Select t1.geometry, t1.ID, area(t1.geometry), area(t2.geometry) ...... (anything you need to have in the table results)

(area(intersection(t1.geometry,t2.geometry))) as "Commun_AREA"

, ("Commun_AREA"*100/(area(t1.geometry))) as "Percent_AREA"

From lsoa as t1, flood_zone as t2

Where Intersects( t1.geometry,t2.geometry ) = 1

3

এটি এমন কিছুর মতো মনে হচ্ছে যা জমা দেওয়া উত্তরগুলির চেয়ে অনেক সহজ করা যায়। আমি ব্যক্তিগতভাবে একটি সাধারণ অজগর স্ক্রিপ্ট ব্যবহার করব:

floodName = "the layer name here"
boundryName = "the layer name here"
fieldName = "the name of the field to contain the output 1/0"
minCoverage = 0.5 # the minimum amount of area covered to write 1
updateMap = [] # this will store values to be written    

# get layers
floodLayer = QgsMapLayerRegistry.instance().mapLayersByName(floodName)[0]
boundryLayer = QgsMapLayerRegistry.instance().mapLayersByName(boundryName)[0]
fieldIndex = boundryLayer.dataProvider().fieldNameIndex(fieldName)    

# iterate through boundries
for b in boundryLayer.getFeatures():
    # get only flood features that intersect with this feature's bounding box
    # this will make the script go way faster than it would otherwise
    request = QgsFeatureRequest().setFilterRect(b.geometry().boundingBox())
    floodGeom = geometry()
    floodFeat = QgsFeature()
    iter = floodLayer.getFeatures(request)
    iter.nextFeature(feat)
    while iter.nextFeature(feat):
        floodGeom = floodGeom.combine(feat.geometry())
    intersectGeom = b.geometry().intersection(feat.geometry())
    if intersectGeom.area() > minCoverage * b.geometry().area():
        updateMap[b.id()] = {fieldIndex : 1}
    else:
        updateMap[b.id()] = {fieldIndex : 0}

boundryLayer.dataProvider().changeAttributeValues(updateMap)

এটি কেবল বন্যার বহুভুজকে মূল্যায়ন করে যা প্রতিটি সীমানা স্তরের সীমানা বাক্সের সাথে ছেদ করে তাই এটি চালানো মোটামুটি দ্রুত হওয়া উচিত, তবে এটি কেবলমাত্র বিদ্যমান স্তরে একটি ক্ষেত্র আপডেট করে (সম্পূর্ণ নতুন স্তর তৈরির ও জটিল মানগুলির অনুলিপি করার জটিল ক্রিয়াকলাপের পরিবর্তে) তারপরে মুছে ফেলা হচ্ছে)


2

পদক্ষেপ 3 এ "ইন্টারসেক্ট" পদ্ধতিটি ব্যবহার করে স্নারফালোরপাগাসের নির্দেশনা অনুসরণ করে কেজে-তে আমার একই সমস্যা হয়েছিল এটি গণনা করতে বেশ খানিকটা সময় নিয়েছিল এবং আমার কাছে যা ছিল তা ফাঁকা ছিল।

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

এটি প্রযুক্তিগতভাবে যা আপনি চেয়েছিলেন তার বিপরীত। তবে সেখান থেকে বন্যার অঞ্চলটি কীভাবে আচ্ছাদিত তা পেতে প্রতিটি মান 1 থেকে বিয়োগ করার বিষয় ।

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