2012-04-30 5 views
2

地図上にグリッドが表示されています。私はあなたの場所と地図上の2つのオブジェクトの場所を知っています。グリッド線が交差する場所にオブジェクトが表示されます。地図上のエリアはわずかな距離なので、世界は平らで丸いものではないと考えてください。パフォーマンス上の理由から、三角法と乗算を使用せずに、どのオブジェクトがあなたに最も近いかを判断したいと思います。私は球場表示を取得するだけでなく、正確さを求めているわけでもありません。現在の位置からの緯度と経度の差の最短距離を求めることができるはずです。私のテーブルには、場所は、次のようになります。私の場所は、40 =緯度であると経度= 60T-SQL:マップグリッド上のオブジェクトの最も近い場所を見つける

ID Latitude Longitude 
1  50   70 
2  30   40 

場合は、ID = 1の場所は私に近いだろう。

自分の位置が「緯度= 30」、「経度= 60」の場合、おそらく両方の場所がほぼ同じ距離にあるため、1つだけを選択します。

私の場所が緯度= 30、経度= 50の場合、ID = 2の場所は近くなります。

+0

どのバージョンのSQLがありますか? 2008年の場合は、ジオメトリ関数 – Dibstar

+0

2008を使用することができます。ジオメトリ関数は、直線的な整数比較を行うだけではパフォーマンスが低下しませんか?私の座標は常に整数です。 – AndroidDev

+0

はい、通常はそうですが、51.5228、-0.1028と50.5374、-3.5173と51.228、-0.1028と52.5374、-1.5173 – Dibstar

答えて

2

私はちょうど差の合計の分をします。私はそれを試して、それはかなりうまく動作します。

SELECT MIN(ABS(s.Latitude - 47) + ABS(s.Longitude - -122)), s.ID FROM Sites as s Group By ID; 
+0

の間の旅行を比較すると整数よりもはるかに正確な比較ができます。これは私が思いついたものです質問を投稿した後も同様です。どうもありがとう! – AndroidDev

+0

また、定期的に間違った答えを返します。たとえば、私の緯度= 90、経度40の場合、実際にID 1(実際には70が戻ってくるのではなく、実際に50離れている)がID 2が最も近い(60離れている)と言います。 – MartW

+1

x、y点までの距離の方程式ではありません – Paparazzi

4

は、あなたは本当に精度の任意の種類を取得するには、いくつかの三角法を使用する必要があります。

DECLARE @LocationTable TABLE(ID int, Latitude int, Longitude int) 
INSERT INTO @LocationTable(ID, Latitude, Longitude) 
VALUES 
    (1,50,70), 
    (2,30,40) 

DECLARE 
    @MyLatitude int = 90, 
    @MyLongitude int = 40 

WITH DistanceTable AS 
(
    SELECT ID, Latitude, Longitude, 
     SQRT(POWER(Latitude - @MyLatitude,2) + POWER(Longitude - @MyLongitude, 2)) AS Distance 
    FROM @LocationTable 
) 
SELECT ODT.ID, ODT.Latitude, ODT.Longitude, ODT.Distance 
FROM (SELECT ID, Latitude, Longitude, Distance, ROW_NUMBER() OVER(ORDER BY Distance) AS Position 
    FROM DistanceTable) AS ODT 
WHERE ODT.Position = 1; 
+1

ありがとうございましたが、私は記事の中で私が正確さを求めていないと述べました。正確さが必要な場合は、組み込みジオメトリ関数を使用します。 – AndroidDev

+1

@AndroidDev、点が赤道に近い場合を除き、三角法がなければ結果は完全に間違っています。例えば、モスクワ(緯度は55°N)では1度の緯度= 111.13キロメートル(他の場所と同じように)ですが、緯度が赤道から遠く離れているため、1度の経度はわずか63.7キロです。あなたがモスクワにいるなら、北に110km、西に64km、そしてあなたの方法では、110kmが64kmに近いと言います。 – Soonts

1

SELECT MIN(((s.Latitude - @lat)(s.Latitude - @lat)) +((s.Longitude - @lon)(s.Longitude - @lon)))、s.ID FROMサイトはIDでグループ化されています。

関連する問題