سؤال

لدي قائمة من المضلعات الرائعة في بيثون. لمعرفة أي مضلع لمسة سهلة ، باستخدام .touches() طريقة. ومع ذلك ، أحتاج إلى شيء يعود True فقط عندما تشارك المضلعات أكثر من نقطة واحدة (وبعبارة أخرى يشارك الحدود). اسمحوا لي أن أوضح:

In [1]: from shapely.geometry import Polygon
In [2]: polygons = [Polygon([(0,0),(0,1),(1,1),(1,0)]), Polygon([(1,0),(1,1),(2,1),(2,0)]), Polygon([(2,1),(2,2),(3,2),(3,1)])]

In [3]: polygons[0].touches(polygons[1])
Out[3]: True

In [4]: polygons[0].touches(polygons[2])
Out[4]: False

In [5]: polygons[1].touches(polygons[2])
Out[5]: True

في هذه الحالة ، يشارك Polygon 0 و 1 نقطتين (حدود كاملة). Polygon 1 و 2 يشارك فقط نقطة واحدة. ما أبحث عنه هو وظيفة تعطيني True, False, False في المثال أعلاه أو مجرد شيء يعيد عدد نقطة اللمس ، ثم يمكنني القيام ببقية المنطق بنفسي.

وبالطبع ، فإن أي حل لا يتضمن التكرار يدويًا من خلال جميع النقاط هو الأمثل - إذا كنت بحاجة إلى القيام بذلك ، فهو يهزم الغرض من استخدام SimeLy :-)

هل كانت مفيدة؟

المحلول

لم أستخدم بشكل جيد ، لكن هل حاولت رؤية ما إذا كان تقاطع المضلعات هو خط؟

نصائح أخرى

إذا كنت ترغب حقًا في التحقق مما إذا كانت مضلعات تشارك أكثر من عدد X من النقاط ، يمكنك ببساطة القيام بذلك:

p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x

لكنني أعتقد أن ما قد تريده هو تحديد ما إذا كان هناك حوافان (ومتداخلان).

ربما يكون هذا التنفيذ لاقتراحات أندرو هو ما تبحث عنه:

>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top