পাইথনে দুটি বহুভুজ ছেদ করে কিনা?


19

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

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

আমি এমন একটি ফাংশন তৈরি করতে চাই যা এই দুটি বহুভুজকে ছেদ করে কিনা তা বোঝায় এমন একটি বুলিয়ান ফিরে আসবে।

দয়া করে মনে রাখবেন যে আমি arcpy, বা এর কোনও arcgisউপাদান ব্যবহার করতে পারি না ।

এটি করার জন্য আপনি কি একটি অ্যালগরিদম বা লাইব্রেরির পরামর্শ দিতে পারেন?

উত্তর:


42

আপনি সুন্দর চেষ্টা করতে পারেন ।

তারা স্থানিক সম্পর্কের বর্ণনা দেয় এবং এটি উইন্ডোতে কাজ করে

স্থানীয় ডেটা মডেলটি জ্যামিতিক বস্তুর মধ্যে রয়েছে একাধিক প্রাকৃতিক ভাষার সম্পর্কের সাথে - রয়েছে, ছেদ করে, ওভারল্যাপ করে, স্পর্শ ইত্যাদি - এবং তাদের উপাদান বিন্দু সেটগুলির পারস্পরিক ছেদগুলির 3x3 ম্যাট্রিক্স ব্যবহার করে তাদের বোঝার জন্য একটি তাত্ত্বিক কাঠামো রয়েছে

নিম্নলিখিত কোডটি দেখায় যে আপনি ছেদ করার জন্য কীভাবে পরীক্ষা করতে পারেন:

from shapely.geometry import Polygon
p1 = Polygon([(0,0), (1,1), (1,0)])
p2 = Polygon([(0,1), (1,0), (1,1)])
print(p1.intersects(p2))

15

আপনি এর জন্য জিডিএল / ওজিআর পাইথন বাইন্ডিং ব্যবহার করতে পারেন ।

from osgeo import ogr

wkt1 = "POLYGON ((1208064.271243039 624154.6783778917, 1208064.271243039 601260.9785661874, 1231345.9998651114 601260.9785661874, 1231345.9998651114 624154.6783778917, 1208064.271243039 624154.6783778917))"
wkt2 = "POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695, 1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528, 1199915.6662253144 633079.3410163528)))"

poly1 = ogr.CreateGeometryFromWkt(wkt1)
poly2 = ogr.CreateGeometryFromWkt(wkt2)

intersection = poly1.Intersection(poly2)

print intersection.ExportToWkt()

Noneতারা ছেদ না করলে এটি ফিরে আসে । যদি তারা ছেদ করে তবে এটি জ্যামিতিটি উভয় ছেদ করে returns

এছাড়াও আপনি জিডিএল / ওজিআর কুকবুক থেকে আরও ইনফোগুলি সন্ধান করতে পারেন ।


আমি এটি ব্যবহার করতে পছন্দ করব তবে আমি উইন্ডোতে রয়েছি এবং উভয় সিস্টেমে আমি চেষ্টা করেছি, পাইথন বাইন্ডিংগুলি কাজ করতে পারি না। আমি এই পোস্টে বর্ণিত সমস্যার মধ্যে দৌড়াচ্ছি
দেবদত্ত টেংশে

1
অন্য কেউ যদি এতে হোঁচট খায় তবে উইন্ডোতে পাইথনের সাথে জিডিএল / ওজিআর ব্যবহার করা সম্ভব (এবং আরকজিআইএস
এভিল জেনিয়াস

আপনি ছেদটি = বহুলিপিও লিখতে পারেন n আন্তঃসংযোগ (পলি 2) --- ছেদটির মান সত্য বা মিথ্যা হবে বহুভুজগুলি ছেদ করে কিনা তার উপর নির্ভর করে
সর্বোচ্চ

1

আপনি যদি জানতে বা আর শিখতে আগ্রহী হন তবে এর কিছু কার্যকর স্থানিক প্যাকেজ রয়েছে। http://cran.r-project.org/web/views/Spatial.html আর (আরপিআই *) এর সাথে ইন্টারঅ্যাক্ট করার জন্য পাইথন মডিউল রয়েছে


0

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

এটি ব্যবহার করা বেশ সহজ, আপনি এখানে যান!

উদাহরণ:

from collision import *
from collision import Vector as v

p0 = Concave_Poly(v(0,0), [v(-80,0), v(-20,20), v(0,80), v(20,20), v(80,0),  v(20,-20), v(0,-80), v(-20,-20)])
p1 = Concave_Poly(v(20,20), [v(-80,0), v(-20,20), v(0,80), v(20,20), v(80,0),  v(20,-20), v(0,-80), v(-20,-20)])

print(collide(p0,p1))

আপনি এটি একটি পুনঃস্থাপনা জেনার করতে পারেন, যার মধ্যে রয়েছে:

overlap (how much they overlap)
overlap vector (when subtracted from second shapes position, the shapes will no longer be colliding)
overlap vector normalized (vector direction of collision)
a in b (whether the first shape is fully inside the second)
b in a (whether the second shape is fully inside the first)

https://github.com/QwekoDev/collision


0

আপনি যদি স্তরটি জানতে চান তবে আপনি এটি ব্যবহার করতে পারেন। যুক্তি হিসাবে আপনি বহুভুজের একটি তালিকা দিতে পারেন। এবং ফেরতের মান হিসাবে আপনি স্তরগুলির একটি তালিকা পান get স্তরগুলির তালিকায় বহুভুজ রয়েছে।

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
def isPolygonInPolygon(poly1,poly2):
    poly2 = Polygon(poly2)
    for poi in poly1:
        poi = Point(poi)
        if(poly2.contains(poi)):
            return True

def polygonTransformHierarchy(polygon_list):
    polygon_list_hierarchy = []
    for polygon1 in polygon_list:
        level = 0
        for polygon2 in polygon_list:
            if(isPolygonInPolygon(polygon1, polygon2)):
                level += 1
        if(level > len(polygon_list_hierarchy)-1):
            dif = (level+1)- len(polygon_list_hierarchy)
            for _ in range(dif):
                polygon_list_hierarchy.append([])   
        polygon_list_hierarchy[level].append(polygon1)
    return polygon_list_hierarchy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.