2016-04-13 22 views
0

kullanarak Latitude & Boylam den gelen ilk Rulman hesaplayın, iki enlem ve boylam noktaları arasındaki mesafeyi hesaplamak için aşağıdaki çözüm var:SQL Server Stackoverflow üyelerinin yardımıyla gelen, son COGRAFYASINI

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] 

bir yolu var mı COĞRAFYA özelliğini kullanarak, aynı veri noktaları arasındaki ilk yatağı, bir başlık olarak görüntüleyerek hesaplamak için?

Teşekkür

Matthew Cevabınız ve bilgi

cevap

0

teşekkürler. Umarım bu çözüm rastlarsanız başkalarına faydalı olacaktır

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 

: Bir uğraşırken birkaç saat ve Google arama geniş miktarlarda sonra

, bana doğru sonuçlar veriyor çözüm aşağıda kullanıyorum de bu mesaj :)

Matta

0

İşte egzersiz bir skaler fonksiyon ve test noktaları bulunuyor. NB: Ben T-SQL bunu çok yavaş olmak kadar sona ererse, hem de o linkten CLR uygulamaları bir çift vardır kaynağını 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); 

bulundu.