緯度と経度を使用して2点間の距離を見つける方法
SOURCE_AIRPORT列とDESTINATION_AIRPORT列があり、飛行機が一方から他方に到達するためにたどる特定のルートを説明するROUTESテーブルがあります。
空港の地理的位置を説明するLATITUDE列とLONGITUDE列を持つAIRPORTSテーブルがあります。
ルートテーブルではSOURCE_AIRPORT_IDとDESTINATION_AIRPORT_ID、空港テーブルではIATA(ロンドンヒースローのLHRなどの空港を表す3文字のコード)という列を使用して、2つのテーブルを結合できます。
私の質問は、このすべての情報を使用してSQLクエリを記述し、たとえば、LHRなどの特定の空港からの最長ルートを見つけるにはどうすればよいかということです。
2つのテーブルを結合する必要があると思います。ルートテーブルの、出発地の空港がLHRであるすべての行について、目的地の空港の緯度と経度を調べ、LHRからの距離を計算し、「」というフィールドとして保存します。距離」をクリックし、最初に最も高い距離でデータを並べ替えます。しかし、SQL構文に関しては、私は途方に暮れています。
回答
これはおそらくMathematicsStack Exchangeにとってより良い質問だったでしょうが、ここでいくつかの洞察を提供します。あなたが三角法に比較的慣れているなら、私はあなたがこのリソースを与えられた実装を理解できると確信しています:https://en.m.wikipedia.org/wiki/Haversine_formula。球の表面上の2点間の距離を、その表面を横切る距離の観点から計算しようとしています(直線ではなく、地球を移動することはできません)。
このページには、次の式が表示されます。 https://wikimedia.org/api/rest_v1/media/math/render/svg/a65dbbde43ff45bacd2505fcf32b44fc7dcd8cc0
ここで、
•φ1、φ2はポイント1の緯度とポイント2の緯度(ラジアン)です
。•λ1、λ2はポイント1の経度とポイント2の経度(ラジアン)です。

データが度単位の場合、pi / 180を掛けることでラジアンに簡単に変換できます
2点間の距離を計算するための大円距離と呼ばれる式があります。おそらく、オペレーティングシステムのライブラリとしてロードできます。半正矢関数を忘れてください、私たちの惑星は完全な球体ではありません。この値を頻繁に使用する場合は、routes
テーブルに保存してください。
解決方法は90%くらいあると思います。あなたの答えを得るために、潜在的なSQLクエリに関するいくつかの詳細を追加します。したがって、距離を計算するために実行する必要のある2つのステップがあります。ステップ1は、ROUTESテーブルをAIRPORTSテーブルに結合して、ルート上のSOURCE_AIRPORTとDESTINATION_AIRPORTの両方の緯度/経度を取得することを含むテーブルを作成することです。これは次のようになります。
SELECT t1.*, CONVERT(FLOAT, t2.LATITUDE) AS SOURCE_LAT, CONVERT(FLOAT, t2.LONGITUDE) AS SOURCE_LONG, CONVERT(FLOAT, t3.LATITUDE) AS DEST_LAT, CONVERT(FLOAT, t3.LONGITUDE) AS DEST_LONG, 0.00 AS DISTANCE_CALC
INTO ROUTE_CALCULATIONS
FROM ROUTES t1 LEFT OUTER JOIN AIRPORTS t2 ON t1.SOURCE_AIRPORT_ID = t2.IATA
LEFT OUTER JOIN AIRPORTS t3 ON t1.DESTINATION_AIRPORT_ID = t3.IATA;
結果の出力は、すべてのROUTES列、SOURCE空港とDESTINATION空港の両方の経度/緯度、および値0のプレースホルダーDISTANCE_CALC列で構成されるROUTE_CALCULATIONSという名前の新しいテーブルを作成する必要があります。
ステップ2は距離を計算しています。これは、比較的簡単な計算と更新である必要があります。
UPDATE ROUTE_CALCULATIONS
SET DISTANCE_CALC = 2 * 3961 * asin(sqrt((sin(radians((DEST_LAT- SOURCE_LAT) / 2))) ^ 2 + cos(radians(SOURCE_LAT)) * cos(radians(DEST_LAT)) * (sin(radians((DEST_LONG- SOURCE_LONG) / 2))) ^ 2))
これにより、データに表示されるすべてのルートのDISTANCE_CALCテーブルで計算された距離が得られます。そこから、距離に関連するルート分析を実行できるようになります。