TSQL を使用してこの問題に対処する方法を次に示します。
長方形の場合、最も簡単な方法は、元の点からの関連する座標を使用して余分な 2 つの点を推定することです。例えば
北東 (緯度 1、経度 1) 北西* (緯度 1、経度 2)
SouthEast* (lat2、lon1) SouthWest (lat2、lon2)
※新ポイント
これは (数学的な意味で) 真の長方形にはなりませんが、これは GIS の一般的な方法 (ジオハッシュの形成方法) であり、赤道からの距離に基づいてサイズが変化する大まかな長方形が得られます。特定の高さ/幅の正確な長方形が必要な場合は、Haversine 式を使用して残りの 2 つのポイントを計算する必要があります。これには、方位と大円距離が考慮されます。
http://www.movable-type.co.uk/scripts/latlong.html
四角形を格納するには、GEOGRAPHY 型の列を持つ SQL テーブルを作成します。これにより、追加の属性 (名前など) と空間インデックスを割り当てることができ、将来のクエリがはるかに高速になります。
CREATE TABLE dbo.geographies
(
NAME VARCHAR(50)
,GEOG GEOGRAPHY
)
INSERT INTO dbo.geographies (NAME, GEOG)
VALUES ('Rectangle', geography::STPolyFromText('POLYGON((lon1 lat1, lon2 lat1, lon2 lat2, lon1 lat2, lon1 lat1))', 4326))
最初のポイントと最後のポイントの両方が同じであることに注意してください。これはポリゴンを「閉じる」ために必要であり、最後の数字は SRID または座標系 (この場合は WGS84) を示します。このページを参照できます: http://msdn.microsoft.com/en-us/library/bb933971
円に関しては、点を保存し、半径を使用して点の周りにバッファーを適用するのは簡単です。
INSERT INTO dbo.geographies (NAME, GEOG)
VALUES ('Circle with Radius', geography::STPointFromText('POINT(lon lat)', 4326).STBuffer([radius]))
バッファーは入力をメートル単位で受け取るため、変換を適用する必要がある場合があることに注意してください。このページの詳細については、http: //msdn.microsoft.com/en-us/library/bb933979
ここで面白いのは、STIntersects メソッドを使用して点の交点を簡単にチェックできることです。
http://msdn.microsoft.com/en-us/library/bb933962.aspx
DECLARE @point GEOGRAPHY = geography::STPointFromText('POINT(lon lat)', 4326)
SELECT * FROM dbo.geographies
WHERE @point.STIntersects(GEOG) = 1
コード サンプルはポイントを取得し、そのポイントが含まれるすべての地域のリストを返します。新しいポイントの SRID とテーブル内の地理が一致することが重要です。そうしないと、一致が得られません (おそらく、間違いに気付くまでしばらくの間、壁に頭をぶつけることになるでしょう。少なくとも、それが私がしていることです)。 .
これを C# に統合することに関しては、私がどれだけ役立つかわかりませんが、SQLGeography 型を返すのはそれほど難しいことではありません。
http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.types.sqlgeography.aspx
うまくいけば、これは少なくともあなたを正しい方向に向けます.