1. ホーム
  2. sql

[解決済み] 2点間の距離計算(緯度、経度)

2023-01-03 19:55:30

質問

地図上の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

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

あなたの結果がどのような測定単位であるかを述べてください。

解答方法を教えてください。

SQL Server 2008 を使用しているため、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キロメートルであることを教えてくれる。

当然ながら、最初にやるべきことはたくさんありますが、一度知ってしまえば、独自の Haversine 計算を実装するよりもはるかに簡単で、さらに多くの機能を得ることができます。


既存のデータ構造を保持したい場合は、まだ STDistance を構築することによって、適切な geography のインスタンスを作成します。 Point メソッドを使用しています。

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