سؤال

هل يعرف أحد وسيلة لجلب جميع المضلعات في MySQL DB داخل مسافة معينة من نقطة؟ المسافة الفعلية ليست مهمة لأنها محسوبة لكل مرة تم العثور على مضلع في وقت لاحق، ولكن سيكون من التحسين الهائل القيام بهذا الحساب فقط من المضلعات التي تعد "إغلاق".

لقد بحثت في MBR ويحتوي على وظائف ولكن المشكلة هي أن بعض المضلعات لا تحتوي على ضمن مربع محيط مرسوم حول هذه النقطة لأنها كبيرة جدا، ولكن بعض رؤوسها لا تزال قريبة.

أي اقتراحات؟

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

المحلول

نسخة بطيئة (بدون فهارس مكانية):

SELECT  *
FROM    mytable
WHERE   MBRIntersects(mypolygon, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))

للاستفادة من المؤشرات المكانية، تحتاج إلى تنظيم طاولتك بحيث يتم تخزين كل Vollogon Vertex في سجلها الخاص.

ثم قم بإنشاء SPATIAL INDEX في الحقل الذي يحتوي على إحداثيات القمم وإصدار فقط هذا الاستعلام:

SELECT  DISTINCT polygon_id
FROM    vertices
WHERE   MBRContains(vertex, LineString(Point(@X - @distance, @Y - @distance), Point(@X + @distance, @Y + @distance))

ستكون الأمور أكثر سهولة إذا قمت بتخزينها UTM الإحداثيات في قاعدة البيانات الخاصة بك بدلا من خطوط الطول والعرض.

نصائح أخرى

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

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

إن المشكلة في هذا النهج هي أننا نتحدث أننا نتحدث عن إحداثيات كروية (LAT، Londing Wondher) هي الفردية، حيث تنمو الشبكة "المربعات" بشكل أضيق كما تقترب من البولنديين. النهج السهل لهذا هو ... لا تضع أي نقاط بالقرب من البولنديين ... :)

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top