1

長方形を保存するにはどうすればよいですか - 北東と南西の 2 点で構成され、各点は緯度と経度の座標です

そして、中心 ( lat-lng ) と半径 (int/float 値) からなる円を追加します。

緯度経度が任意の円または長方形の境界内にある場合、保存して後でクエリを実行する最良の方法は何ですか? また、それらの配列を保存できますか? 1 つのレコードに 10 個の長方形と 5 個の円があるとしますか? Nhibernate を使用して痛みを和らげることはできますか?

これがばかげているように思われる場合は申し訳ありませんが、私は空間データで何もしたことがなく、どこから始めればよいかさえわかりません。サンプルとポインターは役に立ちます。前もって感謝します。

4

1 に答える 1

2

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

うまくいけば、これは少なくともあなたを正しい方向に向けます.

于 2012-07-06T13:31:33.140 に答える