প্রোগ্রামিয়ালি বহুভুজগুলি সন্ধান করুন যা> 90% অন্য ভেক্টর বহুভুজ স্তর দ্বারা কিউজিআইএস ব্যবহার করে ওভারল্যাপ করা হয়?


9

উদাহরণ স্তর

আমি অন্য ভেক্টর দ্বারা> 90% দ্বারা ওভারল্যাপ করা একটি ভেক্টরে বহুভুজগুলি বের করার জন্য কীভাবে পাইথন ব্যবহার করতে হবে তা জানার চেষ্টা করছি। আমি তখন একটি ভেক্টর / মানচিত্র রাখতে চাই যা কেবলমাত্র সেই বহুভুজগুলি দেখায়। উদাহরণের চিত্রটি আমার স্তরগুলি দেখায়। আমি 90% লাল সব ধূসর বহুভুজ চাই।

অজগর (বা অনুরূপভাবে স্বয়ংক্রিয় পদ্ধতি) এর মাধ্যমে আমার এগুলি করা দরকার। একইভাবে প্রক্রিয়া করার জন্য আমার কাছে 1000 ডলার মানচিত্র রয়েছে।


আপনি কোনও ওভারলে 'ইউনিয়ন' করতে চান ( কিছু বেসিকের জন্য infogeoblog.wordpress.com/2013/01/08/geo-processing-in-qgis দেখুন ) তারপরে প্রতিটি আসল বহুভুজের জন্য 'ইন' পরিসংখ্যান এবং 'আউট' পরিসংখ্যান গণনা করুন ওভারলে শতাংশ নির্ধারণ করার জন্য gis.stackexchange.com/questions/43037/… ... ইঙ্গিত: আপনার এলাকা পরিমাপ করা দরকার gis.stackexchange.com/questions/23355/…
মাইকেল

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

অজগর ছাড়া এটি সম্ভব বলে আমি মনে করি। আপনার কি অলস অজগর দরকার বা ভার্চুয়াল স্তরগুলির সাথে সমাধান আপনার পক্ষে ভাল?
পিয়ারমা

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

1
পিয়ারমা - বহুভুজগুলি খুঁজে পেতে আমার কেবল একটি স্বয়ংক্রিয় পদ্ধতি দরকার need
30:25 '

উত্তর:


3

পরবর্তী কোডটি কিউজিআইএসের আমার পাইথন কনসোলে কাজ করে। এটি বহুভুজ সহ একটি মেমরি স্তর উত্পাদন করে যা> 90% লাল অঞ্চল দ্বারা ওভারল্যাপ করা হয়।

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for polygon_intersects
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for xwRcl
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

for i, feat1 in enumerate(feats_lyr1):
    area1 = 0
    area2 = 0
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area = feat1.geometry().intersection(feat2.geometry()).area()
            print i, j, area, feat2.attribute('class')
            if feat2.attribute('class') == 1:
                area1 += area
            else:
                area2 += area
    crit = area1/(area1 + area2)
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

আমি এই দুটি ভেক্টর স্তর সহ কোডটি চেষ্টা করেছিলাম:

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

QGIS এর পাইথন কনসোল এ কোড চলমান, ফলাফল প্রতিপাদক জন্য পরে, ইনডেক্স মুদ্রিত হয়েছিল আমি জড়িত বৈশিষ্ট্য, ছেদ এলাকায়, এ মাঠের গুণাবলীর ঞ polygons_intersects (লাল এলাকায় জন্য 1 এবং 2 ধূসর এলাকায় জন্য) এবং ওভারল্যাপিং নির্ণায়ক ।

0 0 9454207.56892 1
0 1 17429206.7906 2
0 2 10326705.2376 2
0 4 40775341.6814 1
0 5 26342803.0964 2
0 7 11875753.3216 2
0.432253120382
1 6 1198411.02558 2
1 7 1545489.96614 2
1 10 27511427.9909 1
0.90930850584
2 7 750262.940888 2
2 8 12012343.5859 1
0.941213972294
3 6 23321277.5158 2
0.0

তৈরি করা মেমরি স্তর (সবুজ বৈশিষ্ট্য) পরবর্তী চিত্রটিতে লক্ষ্য করা যায়। এটা প্রত্যাশা মত ছিল।

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


6

এখানে এমন একটি সমাধান রয়েছে যা পাইথনের প্রয়োজন হয় না।

একটি কোয়েরি সহ একটি নতুন ভার্চুয়াল স্তর যুক্ত করুন:

WITH r AS (
SELECT 
    Basins800.rowid AS idGray, 
    area(Basins800.geometry) AS areaGray, 
    area(Intersection(Basins800.geometry, Severity.geometry)) AS aeraInter, 
    Basins800.geometry AS geomGray 
  FROM Basins800, Severity
)

SELECT *, areaInterSum/areaGray  AS overlap , geomGray 
    FROM (
        SELECT 
           idGray, 
           areaGray, 
           sum(areaInter) AS areaInterSum, 
           geomGray 
        FROM r 
        GROUP BY idGray) 
     WHERE areaInterSum/areaGray > 0.9

সঙ্গে :

  • বেসিনস 800 আপনার স্তর হিসাবে আপনি ধূসর বহুভুজ দিয়ে ফিল্টার করতে চান

  • তীব্রতা: আপনার লাল স্তর ওভারল্যাপিং।

ফলাফলটি কেবলমাত্র ধূসর প্ললিগনগুলি> 90%% লাল বহুভুজ দ্বারা ওভারল্যাপ করা ওভারল্যাপ শতাংশযুক্ত একটি নতুন ক্ষেত্র সহ একটি নতুন স্তর হবে be

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

আশা করি এটি কাজ করে। প্রয়োজনে আমি ক্যোয়ারীতে আরও বিশদ যুক্ত করতে পারি।

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


আমি 'ভার্চুয়াল স্তর তৈরি করুন' বোতামের মাধ্যমে কোয়েরিটি চালানোর সময় আমি একটি ত্রুটি পাচ্ছি। "ক্রেটিট টেম্প ভিউতে ক্যোয়ার এক্সিকিউশন ত্রুটি _ এএস-এর সাথে পর্যালোচনা দেখুন (" .... এখানে কোডের বাকী অংশ ... তারপরে: "1 -" উইথের সাথে ": সিনট্যাক্স ত্রুটি" আমি কিউজিআইএসে মোটামুটি নতুন Can আপনার সাহায্যের জন্য programatically এই ভার্চুয়াল লেয়ার তৈরি ধন্যবাদ!
dnormous


দুঃখিত, ধূসর এবং ধূসর মধ্যে একটি খারাপ অনুলিপি (আমার aproximative ইংলিশের জন্য দুঃখিত)। আমি ক্যোয়ারীটি সম্পাদনা করেছি। এটি এখন কাজ করা উচিত। আপনি অগ্রগতিমূলকভাবে স্তরটি তৈরি করতে চান কেন? ভার্চুয়াল স্তরটির সুবিধা হ'ল এটি অ-ধ্বংসাত্মক এবং যদি আপনি আপনার ডেটা (ধূসর বা লাল বহুভুজ) সম্পাদনা করেন তবে ভার্চুয়াল স্তরটি স্বয়ংক্রিয়ভাবে আপডেট হবে।
পিয়ারমা

এটি প্রক্রিয়াটির কেবল একটি ছোট অংশ। আমার কাছে এই মানচিত্রগুলির মধ্যে ~ 1000 রয়েছে, সুতরাং স্বয়ংক্রিয়ভাবে প্রক্রিয়াটি অত্যন্ত সহায়ক হবে।
নির্ঘুম

আমি এখনও একই ত্রুটিটি পেয়ে যাচ্ছি -> "1 -" WITH এর কাছাকাছি: সিনট্যাক্স ত্রুটি "। আমি গ্রে লেয়ার এবং রেডলায়ারের জন্য প্রতিটি স্তরের স্থানীয় নাম প্লাগ করেছি। স্থানীয় নামটি কি আমার ব্যবহার করা উচিত? উদাহরণস্বরূপ: ধূসর স্তরটিকে "বেসিন_800" হিসাবে লেবেলযুক্ত, সুতরাং আমার কাছে "বেসিন_800. জ্যামিতি"

2

এইজন্য পরে লিংক থেকে তীব্রতা এবং Basins800 shapefiles, আমি প্রয়োজনীয় geoprocess বুঝতে পারে। আমি কোডটি এতে পরিবর্তন করেছি:

প্রোগ্রামিয়ালি বহুভুজগুলি সন্ধান করুন যা> 90% অন্য ভেক্টর বহুভুজ স্তর দ্বারা কিউজিআইএস ব্যবহার করে ওভারল্যাপ করা হয়?

এটি পাওয়ার জন্য:

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

#for Severity
feats_lyr1 = [ feat for feat in layers[0].getFeatures() ]

#for Basins800
feats_lyr2 = [ feat for feat in layers[1].getFeatures() ]

selected_feats = []

print "processing..."

for i, feat1 in enumerate(feats_lyr1):
    for j, feat2 in enumerate(feats_lyr2):
        if feat1.geometry().intersects(feat2.geometry()):
            area1 = feat1.geometry().intersection(feat2.geometry()).area()
            area2 = feat1.geometry().area()
            print i, j, area1, area2
    crit = area1/area2
    print crit
    if crit > 0.9:
        selected_feats.append(feat1)

epsg = layers[0].crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "mem_layer",
                           "memory")

prov = mem_layer.dataProvider()

for i, feat in enumerate(selected_feats):
    feat.setAttributes([i])

prov.addFeatures(selected_feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

কোডটি চালানোর পরে, কিজিজিআইএসের পাইথন কনসোলে এই শেফফিলগুলি সহ, কয়েক মিনিটের মধ্যে আমি পিয়েরার মতো একই ফলাফল পেয়েছি ; যেখানে মেমরি স্তরটির 31 টি বৈশিষ্ট্য রয়েছে (29 টি বহুভুজ তার দ্বারা পেয়েছেন) এর মধ্যে বিভিন্ন রয়েছে।

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

আমি ফলাফলগুলি ডিবাগ করতে যাচ্ছি না কারণ বৈশিষ্ট্যগুলির জন্য 1901 * 3528 = 6706728 ইন্টারঅ্যাকশন রয়েছে। তবে কোডটি আশাব্যঞ্জক মনে হচ্ছে।

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