Shapely: علة Polylabel

تم إنشاؤها على ٨ يناير ٢٠٢٠  ·  3تعليقات  ·  مصدر: Toblerity/Shapely

السلوك المتوقع والسلوك الفعلي.

لم يتم احتساب الثقوب بشكل صحيح في التنفيذ الجميل لخوارزمية البولي ليبل.

خطوات إعادة إنتاج المشكلة.

from shapely.geometry import Polygon
from shapely.algorithms.polylabel import polylabel
poly1=Polygon(shell=[(0,0),(10,0),(10,10),(0,10),(0,0)][::-1], holes=[[(2,2),(6,2),(6,6),(2,6),(2,2)]])
import geopandas
gdf2 = geopandas.GeoDataFrame(geometry=[poly1])
gdf2.plot()
label_location = polylabel(poly1, tolerance=0.05) 
print(label_location.x)
print(label_location.y)

ناتج هذا البرنامج النصي هو:

6.25
3.75

لكن الموضع الصحيح قريب من 7.65625 ، 7.65625. يمكن التحقق من ذلك بالنظر إلى قطعة من هذا المضلع

image

ربما أفعل شيئًا خاطئًا في تعريف المضلع لكنني جربت العديد من الطرق المختلفة لإنشاء مثيل لهذا المضلع وأحصل دائمًا على نفس النتيجة.

نظام التشغيل

لينكس

رشيقة الإصدار والمصدر

تم اختباره بإصدار 1.6 و 1.7a3

bug

التعليق الأكثر فائدة

أنت على صوابbenediktbrandt. لا يتعامل تطبيق Shapely مع الثقوب بشكل صحيح ، حيث إنه يأخذ في الاعتبار فقط المسافة إلى الجزء الخارجي من المضلع. أعتقد أن هذا خطأ يجب إصلاحه لمطابقة سلوك الخوارزمية الأصلية.

https://github.com/Toblerity/Shapely/blob/cfa66d418fe3afe2fcb48438fcc9156142abaeb8/shapely/algorithms/polylabel.py#L44 -L53

يعد تحويل الشكل الخارجي للمضلع إلى سلسلة خطية غير فعال إلى حد ما هنا أيضًا حيث سيتم إجراؤه لكل خلية تم إنشاؤها.

ال 3 كومينتر

هل يمكنك التحقق من أن التنسيق الذي يقترحه https://github.com/mapbox/polylabel نفسه مختلف؟

الخوارزمية الأصلية في TypeScript:

import polylabel from "polylabel";

let exterior = [[0,0],[10,0],[10,10],[0,10],[0,0]];
let hole = [[2,2],[6,2],[6,6],[2,6],[2,2]];
let polygon = [exterior, hole]

console.log(polylabel(polygon, 0.01));
PS> .\node_modules\.bin\tsc test.ts
PS> node .\test.js
[ 7.65625, 7.65625 ]

جميل:

>>> from shapely.ops import polylabel
>>> from shapely.geometry import Polygon
>>> exterior = [[0,0],[10,0],[10,10],[0,10],[0,0]]
>>> hole = [[2,2],[6,2],[6,6],[2,6],[2,2]]
>>> p = Polygon(exterior, [hole]) 
>>> polylabel(p, 0.01).coords[:]
[(6.25, 3.75)]

أنت على صوابbenediktbrandt. لا يتعامل تطبيق Shapely مع الثقوب بشكل صحيح ، حيث إنه يأخذ في الاعتبار فقط المسافة إلى الجزء الخارجي من المضلع. أعتقد أن هذا خطأ يجب إصلاحه لمطابقة سلوك الخوارزمية الأصلية.

https://github.com/Toblerity/Shapely/blob/cfa66d418fe3afe2fcb48438fcc9156142abaeb8/shapely/algorithms/polylabel.py#L44 -L53

يعد تحويل الشكل الخارجي للمضلع إلى سلسلة خطية غير فعال إلى حد ما هنا أيضًا حيث سيتم إجراؤه لكل خلية تم إنشاؤها.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات