لم يتم احتساب الثقوب بشكل صحيح في التنفيذ الجميل لخوارزمية البولي ليبل.
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. يمكن التحقق من ذلك بالنظر إلى قطعة من هذا المضلع
ربما أفعل شيئًا خاطئًا في تعريف المضلع لكنني جربت العديد من الطرق المختلفة لإنشاء مثيل لهذا المضلع وأحصل دائمًا على نفس النتيجة.
لينكس
تم اختباره بإصدار 1.6 و 1.7a3
هل يمكنك التحقق من أن التنسيق الذي يقترحه 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 مع الثقوب بشكل صحيح ، حيث إنه يأخذ في الاعتبار فقط المسافة إلى الجزء الخارجي من المضلع. أعتقد أن هذا خطأ يجب إصلاحه لمطابقة سلوك الخوارزمية الأصلية.
يعد تحويل الشكل الخارجي للمضلع إلى سلسلة خطية غير فعال إلى حد ما هنا أيضًا حيث سيتم إجراؤه لكل خلية تم إنشاؤها.
التعليق الأكثر فائدة
أنت على صوابbenediktbrandt. لا يتعامل تطبيق Shapely مع الثقوب بشكل صحيح ، حيث إنه يأخذ في الاعتبار فقط المسافة إلى الجزء الخارجي من المضلع. أعتقد أن هذا خطأ يجب إصلاحه لمطابقة سلوك الخوارزمية الأصلية.
https://github.com/Toblerity/Shapely/blob/cfa66d418fe3afe2fcb48438fcc9156142abaeb8/shapely/algorithms/polylabel.py#L44 -L53
يعد تحويل الشكل الخارجي للمضلع إلى سلسلة خطية غير فعال إلى حد ما هنا أيضًا حيث سيتم إجراؤه لكل خلية تم إنشاؤها.