SQL Server 2008+:2つのポリゴンが重複している場合に検出するのに最適な方法ですか?

StackOverflow https://stackoverflow.com/questions/8804722

質問

.NETアプリが引き出してオーバーラップするかどうかをチェックするポリゴン(現在ポイントとして保存されている)でいっぱいのデータベースがあるアプリケーションがあります。

これらのポイントアレイをデータベース内のポリゴン /ポリラインオブジェクトに変換し、SQLを使用して重複するかどうかにかかわらず、これらのポイントアレイをポリゴン /ポリラインオブジェクトに変換する方がはるかに良いと思いました。

私はこれを行うことが示唆されているさまざまな方法を見てきましたが、与えられた例は私のニーズに非常に並んでいました。

私は彼らの経験を提供するのに十分な種類から意見を受け取ることができてとてもうれしいです。

追加:

質問に応えて:それは確かに2dです。そして、はい、2つのクロスオーバーは真実と見なされます。ポリゴンにはNポイントがあり、凹面になります。ポリゴンは、ポリゴン(つまり、ポリゴンタイプ)として1行あたり(データ変換タスクの後)として保存されます。

役に立ちましたか?

解決

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

ともかく....

@RadiusGeomがポイントから半径を表すジオメトリである場合、次の場合、交差点(2つの形状が重複している領域を表すジオメトリ)が空になっていない2つのポリゴンのリストを返します。

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

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

他のヒント

そのポリゴンに関連付けられている行内の新しいフィールドのセットに、各ポリゴンの境界長方形を計算して保存します。 (私はあなたが持っていると仮定します。そうでない場合は、1つを作成します。)dotnetアプリにはポリゴンがあり、重複するポリゴンを探している場合、比較的単純なSQL Selectステートメントを使用して、境界長方形が重複するポリゴンのみをデータベースから取得できます。これらのポリゴンは比較的少ない必要があるため、これは効率的です。次に、dotnetアプリがより細かいポリゴンオーバーラップ計算を実行して、それらのどれが本当に重複するかを判断できます。

さて、私は別のアイデアを得たので、私はそれを別の答えとして投稿しています。境界ポリゴンでの私の以前の答えには、データベースから取得されたポリゴンの数をわずかな割合で減らすことであったとしても、おそらくそれ自体がいくつかのメリットがあると思いますが、これはおそらくより良いでしょう。

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

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

私はこのメカニズムを使用したことがないので、それについての詳細を知りませんが、データ型の新しい操作を定義するか、「より少ない」のような既存の操作を過負荷にすることができるはずだと思います。あるポリゴンが別のポリゴンと交差するかどうかを確認できます。これは、物事を大いにスピードアップする可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top