أكثر

ابحث عن الزاوية اليسرى السفلية لمضلع مستدير

ابحث عن الزاوية اليسرى السفلية لمضلع مستدير


أعاني حاليًا من مشكلة رياضية ولا يمكنني حلها على ما يبدو.

لدي مجموعة من المضلعات المستطيلة المستديرة (يجب أن يعمل الحل أيضًا مع المضلعات غير المستطيلة) في أشكال مختلفة. أرغب (تلقائيًا) في العثور على الزاوية اليسرى السفلية لكل مضلعات باستخدام python (arcpy).

في البداية حاولت ببساطة استخدام المدى ، ولكن نظرًا لأنهم يتم تدويرهم ، فإن المدى سيحقق نتائج خاطئة. فكيف أتعامل مع هذا؟ لقد بحثت في Google لساعات وكان الشيء الوحيد الذي يمكنني التوصل إليه هو حساب مركز المضلع بطريقة أو بأخرى أو تدويره مؤقتًا إلى 180 درجة ثم استخدام xmin و ymin. إليك بعض الصور التي قد تساعد في تشتيت الانتباه عن لغتي الإنجليزية السيئة (آسف لذلك راجع للشغل)

لم أواجه أي مشاكل في تصدير إحداثيات المضلعات باستخدام أداة الرؤوس إلى النقاط. حتى الآن قمت باستخراجها مرة واحدة في قائمة tupels ومرة ​​واحدة في قائمتين مختلفتين (واحدة لـ x-coords والأخرى لـ y-coords)

لذلك إليك بعض الإحداثيات لتسهيل الاختبار:

تنسيق tupel:

tupelList = [[1792398.680577231 ، 4782539.85121522] ، [1792173.0363913027 ، 4780368.293228334] ، [1788935.7990357098 ، 4780713.732859781] ، [1789162.9530321995 ، 4782885.33225629]

تنسيق x-list / y-list:

xList = [1792398.680577231 ، 1792173.0363913027 ، 1788935.7990357098 ، 1789162.9530321995 ، 1792398.680577231] yList = [4782539.85121522 ، 4780368.293228334 ، 4780713.732859781]

أستخدم حاليًا ملحقات ArcGIS 10.3.1 ذات العرض الحليف والترخيص المتقدم. إصدار Python هو 2.7 شيء


إليك طريقة بسيطة للغاية تقوم بإلغاء تحميل جميع عمليات المعالجة في أداة Sort GP. نظرًا لأن لديك حق الوصول إلى ترخيص متقدم ، فإن الفرز حسب الشكل والبدء من الزاوية اليسرى السفلية يعطي نتائج سريعة.

استيراد نظام التشغيل ، arcpy.env.overwriteOutput = True inFC = r '"outFC = r"'# create output FC لعقد النقاط والحقل لربط OID spatref = arcpy.Describe (inFC) .spatialReference arcpy.CreateFeatureclass_management (* os.path.split (outFC)، geometry_type = "POINT"، spatial_reference = spatref) arcpy.AddFerence = spatref) (outFC، "ID"، "LONG") مع arcpy.da.SearchCursor (inFC، ["OID @"، "SHAPE @"]) كمؤشر: مع arcpy.da.InsertCursor (outFC، ["ID"، " SHAPE @ "]) كـ iCursor: لـ oid ، poly in sCursor: # استخدام كائنات Geometry سريع جدًا وله أيضًا فائدة # إرجاع قوائم الأشكال الهندسية # نظرًا لأننا نفرز القمم بواسطة LL ، فإن أول واحد هو الإجابة verts = arcpy.FeatureVerticesToPoints_management (poly، arcpy.Geometry ()) sort = arcpy.Sort_management (verts، arcpy.Geometry ()، [["SHAPE"، "ASCENDING"]]، "LL") [0] iCursor.insertRow ([رقم التعريف الشخصي ، فرز])

من شرح الفرز المكاني ، نرى أن N / S لها الأسبقية على E / W:

لاحظ أن U تحصل على أولوية على R.R لا تؤخذ في الاعتبار إلا عندما تكون بعض الميزات في نفس المستوى الأفقي.


بالنظر إلى أمثلة المستطيلات ومتوازيات الأضلاع ، وإذا فهمت صياغتك لـ "أدنى اليسار" (أي "أقصى الجنوب الغربي") بشكل صحيح ، فإن الحل الساذج:

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

قد تكون الحالات التالية نادرة أو غير موجودة ، ولكن ما سبق ينهار مع شكل رباعي حيث يكون الرأسان الموجودان بين أقصى الجنوب والشمال على خط عرض متساوٍ ، مثل شكل "ماسي" ، أو بعض التشوه فيه ، أو حتى عند تدوير مستطيل كامل تمامًا:

للتعامل بقوة مع هذه الحالات ، يمكنك استخدام أسلوب يحسب المحور الإنسي للشكل (https://en.wikipedia.org/wiki/Medial_axis) ، ويقارن ميله بـ 45 و 135 درجة ، ويحدد "قاع "و" أعلى "من الشكل مقارنة بذلك. ثم تقدم على النحو الوارد أعلاه ، بحيث تكون النقطة الواقعة في أقصى الغرب من النقطتين "السفلية" هي النقطة التي يجب اختيارها. سيعمل ذلك في حالتين من الحالات الموضحة أعلاه. ستظل تفشل في حالة وجود مربع كامل في دوران "الماس" - ولكن بعد ذلك لا توجد زاوية أسفل يسار "طبيعية" لهذا الشكل. هناك طريقة أخرى للتعامل مع هذه الحالات حيث تكون النقطتان 2 و 3 في التسلسل الرأسي على نفس خط العرض وهي أخذ النقطة 1 ، أقصى نقطة في الجنوب ؛ أو أقصى نقطة في الغرب بين 2 و 3.


شاهد الفيديو: Stižu lasiks i trental