102

地図上の 2 つの位置の間の距離を計算しようとしています。データに保存しました:経度、緯度、X POS、Y POS。

以前は以下のスニペットを使用していました。

DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
    3956 * 2 * ASIN(
          SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2) 
              + COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180)  
              * POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 / 2), 2) )) 
          AS distance
--INTO #includeDistances
FROM #orig dest

ただし、これから出てくるデータは信頼できません。少し不正確な結果が得られているようです。

必要な場合のサンプルデータ

Latitude        Longitude     Distance 
53.429108       -2.500953     85.2981833133896

誰かが私のコードで私を助けてくれませんか。これを達成する新しい方法があれば、私が既に持っているものを修正したいと思ってもかまいません。

結果の測定単位を教えてください。

4

6 に答える 6

139

SQL Server 2008 を使用しているのでgeography、まさにこの種類のデータ用に設計されたデータ型を使用できます。

DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'

SELECT @source.STDistance(@target)

与える

----------------------
538404.100197555

(1 row(s) affected)

(近くの) ロンドンから (近くの) エディンバラまでは約 538 km です。

当然、最初にやるべき学習がたくさんありますが、それがわかれば、独自の Haversine 計算を実装するよりもはるかに簡単です。さらに、多くの機能を利用できます。


既存のデータ構造を保持したい場合でも、次のメソッドを使用して適切なインスタンスをSTDistance構築することにより、 を使用できます。geographyPoint

DECLARE @orig_lat DECIMAL(12, 9)
DECLARE @orig_lng DECIMAL(12, 9)
SET @orig_lat=53.381538 set @orig_lng=-1.463526

DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326);

SELECT *,
    @orig.STDistance(geography::Point(dest.Latitude, dest.Longitude, 4326)) 
       AS distance
--INTO #includeDistances
FROM #orig dest
于 2012-10-23T09:06:40.303 に答える
25

マイクロソフトが他のすべての回答者の頭脳に侵入し、可能な限り複雑なソリューションを作成させたようです。これは、追加の関数/宣言ステートメントを使用しない最も簡単な方法です。

SELECT geography::Point(LATITUDE_1, LONGITUDE_1, 4326).STDistance(geography::Point(LATITUDE_2, LONGITUDE_2, 4326))

LATITUDE_1, LONGITUDE_1,の代わりにデータを置き換えるだけですLATITUDE_2LONGITUDE_2例:

SELECT geography::Point(53.429108, -2.500953, 4326).STDistance(geography::Point(c.Latitude, c.Longitude, 4326))
from coordinates c
于 2018-04-10T13:25:04.937 に答える
4

SQL 2008 以降を使用しているので、GEOGRAPHYデータ型を確認することをお勧めします。SQL には、地理空間クエリのサポートが組み込まれています。

たとえば、テーブルに GEOGRAPHY タイプの列があり、座標の地理空間表現が取り込まれます (例については、上記の MSDN リファレンスを参照してください)。次に、このデータ型は、地理空間クエリのホスト全体を実行できるメソッドを公開します (たとえば、2 点間の距離を見つける)

于 2012-10-23T09:00:45.223 に答える