تقريب الغلاف المقعر من إحداثيات النقاط
يفيد الغلاف المحدب في إحاطة مجموعة النقاط، لكنه يترك حولها غالباً مساحة أوسع من المطلوب.
شغّل الأداة مجانًا
يبدأ هذا التقريب للغلاف المقعر بذلك الحد الخارجي الموثوق، ثم ينقح الحواف الطويلة بإدراج نقاط داخلية غير مستخدمة حتى بلوغ العتبة المطلوبة أو تعذر أي إدراج صالح آخر. تتضمن النتيجة الحتمية الحد المرتب وأطوال الحواف والمحيط والمساحة وعدد الحواف التي تعذر تقصيرها، وبذلك يمكنكم فحص جودة التقريب بدلاً من التعامل معه على أنه حل هندسي دقيق.
اختاروا الإحداثيات والعتبة المناسبتين
أدخلوا ثلاث نقاط مستوية على الأقل في صورة إحداثيين عدديين x وy، مع عتبة موجبة لطول الحافة. قد تمثل الإحداثيات مواضع خرائط مسقطة أو وحدات رسم أو قياسات أو أي نظام ديكارتي ثنائي الأبعاد. ينبغي أن تستخدم كلها المقياس نفسه؛ فلا تخلطوا درجات خط الطول بمسافات مقيسة بالأمتار إذا أردتم أن تحتفظ العتبة بمعنى فيزيائي. تطلب العتبة الأصغر من الخوارزمية اتباع النقاط المتاحة بمزيد من الدقة، بينما تبقي العتبة الأكبر قدراً أكبر من المحيط المحدب. العتبة هدف وليست ضماناً، لأن مجموعة النقاط المتباعدة قد لا تحتوي على نقطة داخلية آمنة تستطيع تقسيم حافة بعينها. تُهمل الإحداثيات المكررة، ويجب أن تبقى ثلاث نقاط فريدة على الأقل لا تقع كلها على خط واحد، إذ لا يمكن لخط أن يصنع مضلعاً. عند استعمال بيانات خطوط الطول والعرض، أسقطوا الإحداثيات إسقاطاً مناسباً قبل تحديد عتبة بوحدة مسافة. تنفذ الأداة هندسة مستوية ولا تطبق نموذجاً كروياً أو إهليلجياً للأرض. ابدؤوا بعتبة قريبة من التباعد الذي تعدونه فجوة مهمة، ثم قارنوا الحد الناتج بالنقاط الأصلية قبل إدخاله في معالجة لاحقة.
افهموا طريقة تنقيح الحد
تحسب الخوارزمية أولاً غلافاً محدباً حتمياً بطريقة السلسلة الرتيبة. ثم تفحص حواف الحد التي يتجاوز طولها العتبة المحددة، بدءاً بالأطول. تبحث لكل حافة عن نقاط غير مستخدمة تقع داخل المضلع الحالي ويمكنها استبدال الحافة بقطعتين أقصر من دون تقاطع مع أي جزء آخر من الحد. يُختار المرشح الذي يجعل أطول قطعتي الاستبدال أقصر ما يمكن، وتُحسم حالات التساوي بطريقة ثابتة وفق الطول الإجمالي ثم ترتيب الإدخال الأصلي. بعد كل إدراج تبدأ عملية الاختيار من جديد لأن شكل المضلع يكون قد تغير. ينتهي التنقيح حين تحقق جميع الحواف الهدف أو حين تعجز النقاط المتبقية عن تحسين أي حافة طويلة بأمان. يفضل هذا البناء نتيجة قابلة للتوقع والتفسير، ولا يدعي حل جميع التعريفات المتنافسة للغلاف المقعر الدقيق. وهو لا يبتكر رؤوساً ولا يحرك الإحداثيات ولا يستخدم عينات عشوائية ولا يتصل بخدمة بعيدة. الغلاف المعاد قائمة مفتوحة ومرتبة من الرؤوس، حيث تتصل النقطة الأخيرة بالأولى ضمناً. وتتبع أطوال الحواف الترتيب الدوري نفسه. قد تُحذف النقاط الخارجية الواقعة على استقامة واحدة ما لم تصبح لاحقاً مفيدة في التنقيح.
راجعوا القيود قبل الاعتماد على المضلع
افحصوا unresolved_long_edges كلما كانت العتبة مهمة في الاستخدام العملي. تعني القيمة صفر أن كل حافة في الحد الناتج تحقق الهدف، أما القيمة الموجبة فتعني أن هندسة النقاط المتاحة لم تسمح بتحقيقه من دون تقاطع أو حركة إلى الخارج أو استبدال لا يقصر الحافة. هذه معلومة مفيدة وليست إخفاقاً مخفياً. قد ينتج هذا التقريب أيضاً حداً يختلف عن الأشكال ألفا أو أغلفة الجيران الأقرب أو مرشحات التثليث أو الأساليب المتخصصة في السواحل. قارنوا بين الأساليب إذا كانت للطوبولوجيا آثار قانونية أو علمية أو متعلقة بالسلامة. تخص المساحة والمحيط المضلع المستوي الناتج ويستخدمان نظام الإحداثيات الذي قدمتموه، وليسا قياسين جيوديسيين. ارسموا الغلاف المرتب فوق نقاط المصدر لتتحققوا من أن العتبة المختارة تمثل التجمعات والتجاويف المقصودة. إذا بقي الحد واسعاً أكثر من اللازم، فأضيفوا نقاطاً ممثلة أو اخفضوا العتبة؛ وإذا صار كثير التفاصيل فارفعوها. تقبل القدرة 500 عنصر بحد أقصى كي تظل اختبارات التقاطع المتكررة محدودة ومناسبة للتنفيذ التفاعلي في المتصفح وللأتمتة الحتمية عبر API.
حالات الاستخدام
رسم حدود موقع مأخوذة منه عينات
أنشئوا حداً قابلاً للفحص حول نقاط مسح أو مستشعرات مسقطة مع الاحتفاظ بالتجاويف الظاهرة.
إعداد معاينة على الخريطة
حوّلوا مجموعة متوسطة من النقاط إلى مضلع مرتب قبل تطبيق سير عمل GIS متخصص.
مقارنة حساسية الحد
جربوا عدة عتبات وقارنوا المساحة والمحيط والرؤوس المدرجة والحواف غير المحلولة لاختيار تقريب مناسب.
الأسئلة الشائعة
هل هذا غلاف مقعر دقيق؟
لا. للغلاف المقعر تعريفات متعددة؛ تنقح هذه الطريقة الحواف المحدبة الطويلة حتمياً باستخدام نقاط داخلية آمنة.
ما التكلفة؟
تكلفة كل طلب API هي $0.002. ويمكن إجراء الحساب الحتمي نفسه في المتصفح أيضاً.
هل تصبح جميع الحواف أقصر من العتبة؟
ليس بالضرورة. يبين الحقل unresolved_long_edges الحواف التي تعذر تقصيرها بأمان باستخدام النقاط المتاحة.
هل يمكنني استخدام خطوط الطول والعرض مباشرة؟
سيعمل الحساب، لكن المسافات والمساحات ستظل قيماً زاوية مستوية. أسقطوا البيانات أولاً حين تكون الوحدات الفيزيائية مهمة.
هل تتكرر أول نقطة من الغلاف في النهاية؟
لا. الغلاف قائمة مفتوحة ومرتبة؛ وتُعد النقطة الأخيرة متصلة بالأولى ضمناً.
كيف تُعالج النقاط المكررة أو الواقعة على خط واحد؟
تُهمل الإحداثيات المتطابقة تماماً. وتُرفض المجموعة الفريدة الواقعة كلها على خط واحد لأنها لا تستطيع تعريف مضلع.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/geo/concave-hull-approx \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"points":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":4},{"x":2,"y":1},{"x":0,"y":4}],"threshold":3}'const res = await fetch("https://api.kit.forhosting.com/geo/concave-hull-approx", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/concave-hull-approx",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/concave-hull-approx", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"points":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":4},{"x":2,"y":1},{"x":0,"y":4}],"threshold":3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"points":[{"x":0,"y":0},{"x":4,"y":0},{"x":4,"y":4},{"x":2,"y":1},{"x":0,"y":4}],"threshold":3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/concave-hull-approx", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"points": [
{
"x": 0,
"y": 0
},
{
"x": 4,
"y": 0
},
{
"x": 4,
"y": 4
},
{
"x": 2,
"y": 1
},
{
"x": 0,
"y": 4
}
],
"threshold": 3
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.concave_hull_approx",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_items | 500 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |