سؤال

ولدي هيكل المضلع في ديسيبل SQL2005 كما هو موضح أدناه.

CREATE TABLE [dbo].[Polygons](
    [PolygonID] [int] IDENTITY(1,1) NOT NULL,
    [PolygonName] [varchar](255) NOT NULL,
    [PolygonColor] [varchar](7) NOT NULL,
    [PolygonRuleID] [int] NOT NULL)

CREATE TABLE [dbo].[Polylines](
    [LineID] [int] IDENTITY(1,1) NOT NULL,
    [LineX1] [float] NOT NULL,
    [LineY1] [float] NOT NULL,
    [LineX2] [float] NOT NULL,
    [LineY2] [float] NOT NULL,
    [PolygonID] [int] NOT NULL
)

والآن يمكنني استرجاع خطوط كاملة لتطبيق ووضع كل لضرب اختبار وظيفة.

public static bool PointInPolygon(float pointX, float pointY, PolylineCollection polygon)
        {
            int nvert = polygon.Count();
            int i, j = 0;
            bool c = false;
            for (i = 0, j = nvert - 1; i < nvert; j = i++)
            {
                if (((polygon[i].LineY1 > pointY) != (polygon[j].LineY1 > pointY)) &&
                 (pointX < (polygon[j].LineX1 - polygon[i].LineX1) * (pointY - polygon[i].LineY1) / (polygon[j].LineY1 - polygon[i].LineY1) + polygon[i].LineX1))
                    c = !c;
            }
            return c;
        }

ولكن أنا بحاجة إلى نقل هذه الوظيفة لخادم SQL. ولكن SQL 2005 لا يكون لها وظائف المكانية الأم وأنا لا أريد أن استخدام أي إضافية المكتبات وظائف المكانية. كيف يمكنني ميناء هذه الوظيفة لT-SQL؟ :) أو أي شخص يكون حلا مختلفا لPointInPolygon تحقق؟

والشكر

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

المحلول

وSQL خادم 2005 يسمح لك لإرسال وظائف الأم لCLR التي يمكن تنفيذها من جانب الخادم. يمكنك قراءة MSDN مقدمة عن طريق CLR التكامل في SQL Server 2005 . هذا يجب أن تسمح لك أن الدالة نفذت كإضافة إلى خادم SQL وتشغيل بسرعات الأصلي.

نصائح أخرى

ويمكنك إلقاء نظرة على هذه الصفحة، ويوفر كود SQL:

كود SQL نقطة في مضلع

وأنت لم يستبعد الذهاب مع SQL 2008 التي لديها المدمج في <لأ href = "http://technet.microsoft.com/en-us/magazine/2008.04.datatypes.aspx" يختلط = "نوفولو noreferrer "> أنواع الجغرافية المكانية . أنا لم تستخدم لذلك لا يمكن أن تقدم أي شيء أبعد من ذلك.

هل يمكن إعادة كتابة PointInPolygon باعتباره بروك المخزنة مع المؤشر.

وأنا يجب أن أعترف بأنني لا تحصل على كامل خوارزمية لاختبار لضرب نقطة. على أي حال، بنية البيانات الغريب لمضلع، منذ X1 / Y1 خط يجب أن يكون مساويا لX2 / Y2 من السطر السابق من أجل تشكيل مضلع. لذلك، فما استقاموا لكم فاستقيموا تخزين نقطة واحدة فقط من أجل جعل بنية البيانات يضمن أن تكون متسقة، وآخر والنقطة الأولى مترابطة مرة أخرى.

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

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