これは一見シンプルなSQL Serverのジオメトリの質問で、すぐに使えるソリューションがあると思っていましたが、見つけることができません。
私の意図は、別のテーブルからのより大きなポリゴン内にネストされた(含まれている)ポリゴンを持つ1つのテーブル内のすべてのレコードを選択することです。私は期待する機能STWithin
とSTContains
必要な解決策として期待していましたが、残念ながら、どちらも大きなポリゴンにネストされている内部のポリゴンのみを識別し、大きなポリゴンの境界に接しているネストされたポリゴンは識別していません。たとえば、画像を参照してください。
私のニーズに合った代替オプションはでしたSTIntersection
。ただし、この関数の問題は、ジオメトリ列のみが返されることです。代わりにレコードIDを取得したいと考えています。これを行う方法についての提案はありますか?
STWithin
:
select a.bg10 from
gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STWithin(b.shape) = 1
where b.mktname = 'Loop'
STContains
:
select a.bg10 from
gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on b.shape.STContains(a.shape) = 1
where b.mktname = 'Loop'
STIntersection
:
select a.shape.STIntersection(b.shape)
from gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STIntersects(b.shape) = 1
where b.mktname = 'Loop'
編集:
1つの提案は、省略STIntersection
しSTIntersects
て次のようにのみ使用することでした。
STIntersects
:
select a.bg10
from gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STIntersects(b.shape) = 1
where b.mktname = 'Loop'
このアプローチの問題は、STIntersects
厳密に内部にあるものだけでなく、内部または外部のすべてのポリゴンを選択し、より大きなポリゴンに触れるように見えることです。たとえば、画像を参照してください。
STContains
またはを使用することもできSTWithin
ます。本当に良いハックではありませんが、あなたが望む結果を得るでしょう。もう1つのオプションは、交差領域とポリゴン領域を比較してSTIntersectsを実行することです。