2017-01-31 5 views
0

緯度と経度の最大値と最小値を計算して、2つの点間の距離を計算する前に巨大なデータを簡単にフィルタリングできるようにする必要があります。
しかし、私は距離が可変であるそこに何かを見つけていないよ、私は、私はおそらく段階でこれらを計算することができ考え出しので、私は、次のを思い付いた:場所から可変距離でMAXとMINの緯度と経度を計算する

DECLARE @area int = (69 * FLOOR(@maxDist/69) + 1) 
DECLARE @lonMin float = @originLon - @maxDist/abs(cos(radians(@originLat)) * @area); 
DECLARE @lonMax float = @originLon + @maxDist/abs(cos(radians(@originLat)) * @area); 
DECLARE @latMin float = @originLat - (@maxDist/@area); 
DECLARE @latMax float = @originLat + (@maxDist/@area); 

私は値を適用しよう私はここで私のwhereステートメントで取得しますが、検索は単一度の違いを超えると失敗します。

WHERE 
    (endPoint.Longitude >= @lonMin and endPoint.Longitude <= @lonMax) 
    and 
    (endPoint.Latitude >= @latMin and endPoint.Longitude <= @latMax) 

私の最高の推測では、私のロンミンとlonMaxが間違っているということですが、私はそれを破ってきた場所がわからないんだけど。私はかなり正しい計算式を使用していることを確信しています - これまで見たことのあるものは同じですか - 計算された問題は@areaなのでしょうか?
(私はマイルと33.631701、 -111.877582などの例入力で働いている)

+0

使用しているデータベースのGIS機能または拡張機能を調べる必要があります。 –

+0

私のDBの地理的な機能は良いです、私は彼らが何で、どのようにそれらを使用するのか知っていますが、それらの使用の結果は速度の大きな損失です。 私がやっているよりもはるかに大きくコストがかかるので、ある程度正確さを失ってもそれを避けたいと思います(これは私の使用のケースでは非常に重要ではありません)。 – Nol

+0

@Nol 69度は赤道に沿った1度の旅行のおよその距離です。しかし、私は「地域」と思われるものを推測するのに迷っています。あなたは書いています:「私は正しい数式を使っていると確信しています - これまでに見たものは同じものです」 - URL(s)。距離が遠い場合などに問題があるようです。 67.5,68.0,68.5マイル –

答えて

0

それは私が私が行うために必要なもののために右の式を持っていたが判明したが、私は間違ってそれらを使用していました。私は何度も度を差し込んでいることに気づいていませんでした。(@area)私は1度のベースラインをどこに置いていたのでしょうか?

私が入力した値を変更すると、1度に1度の領域フィルタリングが必要になります。そのため、原点の40mi以内で何かを検索すると、69mi以内にないすべてのDB結果が除外されます私は、このシナリオでは@degreeを宣言する必要はありませんが、私のために私の問題を明確にしていることが判明しました。

DECLARE @degree int = 69 
DECLARE @area int = @degree * (FLOOR(@maxDist/@degree) + 1); 
DECLARE @lonMin float = @originLon - @area/(abs(cos(radians(@originLat)) * @degree)); 
DECLARE @lonMax float = @originLon + @area/(abs(cos(radians(@originLat)) * @degree)); 
DECLARE @latMin float = @originLat - (@area/@degree); 
DECLARE @latMax float = @originLat + (@area/@degree); 
関連する問題