GIS は、経度緯度の集合として表現されるポリゴンに含まれるポイント (経度緯度) を検索します。

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

  •  16-09-2019
  •  | 
  •  

質問

経度緯度の配列で構成されるポリゴンに含まれる経度/緯度を持つすべてのデータ項目を検索しようとしています。多くのポイントになる可能性があります。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)

終了

<時間>

次にIは、緯度/経度のペアのテーブル変数と(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 で実行すると、頭痛の種になるように思えます (T-SQL がすべてなのでしょうか?)。もちろん、ポリゴンの複雑さとデータ項目の配置方法によって異なりますが、一般に、最も簡単で適度に効率的なアプローチは、非常に大まかな方法​​でデータ項目を制限する C# で初期計算を行うことかもしれません。したがって、次のようなものです。

  1. C# でポリゴンの大まかな境界を計算します。
  2. これらの境界内のすべてのものを SQL サーバーから取得します。
  3. 最終的な正確なフィルタリングを C# で実行します。

もちろん、パフォーマンスは初期境界をどれだけうまく計算できるかによって決まります。まずは単純な外接する四角形から始めて、パフォーマンスが十分かどうかを確認します。

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