SQL Server 2005指向多边形

时间:2009-05-03 14:51:41

标签: sql-server-2005 tsql polygons

我在sql2005 db中有一个多边形结构,如下所述。

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 server。但是Sql 2005没有本机空间函数,我不想使用任何额外的空间功能库。如何将此功能移植到T-SQL? :)或者任何人都有不同的PointInPolygon检查解决方案?

由于

5 个答案:

答案 0 :(得分:2)

您可以查看此页面,它提供了SQL代码:

SQL code Point In Polygon

答案 1 :(得分:1)

你不排除使用内置geospatial types的sql 2008。我没有用它,所以我不能提供任何东西。

答案 2 :(得分:0)

您可以使用游标将PointInPolygon重写为存储过程。

答案 3 :(得分:0)

SQL Server 2005允许您为可以执行服务器端的CLR编写本机函数。您可以阅读MSDN简介Using CLR Integration in SQL Server 2005。这应该允许您将您的功能实现为sql server的一个附加功能并以本机速度运行。

答案 4 :(得分:0)

我必须承认,我没有完全让你的算法测试点击。无论如何,对于多边形,数据结构是奇数,因为线的X1 / Y1必须等于前一行的X2 / Y2以便形成多边形。因此,我只存储单点,以保证数据结构一致,最后和第一点再次互连。

对于查找点是否在(2D)多边形内的算法,我首先过滤候选线并创建“切割”(水平或垂直),这样我得到一个列表线交叉点并对它们进行排序。然后,使用秩函数,如果等级是奇数,则它在多边形内部,如果它甚至我们在多边形之外(或在“洞”中)。