অলিগ এবং পাইথন ব্যবহার করে বহুভুজের মধ্যে পয়েন্ট (একটি লাস্টারিংয়ের)


10

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

তবে এটি একটি শেফফিলের জন্য ভাল। তবে, এখন আমার বিভিন্ন আকারের ফাইল থেকে একটি বড় নেটওয়ার্কেক্স গ্রাফের সাথে সংযোগ স্থাপন করা দরকার। সুতরাং উদাহরণস্বরূপ, যদি একটি বিন্দু বহুভুজের মধ্যে থাকে তবে আমি এটি সংযোগ করব (এটি সংযোগের মাধ্যমে আমি একটি নেটওয়ার্কএক্স প্রান্ত যুক্ত করব - অ্যাড_জেজ (জি.গেটপয়েন্ট (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)

ইঙ্গিতগুলির জন্য ধন্যবাদ পাওলো এবং ক্রিস

উত্তর:


11

শেপলি শীতল এবং মার্জিত, তবে কেন তার স্থানিক অপারেটরগুলি (ওজিআর জ্যামিতি শ্রেণিতে) সাথে এখনও ওগর ব্যবহার করছে না?

কোডের উদাহরণ:

from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
polyshp = driver.Open('/home/pcorti/data/shapefile/multipoly.shp')
polylyr = polyshp.GetLayer(0)
pointshp = driver.Open('/home/pcorti/data/shapefile/point.shp')
pointlyr = pointshp.GetLayer(0)
point = pointlyr.GetNextFeature()
polygon = polylyr.GetNextFeature()
point_geom = point.GetGeometryRef()
polygon_geom = polygon.GetGeometryRef()
print point_geom.Within(polygon_geom)

নোট করুন যে আপনাকে জিইওএস সমর্থন দিয়ে জিডিএল সংকলন করতে হবে।


গ্রিজি পাওলো, তবে আমার যা দরকার তা হ'ল একটি পয়েন্টের অবজেক্টের রেফারেন্সকে বহুভুজের একটির সাথে তুলনা করা নয়, বরং একটি লাইনস্ট্রিংয়ের সর্বশেষ এবং প্রথম পয়েন্টের সাথে তুলনা করা, যা আমি বর্তমানে গেটপয়েন্টের সাথে অ্যাক্সেস করছি। আমি লক্ষ্য করেছি এমন কোনও গেটপয়েন্টআরফ নেই। আমি কীভাবে এটি বাস্তবায়ন করতে যাব?
ব্যবহারকারী 39901230

1
লাইনস্ট্রিং পয়েন্টের একটি পুনরাবৃত্তিযোগ্য জ্যামিতি সংগ্রহ (ভারটেক্স), আপনি সহজেই তাদের প্রথম এবং শেষটি অ্যাক্সেস করতে পারেন।
ক্যাপুটি

বহুভুজ অবজেক্টগুলিকে একটি তালিকায় রাখার চেষ্টা করেছি যা পরে আমি একটি লাইনস্ট্রিংয়ের প্রথম এবং শেষ পয়েন্টের বিরুদ্ধে পরীক্ষা করতে ব্যবহার করব। তবে কোনও কারণে বহুভুজের মধ্যে পয়েন্টের তালিকায় কোনও পয়েন্ট যুক্ত করা হয়নি: এখানে একবার দেখুন: codepad.org/Cm2BV5mp
ব্যবহারকারী 39901230

8

আমি networkx সাথে পরিচিত নই কিন্তু আমি যদি সঠিকভাবে আপনার প্রশ্ন বুঝতে, আপনি ব্যবহার করতে পারে সুঠাম এবং OGR liberal এর সংক্ষিপ্ত রূপ shapefile থেকে বহুভুজ পয়েন্ট খোঁজার জন্য। একটি বিন্দু (2000,1200) যদি কোনও শেপফাইল থেকে কোনও বহুভুজ ব্যর্থ হয় তবে এটি সন্ধানের জন্য এটি কীভাবে কাজ করে তা এখানে একটি উদাহরণ রয়েছে। ফলাফলের জন্য, এটি সেই বহুভুজের স্থানাঙ্কগুলি মুদ্রণ করে।

from shapely.geometry import Point, Polygon
from shapely.wkb import loads
from osgeo import ogr

file1 = ogr.Open("d:\\fileWithData.shp")
layer1 = file1.GetLayerByName("fileWithData")

point1 = Point(2000,1200)

polygon1 = layer1.GetNextFeature()

while polygon1 is not None:
    geomPolygon = loads(polygon1.GetGeometryRef().ExportToWkb())
    if geomPolygon.contains(point1):
        xList,yList = geomPolygon.exterior.xy
        print xList
        print yList
    polygon1 = layer1.GetNextFeature()

আমি আসা করি এটা সাহায্য করবে.

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