2016-04-13 5 views
0

を使って緯度&経度から初期ベアリングを計算最近、StackOverflowのメンバーの助けから、私は2つの緯度と経度点間の距離を計算するには、次の解決策を得た:SQL Serverの - 地理

GEOGRAPHY::Point(DepartureAirportLatitude, DepartureAirportLongitude, 4326) 
     .STDistance(GEOGRAPHY::Point(ArrivalAirportLatitude, ArrivalAirportLongitude, 4326)) AS [Default], 

     GEOGRAPHY::Point(DepartureAirportLatitude, DepartureAirportLongitude, 4326) 
     .STDistance(GEOGRAPHY::Point(ArrivalAirportLatitude, ArrivalAirportLongitude, 4326))/1609.344 AS [Mi], 

     GEOGRAPHY::Point(DepartureAirportLatitude, DepartureAirportLongitude, 4326) 
     .STDistance(GEOGRAPHY::Point(ArrivalAirportLatitude, ArrivalAirportLongitude, 4326))/1000 AS [Km] 

方法はありますGEOGRAPHY機能を使用して、同じデータポイント間の初期ベアリングを計算し、見出しとして表示しますか?

おかげ

マシューお返事や情報について

答えて

0

感謝。うまくいけば、この解決策は全体のつまずき他の人に有用であろう

DECLARE @Pi AS FLOAT 
DECLARE @D2R AS FLOAT 

SET @Pi = '3.14159265358979' 
SET @D2R = @Pi/180.0; 


PICalculation AS 
(
    SELECT FlightNo, DepartureAirportIATA, ArrivalAirportIATA, 

     @D2R * DepartureAirportLatitude AS [DepartureAirportLatitude], @D2R * DepartureAirportLongitude AS [DepartureAirportLongitude], 
     @D2R * ArrivalAirportLatitude AS [ArrivalAirportLatitude], @D2R * ArrivalAirportLongitude AS [ArrivalAirportLongitude] 

    FROM RawData  
), 

RadiansCalculation AS 
(
    SELECT FlightNo, DepartureAirportIATA, ArrivalAirportIATA, 

      Radians(ArrivalAirportLatitude - DepartureAirportLatitude) AS [DLat], 
      Radians(ArrivalAirportLongitude - DepartureAirportLongitude) AS [DLon], 
      Radians(DepartureAirportLatitude) AS [RLat1], 
      Radians(ArrivalAirportLatitude) AS [RLat2] 

    FROM PICalculation 
), 

XYCalculation AS 
(
    SELECT FlightNo, DepartureAirportIATA, ArrivalAirportIATA, 

     SIN(DLon)*COS(RLat2) AS [Y], 
     COS(RLat1)*SIN(RLat2)-SIN(RLat1)*COS(RLat2)*COS(DLon) AS [X] 

    FROM RadiansCalculation 
), 

HeadingCalculation AS 
(
    SELECT FlightNo, DepartureAirportIATA, ArrivalAirportIATA, 

     CASE WHEN X = 0 AND Y = 0 THEN 0 
      ELSE CAST((DEGREES(ATN2(Y,X)) + 360) AS DECIMAL(5,1)) % 360 
     END AS [InitialBearing] 

    FROM XYCalculation 
) 

SELECT * 
FROM DataJoin 

:遊んでの数時間とGoogle検索の大規模な量の後

は、私は私に正しい結果を与えている、以下のソリューションを使用していますこのポストにも:)

マシュー

0

は、ここでそれを行使スカラー関数およびテストポイントです。 NB:私はhere

CREATE FUNCTION dbo.Bearing (
    @point1 geography, 
    @point2 geography ) 
RETURNS float 
AS 
BEGIN 
    DECLARE @Bearing decimal(18,15) 
    DECLARE @Lat1 float = Radians(@point1.Lat) 
    DECLARE @Lat2 float = Radians(@point2.Lat) 
    DECLARE @dLon float = Radians(@point2.Long - @point1.Long) 
    IF (@point1.STEquals(@point2) = 1) 
    SET @Bearing = NULL 
    ELSE 
    SET @Bearing = ATN2(
     sin(@dLon)*cos(@Lat2), 
    (cos(@Lat1)*sin(@Lat2)) - (sin(@Lat1)*cos(@Lat2)*cos(@dLon)) 
    ) 
    SET @Bearing = (Degrees(@Bearing) + 360) % 360 
    RETURN @Bearing 
END 
GO 

DECLARE @g GEOGRAPHY = GEOGRAPHY::Point(43, 43, 4326); 
DECLARE @g1 GEOGRAPHY = GEOGRAPHY::Point(42, 43, 4326); 
DECLARE @g2 GEOGRAPHY = GEOGRAPHY::Point(44, 43, 4326); 
DECLARE @g3 GEOGRAPHY = GEOGRAPHY::Point(43, 42, 4326); 
DECLARE @g4 GEOGRAPHY = GEOGRAPHY::Point(43, 44, 4326); 

SELECT dbo.[Bearing](@g, @g1), 
    [dbo].[Bearing](@g, @g2), 
    [dbo].[Bearing](@g, @g3), 
    [dbo].[Bearing](@g, @g4); 

源を発見したT-SQLでこれを行うことは非常に遅いなってしまう場合は、CLRの実装のカップルは、同様にそのリンクです。

関連する問題