আমি বর্তমানে এমন একটি প্রকল্পে কাজ করছি যেখানে আমি শেপফাইলে খুঁজে পাই এমন জ্যামিতি বৈশিষ্ট্যগুলির বাইরে আমার একটি টপোলজিকাল নেটওয়ার্ক তৈরি করা দরকার। এখনও অবধি বেন রিলির ওপেন সোর্স প্রকল্পটি ব্যবহার করে আমি লাইনস্ট্রিংগুলি নেটওয়ার্কেক্স প্রান্তগুলিতে রূপান্তরিত করতে, পাশাপাশি ঘনিষ্ঠ বৈশিষ্ট্যগুলি সনাক্ত করতে (অন্যান্য লাইনস্ট্রিংস বলে) সনাক্ত করে এবং নিকটস্থ বিন্দুতে যুক্ত করেছি যাতে আমি সংক্ষিপ্ততম পথ অ্যালগরিদম চালাতে পারি।
তবে এটি একটি শেফফিলের জন্য ভাল। তবে, এখন আমার বিভিন্ন আকারের ফাইল থেকে একটি বড় নেটওয়ার্কেক্স গ্রাফের সাথে সংযোগ স্থাপন করা দরকার। সুতরাং উদাহরণস্বরূপ, যদি একটি বিন্দু বহুভুজের মধ্যে থাকে তবে আমি এটি সংযোগ করব (এটি সংযোগের মাধ্যমে আমি একটি নেটওয়ার্কএক্স প্রান্ত যুক্ত করব - অ্যাড_জেজ (জি.গেটপয়েন্ট (1), জি.গেটপয়েন্ট (2)) পরের শেফফিলের পয়েন্টের সাথে একটি বহুভুজের মধ্যেও রয়েছে যা একটি অনুরূপ বৈশিষ্ট্য ভাগ করে (বলে, আইডি) that নোট করুন যে বিভিন্ন শিপগুলিতে বহুভুজগুলি কেবল একই আইডি ভাগ করে থাকে না স্থানাঙ্কগুলি। বহুভুজের মধ্যে যে পয়েন্টগুলি আসে সেগুলিও একই স্থানাঙ্কগুলি ভাগ করে না।
এই সমস্যার সমাধান করার জন্য আমার সমাধানটি হ'ল বহুভুজের মধ্যে থাকা বিন্দুটি চিহ্নিত করা, এটি সংরক্ষণ করা, পরবর্তী আইডিফাইলে পয়েন্টটি একই আইডির সাথে বহুভুতে বসবাস করে এবং তারপরে তাদের মধ্যে নেটওয়ার্কেক্স প্রান্ত যুক্ত করুন।
একটি বহুভুজের মধ্যে একটি বিন্দু থাকে কিনা তা কীভাবে আবিষ্কার করবেন? ওয়েল, একটি সুপরিচিত অ্যালগরিদম রয়েছে: রে কাস্টিং অ্যালগরিদ এটি করে। এটি হ'ল আমি আসলেই যদিও আটকে গিয়েছিলাম, কারণ অ্যালগরিদমটি বাস্তবায়নের জন্য আমার বহুভুজের স্থানাঙ্ক প্রয়োজন এবং ওজিআরের জ্যামিতির কোনও নথিপত্রের মাধ্যমে স্কিমিং করার পরেও কীভাবে এখনই তাদের অ্যাক্সেস করবেন তা জানেন না । সুতরাং, আমি যে প্রশ্নটি জিজ্ঞাসা করছি তা হল বহুভুজ পয়েন্টগুলি কীভাবে অ্যাক্সেস করা যায়, বা স্থানাঙ্কগুলি হয় বা কোনও বিন্দুটি বহুভুজের মধ্যে পড়ে কিনা তা সনাক্ত করার কোনও সহজ উপায় আছে? Osgeo.ogr লাইব্রেরি দিয়ে পাইথন ব্যবহার করে আমি নিম্নলিখিত কোডগুলি দিয়েছি:
if g.GetGeometryType() == 3: #polygon
c = g.GetDimension()
x = g.GetPointCount()
y = g.GetY()
z = g.GetZ()
আমার সমস্যাটি আরও ভাল করে বোঝার জন্য চিত্রটি দেখুন।
[সম্পাদনা] এখনও অবধি আমি সমস্ত বহুভুজ বস্তুকে একটি তালিকায় সংরক্ষণের চেষ্টা করেছি যার সাথে আমি লাইনস্ট্রিংয়ের প্রথম এবং শেষ পয়েন্টটি তুলনা করব । তবে পাওলোর উদাহরণটি পয়েন্ট অবজেক্ট রেফারেন্স এবং পলিগন অবজেক্ট রেফারেন্স ব্যবহারের সাথে সম্পর্কিত যা পুরো রেখাটি বহুভুজের মধ্যে নয় বরং তার লাইনস্ট্রিংয়ের প্রথম বা শেষ বিন্দুতে লাইন অবজেক্ট রেফারেন্সের সাথে কাজ করবে না ।
[EDIT3] লাইনস্ট্রিংয়ের প্রথম এবং শেষ পয়েন্টের স্থানাঙ্কগুলি থেকে একটি নতুন জ্যামিতি পয়েন্ট অবজেক্ট তৈরি করা এবং তারপরে একটি তালিকায় সংরক্ষিত বহুভুজ জ্যামিতি অবজেক্টগুলির সাথে তুলনা করার জন্য এটি ব্যবহার করা ঠিক সূক্ষ্ম বলে মনে হচ্ছে:
for findex in xrange(lyr.GetFeatureCount()):
f = lyr.GetFeature(findex)
flddata = getfieldinfo(lyr,f,fields)
g = f.geometry()
if g.GetGeometryType() == 2:
for j in xrange(g.GetPointCount()):
if j == 0 or j == g.GetPointCount():
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(g.Getx(j),g.GetY(j))
if point.Within(Network.polygons[x][0].GetGeometryRef()):
print g.GetPoint(j)