সেন্ট্রয়েডগুলি তাদের বহুভুজগুলিতে নির্ধারণ করুন এবং সরান


9

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


1
দুটি প্রশ্নের মতো মনে হচ্ছে। যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি (ক) বহুভুজের অভ্যন্তরে এলোমেলো পয়েন্ট যুক্ত করতে চান এবং (খ) এটিকে বা বহুভুজের একটি অনন্য আইডি দিতে পারেন। (ক) সবচেয়ে সাধারণ যে বিষয়টি মনে আসে তা হ'ল কিউজিআইএস-এ বিদ্যমান র্যান্ডম পয়েন্ট ক্ষমতাগুলি ব্যবহার করা এবং তারপরে কেবলমাত্র আপনার বহুভুজের সাহায্যে সেই বিন্দু মেঘকে ছেদ করা।
lynxlynxlynx

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

জ্যামিতি সরঞ্জামগুলির অধীনে fTools 'সত্য সেন্ট্রয়েড' সরঞ্জামটি ব্যবহার করুন - ডকস.কিগিস.আর.এইচটিএমএল
স্পেন

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

2
এটি কি এখন gis.stackexchange.com/Qestions/50029/… এর সদৃশ ?
underdark

উত্তর:


7

আপনি শেপলি পাইথন লাইব্রেরিটি ব্যবহার করতে পারেন, এটি এমন একটি ফাংশন সরবরাহ করে যা representative_point()বহুভুজের মধ্যে শুয়ে থাকার গ্যারান্টিযুক্ত।

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

অ্যালগরিদম যে পয়েন্টগুলি পাওয়া গেছে তার উদাহরণ এখানে:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()

আমি এটি পরীক্ষা করার চেষ্টা করছি, ঠিক আমি যা খুঁজছিলাম তা মনে হচ্ছে। আমি এটি চালানোর সাথে সাথে আপনাকে জানাব!
umbe1987

"এটির স্ট্রিং টাইপ হওয়া উচিত এবং এটি যথেষ্ট দীর্ঘ (30 টি অক্ষর) হওয়া উচিত" এর সাথে আপনার অর্থটি কী তা আমি জানতে পারি নি। এই গ্রন্থাগারটি বহুভুজ শিপফাইলে সরাসরি কাজ করছে? যদি তা হয়, তবে আমি অন্তত 30 টি চরিত্রের সাথে অ্যাট ট্যাবে একটি নতুন স্ট্রিং ধরণের ক্ষেত্র তৈরি করার কথা বলছি, এবং এটিই কি আপডেট হবে?
umbe1987

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

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

1
এটি পুরোপুরি কাজ করেছে !!! আমি কল্পনা করি যে স্থানাঙ্কগুলি লেয়ারের সমন্বয় ব্যবস্থা অনুসারে লেখা হয়েছে এবং আমি যদি পয়েন্টগুলি পেতে চাই তবে আমার এই সমন্বয়কারীদের সাথে একটি shp তৈরি করা দরকার, তাই না? আপনি এখানে থাকলে আমি আপনাকে কমপক্ষে 3 টি বিয়ার সরবরাহ করতাম! আপনার প্রচেষ্টার জন্য আপনাকে অনেক ধন্যবাদ !!!
umbe1987

5

ফটোলস সেন্ট্রয়েড সরঞ্জামটি সেন্ট্রয়েডকে বহুভুজের বাইরে রাখে যদি এটি অবতল থাকে।

ST_PointOnSurfaceআপনি যা চান তা অবশ্যই করবেন আপনি পোস্টজিআইএস-এ নিজের শেপফিলটি পেতে এসপিআইটি ব্যবহার করে ইনস্টল করে রেখেছেন এবং তারপরে কোয়েরিটি চালানোর জন্য পিজিকিউয়ারি প্লাগইন ব্যবহার করে আপনি কিউজিআইএসের ভিতরে থেকে কমান্ডটি ব্যবহার করতে পারেন।

অন্যথা, যদি PostGIS ইনস্টল একটু অনেক একটি এককালীন ব্যবহারের জন্য, আপনি ব্যবহার করতে পারে Spatialite QGIS থেকে। তারপরে আপনি স্পিটালাইটিতে আপনার ডেটা আমদানি করতে এবং ক্যোয়ারি (স্প্যাটালালাইট অনার্স ST_PointOnSurface) চালানোর জন্য কিউস্প্যাটিয়ালাইট প্লাগইন ব্যবহার করতে পারেন ।


2

যখন আমি আপনাকে সঠিকভাবে বুঝতে পারি, ব্যবহার করুন: ভেক্টর-> গবেষণা সরঞ্জাম_> র্যান্ডম পয়েন্ট। এখন "স্ট্র্যাটেইড স্যাম্পলিং ডিজাইন (স্বতন্ত্র বহুভুজ)" এর অধীনে নির্বাচন করুন ইনপুট ক্ষেত্র থেকে মান ব্যবহার করুন এবং অ্যাপোরিয়াইট ক্ষেত্র ব্যবহার করুন, যা প্রতিটি পৃথক বহুভুজের জন্য উত্পন্ন হওয়া পয়েন্টগুলির সংখ্যাসূচক মান দেয় which


"উপযুক্ত ক্ষেত্র" বলতে আপনার অর্থ কী? আমি সেন্ট্রয়েড ব্যবহার করার কথা ভাবছিলাম এবং তারপরে এটি বহুভুজটির নিকটতম অংশের সাথে লিঙ্ক করে যা এটি উল্লেখ করে, যদি এটি বাহ্যরেখার বাইরে থাকে তবে (উদাহরণস্বরূপ) তার বিন্দুটির নূন্যতম দূরত্বটি তার নিকটতম বহুভুজ পর্যন্ত গণনা করে। এরপরে উদ্দেশ্যটি হ'ল পয়েন্টটি স্থিতিস্থাপকগুলি বহুভুজের স্বতন্ত্র নির্দিষ্ট পরিচয় কোড হিসাবে ব্যবহার করার জন্য সেগুলি স্থগিত করা।
umbe1987

মূলত আমি যা করার চেষ্টা করছি তা হ'ল প্রতিটি সেন্ট্রয়েডকে এর তুলনামূলক বহুভুজের কাছে নির্ধারণ করা এবং এটিকে বহুভুজের অভ্যন্তরে শুইয়ে দেওয়া (বা কমপক্ষে তার সীমানাটি স্পর্শ করার জন্য)।
umbe1987

@ ব্যবহারকারী 9518: দুঃখিত, আমি আপনার প্রশ্নটি ভুল বুঝেছি। আমি ভেবেছিলাম আপনি প্রতিটি পলির মধ্যে একটি নির্দিষ্ট সংখ্যক এলোমেলো পয়েন্ট চান, উদাহরণস্বরূপ 2 পয়েন্ট fpr পলি 1, পলি 2 এর মধ্যে 10 পয়েন্ট ইত্যাদি তাই "উপযুক্ত ক্ষেত্র" শব্দটি। অবশ্যই প্রতিটি পলির জন্য কেবল একটি পয়েন্ট উত্পন্ন করতে আপনি "এই সংখ্যার পয়েন্ট ব্যবহার করুন" এর জন্য 1 টি নির্বাচন করতে পারেন। এই বিন্দুটি পলির ভিতরে বা কমপক্ষে তার সীমানাটিকে স্পর্শ করে। তবে এই বিন্দুটি এখনও এলোমেলোভাবে পাওয়া যায়, তাই আপনি যখন পদ্ধতিটি পুনরায় করেন তখন আপনি অন্যান্য পয়েন্টগুলি পান :-(
কার্ট

1

রিয়েলসেন্ট্রয়েডস প্লাগইন, প্লাগইনগুলির মাধ্যমে ইনস্টল করার জন্য উপলব্ধ> প্লাগইনগুলি পরিচালনা করুন এবং ইনস্টল করুন কিউআইজিআইএস ২.২ এ আমার জন্য সেন্ট্রয়েড-জাতীয় পয়েন্ট তৈরি করতে কাজ করেছে, অবতল থাকলে প্রতিটি বহুভুজের ভিতরে বাধ্য করা হয়েছে (পয়েন্টটি প্রান্তের খুব কাছেই থাকবে) lie আমি কুর্টের পরামর্শ অনুসারে র্যান্ডম পয়েন্টস সরঞ্জামটি চেষ্টা করেছি এবং যদিও আমি বহুভুজ প্রতি 1 পয়েন্ট নির্দিষ্ট করেছি, এটি পরিবর্তে দুটি উত্পন্ন করে। একটি অতিরিক্ত অসুবিধা হ'ল বেশিরভাগ ক্ষেত্রে, পয়েন্টগুলি এলোমেলো হওয়ায় সেন্ট্রয়েডকে উপস্থাপন করে না।

http://www.agt.bme.hu/gis/qgis/realcentroid/

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