ポリゴンのSQL Server 2005ポイント
-
03-07-2019 - |
質問
次のように、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サーバーに移動する必要があります。しかし、SQL 2005にはネイティブの空間関数がなく、余分な空間機能ライブラリを使用したくありません。この関数をT-SQLに移植するにはどうすればよいですか? :)または、PointInPolygonチェックに対して別のソリューションがありますか?
ありがとう
解決
SQL Server 2005では、サーバー側を実行できるCLRのネイティブ関数を作成できます。 MSDNのイントロ SQL Server 2005でのCLR統合の使用を読むことができます。これにより、SQLサーバーへの追加として機能を実装し、ネイティブの速度で実行できるようになります。
他のヒント
このページを見ると、SQLコードが提供されています:
地理空間タイプ。使用したことがないので、それ以上は提供できません。
PointInPolygonをカーソルを持つストアドプロシージャとして書き換えることができます。
ポイントヒットをテストするためのアルゴリズムを完全に取得できないことを認めなければなりません。とにかく、ポリゴンのデータ構造は奇数です。ポリゴンを形成するには、ラインのX1 / Y1が前のラインのX2 / Y2と等しくなければならないためです。したがって、データ構造の一貫性を保証するために単一のポイントのみを保存し、最後のポイントと最初のポイントを再び相互接続します。
ポイントが(2D)ポリゴン内にあるかどうかを見つけるアルゴリズムについては、最初に候補であるラインをフィルタリングし、「カット」を作成します。 (水平または垂直)ので、線の交点のリストを取得し、それらを並べます。次に、ランク関数を使用して、ランクが奇数の場合はポリゴンの内側に、ポリゴンの外側(または「穴」)にある場合はポリゴンの内側になります。