1

我在 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 检查有不同的解决方案?

谢谢

4

5 回答 5

2

你可以看看这个页面,它提供了 SQL 代码:

多边形中的 SQL 代码点

于 2010-07-29T16:15:54.553 回答
1

您不排除使用具有内置地理空间类型的 sql 2008 。我没有使用它,所以我不能提供除此之外的任何东西。

于 2009-05-03T14:57:21.437 回答
0

您可以将 PointInPolygon 重写为带有游标的存储过程。

于 2009-05-03T14:56:31.157 回答
0

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

于 2009-05-03T14:56:35.290 回答
0

我不得不承认我没有完全得到你的算法来测试点命中。无论如何,多边形的数据结构是奇数的,因为一条线的 X1/Y1 必须等于前一条线的 X2/Y2 才能形成多边形。因此,我只存储单点是为了保证数据结构的一致性,并且最后一个点和第一个点再次相互连接。

至于查找点是否在(2D)多边形内的算法,我首先过滤候选线并创建“切割”(水平或垂直),以便获得线交点列表并订购它们。然后,使用等级函数,如果等级是奇数,它在多边形内部,如果它甚至我们在多边形之外(或在“洞”中)。

于 2009-05-03T15:14:20.570 回答