2

.netアプリが引き出して、それらが重なっているかどうかをチェックするポリゴン(現在はポイントとして保存されている)でいっぱいのデータベースを持つアプリケーションがあります。

これらのポイント配列をデータベース内のポリゴン/ポリラインオブジェクトに変換し、SQLを使用して、それらが重なるかどうかに関係なく、天気のブール値を取得する方がはるかに良いと思いました。

私はこれを行うために提案されたさまざまな方法を見てきましたが、与えられた例のどれも私のニーズに完全に一致していませんでした。

彼らの経験を提供するのに十分な種類の意見をいただければ幸いです。

追加:

質問への回答:それは確かに2Dです。はい、2つのクロスオーバーはすべて真と見なされます。ポリゴンにはn個のポイントがあり、凹面にすることができます。ポリゴンは、(データ変換タスクの後)行ごとに1つとしてポリゴンとして保存されます(つまり、ポリゴンタイプ..他の空間/ジオメトリと呼ばれる場合があります。現在、メモリは私の側にありません)

4

3 に答える 3

2

.STIntersection と .STAsText() を使用して、重なり合うポリゴンをテストできます。(Microsoft が使用した用語 (または標準用語を設定した人) は本当に嫌いです。私の考えでは、「接触」は、境界を共有するだけでなく、2 つのジオメトリ/地理形状がまったく重なるかどうかをテストする必要があります。)

ともかく....

@RadiusGeom がポイントからの半径を表すジオメトリである場合、以下は交差 (2 つのジオメトリが重なる領域を表すジオメトリ) が空でない 2 つのポリゴンのリストを返します。

SELECT CT.ID AS CTID, CT.[Geom] AS CensusTractGeom
FROM CensusTracts CT
WHERE CT.[Geom].STIntersection(@RadiusGeom).STAsText() <> 'GEOMETRYCOLLECTION EMPTY'

ジオメトリ フィールドが空間的にインデックス付けされている場合、これは非常に高速に実行されます。これを 66,000 の US CT レコードで約 3 秒で実行しました。もっと良い方法があるかもしれませんが、他の誰も答えを持っていなかったので、これはあなたのための答えの試みでした. それが役に立てば幸い!

于 2012-06-14T02:38:22.413 に答える
1

さて、別のアイデアを思いついたので、別の回答として投稿します。データベースからフェッチされるポリゴンの数をわずかな割合で減らすことであったとしても、バウンディング ポリゴンに関する以前の回答にはおそらくメリットがあると思いますが、これはおそらくより優れています。

MSSQL はバージョン 2005 以降、CLR との統合をサポートしています。これは、アセンブリで独自のデータ型を定義し、アセンブリを MSSQL に登録できることを意味します。その瞬間から、MSSQL はユーザー定義のデータ型を有効な型として受け入れます。列であり、アセンブリを呼び出して、ユーザー定義のデータ型で操作を実行します。

CodeProject でのこの手法の記事の例: SQL Server 2005 でのユーザー定義データ型の作成

私はこのメカニズムを使用したことがないため、詳細はわかりませんが、データ型に対して新しい操作を定義するか、「より小さい」などの既存の操作をオーバーロードできるはずだと思います。あるポリゴンが別のポリゴンと交差しているかどうかを確認できます。これにより、処理速度が大幅に向上する可能性があります。

于 2012-01-10T19:50:48.960 に答える
1

各ポリゴンの境界矩形を計算し、そのポリゴンに関連付けられた行内の一連の新しいフィールドに格納します。dotnet アプリにポリゴンがあり、重複するポリゴンを探している場合、比較的単純な SQL SELECT ステートメントを使用して、境界四角形が重複しているポリゴンのみをデータベースから取得できます。これらのポリゴンは比較的少ないはずなので、これは効率的です。次に、ドットネット アプリは、より細かいポリゴン オーバーラップ計算を実行して、実際にオーバーラップするものがどれかを判断できます。

于 2012-01-10T14:30:42.267 に答える