私は SQL に精通していますが、SQL ジオメトリ機能を使用するのは初めてです。おそらく解決すべき非常に基本的な問題がありますが、ジオメトリ オブジェクトの使用方法を説明する適切なリソースがオンラインで見つかりませんでした。(Technet は、新しいことを学ぶにはお粗末な方法です...)
デカルト平面上に 2 次元の点のコレクションがあり、半径のコレクション内にあるすべての点を見つけようとしています。
次のような構文を使用してテーブルを作成し、データを入力しました。
Update [Things] set [Location] = geometry::Point(@X, @Y, 0)
(@X、@Y は単なる x 値と y 値です。0 はすべてのオブジェクトで共有される任意の数値であり、正しく理解すればフィルタリングを設定できます)
ここで私はレールから外れます...ある種のポリゴンコレクションとそれを使用してクエリを構築しようとしますか、それとも円形ポリゴンの束を構築せずに複数の半径の交差をチェックする簡単な方法はありますか?
補遺: 複数の半径の質問に対する答えを誰も持っていない場合、単一の半径の解決策は何ですか?
アップデート
以下は、星が xy グリッド上にポイントとして保存されている架空の星データベースを使用して、私が作成したいくつかの例です。
ボックス内のすべてのポイントを選択します。
DECLARE @polygon geometry = geometry::STGeomFromText('POLYGON(('
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + ','
+ CAST(@MaxX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + ', '
+ CAST(@MaxX AS VARCHAR(10)) + ' ' + CAST(@MaxY AS VARCHAR(10)) + ','
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MaxY AS VARCHAR(10)) + ','
+ CAST(@MinX AS VARCHAR(10)) + ' ' + CAST(@MinY AS VARCHAR(10)) + '))', 0);
SELECT [Star].[Name] AS [StarName],
[Star].[StarTypeId] AS [StarTypeId],
FROM [Star]
WHERE @polygon.STContains([Star].[Location]) = 1
これをパターンとして使用すると、複数のポリゴンを定義するなど、あらゆる種類の興味深いことができます。
WHERE @polygon1.STContains([Star].[Location]) = 1
OR @polygon2.STContains([Star].[Location]) = 1
OR @polygon3.STContains([Star].[Location]) = 1
または距離を確認する:
WHERE [Star].[Location].STDistance(@polygon1) < @SomeDistance
挿入ステートメントの例
INSERT [Star]
(
[Name],
[StarTypeId],
[Location],
)
VALUES
(
@Name,
@StarTypeId,
GEOMETRY::Point(@LocationX, @LocationY, 0),
)