長い緯度の配列で構成される多角形に含まれる経度/緯度を持つすべてのデータ項目を検索しようとしていますが、多くのポイントになる可能性があります。SQL 2008 の新しい地理空間データ型でこの種のことができることは知っていますが、私は SQL 2005 と C# を使用しています。これは、DB 側または C# で行うのが最善でしょうか。
ありがとう。
長い緯度の配列で構成される多角形に含まれる経度/緯度を持つすべてのデータ項目を検索しようとしていますが、多くのポイントになる可能性があります。SQL 2008 の新しい地理空間データ型でこの種のことができることは知っていますが、私は SQL 2005 と C# を使用しています。これは、DB 側または C# で行うのが最善でしょうか。
ありがとう。
これを行うために、SQL2000用にいくつかのコードを記述しました。ポイントがポリゴン内にあるかどうかを判断するために「角度」メソッドを使用します。
まず、GetAngle ユーザー定義関数:
ALTER Function [dbo].[GetAngle](
@Ax Decimal(8,5),
@Ay Decimal(8,5),
@Bx Decimal(8,5),
@By Decimal(8,5),
@Cx Decimal(8,5),
@Cy Decimal(8,5))
始まりとして浮動小数点数を返します
Declare @dot_product Float
Declare @cross_product Float
Declare @BAx Decimal(8,5)
Declare @BAy Decimal(8,5)
Declare @BCx Decimal(8,5)
Declare @BCy Decimal(8,5)
--' Get the vectors' coordinates.
Set @BAx = Sign(@Ax - @Bx) * dbo.CalculateDistance(@Ax, @Ay, @Bx, @Ay)
Set @BAy = Sign(@Ay - @By) * dbo.CalculateDistance(@Ax, @Ay, @Ax, @By)
Set @BCx = Sign(@Cx - @Bx) * dbo.CalculateDistance(@Cx, @Cy, @Bx, @Cy)
Set @BCy = Sign(@Cy - @By) * dbo.CalculateDistance(@Cx, @Cy, @Cx, @By)
--' Calculate the dot product.
Set @dot_product = @BAx * @BCx + @BAy * @BCy
--' Calculate the Z coordinate of the cross product.
Set @cross_product = @BAx * @BCy - @BAy * @BCx
--' Calculate the angle.
return ATn2(@cross_product, @dot_product)
終わり
次に、緯度/経度のペアとシーケンス番号 (LAT/LONG のペアがポリゴンを定義する順序を示す) のテーブル変数があると仮定します。この表の最初のポイントが表の最後のポイントと同じであることが重要です。
また、最小および最大緯度と経度の変数がいくつかあります。これにより、バウンディング ボックスが効果的に作成されるため、ポリゴンを囲む四角形の領域内にないポイントをすばやく削除できます。
Select Address.AddressId
From @Temp As A
Inner Join @Temp As B
On A.SequenceNumber = B.SequenceNumber - 1
Inner Join Address
On Address.XCoord Between @MinLongitude And @MaxLongitude
And Address.YCoord Between @MinLatitude And @MaxLatitude
Group By Address.AddressId
Having Abs(Sum(dbo.GetAngle(A.Longitude, A.Latitude, Address.XCoord, Address.YCoord, B.Longitude, B.Latitude))) > 3.14
T-SQL で実行すると頭痛の種のように思えます (どちらが多かれ少なかれすべてですか?)。もちろん、ポリゴンの複雑さとデータ項目の配置方法によって異なりますが、一般的に最も簡単で適度に効率的な方法は、データ項目を非常に大まかに制限する C# で最初の計算を行うことです。次のようなものです。
もちろん、パフォーマンスは、初期境界をどれだけうまく計算できるかに依存します。最初は単純な外接する四角形から始めて、パフォーマンスが十分かどうかを確認します。