データベースに緯度と経度の座標が保存されている場所があるプロジェクトに取り組んでいます。私はGoogleマップを使用して、これらの場所を地図上のマーカーとしてプロットします。「非表示」のマーカー(現在のビューポート/バウンディングボックスの外側のマーカー)をマップにプロットしたくありません。したがって、ビューポートマーカーの管理に関するGoogleのアドバイスに従います。
マップのビューポートが変更されるたびに、AJAXを使用してASP.NETWebサービスにクエリを実行する実用的なソリューションがあります。このWebサービスは、MSSQLデータベースのストアドプロシージャを呼び出して、現在のビューポート/バウンディングボックス内にある座標を持つすべての場所を取得します。ストアドプロシージャは次のようになります。
ALTER PROCEDURE dbo.GetPlacesInsideBoundingBox
(
@swLat VarChar(11), /* south-west point latitude */
@swLng VarChar(11), /* south-west point longitude */
@neLat VarChar(11), /* north-east point latitude */
@neLng VarChar(11) /* north-east point longitude */
)
AS
/* SET NOCOUNT ON */
SELECT * FROM dbo.Place WHERE
place_lat >= CONVERT(Decimal(11,8), @swLat)
AND place_lat <= CONVERT(Decimal(11,8), @neLat)
AND place_lng >= CONVERT(Decimal(11,8), @swLng)
AND place_lng <= CONVERT(Decimal(11,8), @neLng)
RETURN
ストアドプロシージャに送信されるパラメータは、ビューポート/バウンディングボックスの南西と北東の角の緯度と経度です。次に、これらのポイントをデータベースに保存されている経度と緯度の値と比較して、現在のビューポート/バウンディングボックス内にある場所を確認します。
これは問題なく動作します!しかし、経度(本初子午線の西)の値が負の場合は問題が発生する可能性があり、単純な解決策は経度が負の場合は経度に360を追加することであると読みました。
2つの質問があります:
負の経度を考慮に入れるために、ストアドプロシージャ(上記)を変更するにはどうすればよいですか?
このストアドプロシージャを確実に実行するために、他に検討すべき変更はありますか?
VarCharからDecimalへの変換について疑問がある場合は、クライアント側で単純な文字列(javascript)を操作し、計算が必要になったときにストアドプロシージャでそれらを10進数に変換する方がはるかに簡単であることがわかりました。
前もって感謝します!