1

以下に説明するように、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チェックの別の解決策がある人はいますか?

ありがとう

4

5 に答える 5

2

このページを見ると、SQL コードが提供されています。

SQL コード Point In Polygon

于 2010-07-29T16:15:54.553 に答える
1

地理空間タイプが組み込まれているSQL2008を使用することを除外しませんでした。私はそれを使ったことがないので、それ以上のものを提供することはできません。

于 2009-05-03T14:57:21.437 に答える
0

PointInPolygonを、カーソルを使用してストアドプロシージャとして書き直すことができます。

于 2009-05-03T14:56:31.157 に答える
0

SQL Server 2005では、サーバー側で実行できるCLRのネイティブ関数を記述できます。SQLServer2005でのCLR統合の使用に関するMSDNの概要を読むことができます。これにより、SQLサーバーへの追加として関数を実装し、ネイティブの速度で実行できるようになります。

于 2009-05-03T14:56:35.290 に答える
0

私はあなたのアルゴリズムがポイントヒットをテストするのに十分ではないことを認めなければなりません. いずれにせよ、多角形を形成するには、ラインの X1/Y1 が前のラインの X2/Y2 と等しくなければならないため、データ構造は多角形の場合は奇妙です。したがって、データ構造の一貫性を保証するためだけに単一のポイントを保存し、最後のポイントと最初のポイントを再び相互接続します。

ポイントが (2D) ポリゴンの内側にあるかどうかを検出するアルゴリズムについては、最初に候補となる線をフィルター処理し、「カット」(水平または垂直) を作成して、線の交点のリストを取得します。そしてそれらを注文します。次に、ランク関数を使用して、ランクが奇数の場合はポリゴンの内側にあり、ポリゴンの外側 (または「穴」内) にある場合もあります。

于 2009-05-03T15:14:20.570 に答える