الحصول على مضلعات قريبة من LAT، طويلة في mysql
سؤال
هل يعرف أحد وسيلة لجلب جميع المضلعات في 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) هي الفردية، حيث تنمو الشبكة "المربعات" بشكل أضيق كما تقترب من البولنديين. النهج السهل لهذا هو ... لا تضع أي نقاط بالقرب من البولنديين ... :)
قم بإنشاء صندوق أساسي لجميع المضلعات (اختياريا اختياريا هذه النتائج في قاعدة البيانات سيجعل هذا أسرع بكثير من المضلعات المعقدة). يمكنك بعد ذلك مقارنة المربع المحيط لكل مضلع مع جولة الدوران الموجودة في الحجم المطلوب. حدد جميع المضلعات التي لديها صناديق محيطية تتقاطع.